Сейчас на форуме: asfa, _MBK_, Adler, bartolomeo (+8 невидимых)

 eXeL@B —› Вопросы новичков —› Расчет статического адреса строки
Посл.ответ Сообщение

Ранг: 2.6 (гость)
Активность: 0.020
Статус: Участник

Создано: 28 августа 2012 16:34
· Личное сообщение · #1

Привет всем

Я за последнее время себя чуток поднатаскал уже на реверс-инженеринг, поэтому осмелился еще раз выложить вопрос данный.

Есть строка в программе, которая задается через WM_SETTEXT. Все попытки придти к источнику строки заканчивались на секции стека. При изменении данных стека изменялась и строка, что подтвердило правильность моих мыслей.

Но как строка оказывается в стеке? Чтобы я мог пропатчить ее и внести эти изменения в ехе.

Также известно, что он использует VirtualAlloc для выделения себе огромного (скажем так) размера памяти. Вполне вероятно что там и находятся строки, но откуда он их берет?

Теперь приведу фрагменты кода:

1) Процедура, которая транслирует сообщения и изменяет текст формы:
Code:
  1. 00697618  /$  55            PUSH EBP
  2. 00697619  |.  8BEC          MOV EBP,ESP
  3. 0069761B  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]
  4. 0069761E  |.  8B40 F8       MOV EAX,DWORD PTR DS:[EAX-8]
  5. 00697621  |.  8B40 08       MOV EAX,DWORD PTR DS:[EAX+8]
  6. 00697624  |.  50            PUSH EAX                                 ; /lParam
  7. 00697625  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]             ; |
  8. 00697628  |.  8B40 F8       MOV EAX,DWORD PTR DS:[EAX-8]             ; |
  9. 0069762B  |.  8B40 04       MOV EAX,DWORD PTR DS:[EAX+4]             ; |
  10. 0069762E  |.  50            PUSH EAX                                 ; |wParam
  11. 0069762F  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]             ; |
  12. 00697632  |.  8B40 F8       MOV EAX,DWORD PTR DS:[EAX-8]             ; |
  13. 00697635  |.  8B00          MOV EAX,DWORD PTR DS:[EAX]               ; |
  14. 00697637  |.  50            PUSH EAX                                 ; |Message
  15. 00697638  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]             ; |
  16. 0069763B  |.  8B40 FC       MOV EAX,DWORD PTR DS:[EAX-4]             ; |
  17. 0069763E  |.  8B40 30       MOV EAX,DWORD PTR DS:[EAX+30]            ; |
  18. 00697641  |.  50            PUSH EAX                                 ; |hWnd
  19. 00697642  |.  E8 EB8D1500   CALL <JMP.&USER32.DefWindowProcA>        ; \DefWindowProcA
  20. 00697647  |.  8B55 08       MOV EDX,DWORD PTR SS:[EBP+8]
  21. 0069764A  |.  8B52 F8       MOV EDX,DWORD PTR DS:[EDX-8]
  22. 0069764D  |.  8942 0C       MOV DWORD PTR DS:[EDX+C],EAX
  23. 00697650  |.  5D            POP EBP
  24. 00697651  \.  C3            RETN

В lparam хранятся строки которые задаются элементу.
В принципе на этом участке кода сейчас все и сосредоточено.



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 28 августа 2012 16:44
· Личное сообщение · #2

Ставь бряк на запись, например первого символа строки перезагрузи прогу и смотри откуда строка туда попадает. По приведенному коду даже с кофейной гущей тебе ни кто не скажет откуда там взялась строка.



Ранг: 2.6 (гость)
Активность: 0.020
Статус: Участник

Создано: 28 августа 2012 16:49
· Личное сообщение · #3

Vovan666, ставил уже бряк. Попадаю в разные секции программы. Дело в том, что я могу поставить бряк только на стек, куда он загружает эту строку. В итоге попадаю в ситуацию, что в этот стек грузит со стека по другому адресу....маразм какой-то



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 28 августа 2012 16:53
· Личное сообщение · #4

Попробуй найти SendMessage который посылает установку текста. Или может строка грузится через LoadString



Ранг: 2.6 (гость)
Активность: 0.020
Статус: Участник

Создано: 28 августа 2012 16:56
· Личное сообщение · #5

Veliant, нашел и отследил. Сообщение WM_SETTEXT посылает. Я на него Conditional Breakpoint поставил.
LoadString ща поищу. Может где вызов и происходит.



Ранг: 2.6 (гость)
Активность: 0.020
Статус: Участник

Создано: 28 августа 2012 17:36
· Личное сообщение · #6

LoadString ничего интересного не дал...



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 28 августа 2012 18:11
· Личное сообщение · #7

Выложи чтоль прогу и скажи какая строка тебя интересует, а о так гадать можно долго.



Ранг: 2.6 (гость)
Активность: 0.020
Статус: Участник

Создано: 28 августа 2012 18:38
· Личное сообщение · #8

Vovan666, уже пытались и не раз вот таким "выложи"
Еще никто не смог пропатчить его. У меня были мысли по поводу лоадера, который будет просто посылать аналогичные сообщения хэндлам нужным этого приложения с измененным текстом. Пока самый разумный вариант.



Ранг: 65.3 (постоянный), 10thx
Активность: 0.020
Статус: Участник

Создано: 28 августа 2012 20:33
· Личное сообщение · #9

ghaiklor
Строка берется из какого-то объекта, который передается на стеке. Или из массива, так не угадаешь.
Потом вызывается DefWindowProc, то, что она вернула, пишется обратно в объект. Больше тут ничего не происходит.
Иногда тут проходит WM_SETTEXT, иногда не он, но логики тут никакой, связанной со строкой, нет. Ищи, где делается SendMessage с WM_SETTEXT.

И да, гадать по куску кода, который ни о чем, бесполезно. Выкладывай прожку.

| Сообщение посчитали полезным: Hexxx


Ранг: 275.9 (наставник), 340thx
Активность: 0.22=0.22
Статус: Участник
RBC

Создано: 28 августа 2012 20:35
· Личное сообщение · #10

копирайты перебить хочет

-----
Array[Login..Logout] of Life




Ранг: 2.6 (гость)
Активность: 0.020
Статус: Участник

Создано: 28 августа 2012 20:46
· Личное сообщение · #11

tomac, спасибо за подсказку - так еще не пробовал. Выложить прогу не могу
Kindly, я делаю локализацию для программы под заказ. Копирайты не трогаю, просто на другой язык все перевожу - без паранойи, господа



Ранг: 65.3 (постоянный), 10thx
Активность: 0.020
Статус: Участник

Создано: 28 августа 2012 21:31 · Поправил: tomac
· Личное сообщение · #12

ghaiklor
В ресурсах-то хоть смотрел?
И просто поиском строки по exe файлу.



Ранг: 2.6 (гость)
Активность: 0.020
Статус: Участник

Создано: 29 августа 2012 00:48
· Личное сообщение · #13

tomac, в ресурсах основная часть текста уже переведена, спасибо
Пришлось пофиксить две системы проверки на правильность файла для возможности изменения ресурсов. Но в итоге все норм переводится. А вот некоторые строки задаются в коде, а не в ресурсах. Поэтому я спрашиваю вот такие вещи



Ранг: 2.6 (гость)
Активность: 0.020
Статус: Участник

Создано: 29 августа 2012 14:17
· Личное сообщение · #14

Функция DefWindowProc вызывается оконной процедурой по умолчанию, чтобы обеспечить обработку по умолчанию любого сообщения окна, которые приложение не обрабатывает. Эта функция гарантирует то, что обрабатывается каждое сообщение. Функция DefWindowProc вызывается с теми же самыми параметрами, принятыми оконной процедурой.

Это что же означает. Что названия окон задается не программой, а системой? Потому что в ресурсах не было названия программы. Попросту говоря, мне нужно изменить Title приложения. Чтобы в панели задач и на главной форме отображалось переведенное название.



Ранг: 65.3 (постоянный), 10thx
Активность: 0.020
Статус: Участник

Создано: 29 августа 2012 17:01 · Поправил: tomac
· Личное сообщение · #15

ghaiklor
Функция DefWindowProc поменяет название заголовка с того, что было указано при CreateWindow или в ресурсах при создании DialogBox из ресурсов. При получении WM_SETTEXT.
То, что есть в этом коде, не интересно совершенно. Здесь никакая строка ни откуда не грузится. Она приходит в качестве одного из параметров в функцию. Параметры для функции приходят в оконную процедуру из сообщения при DispatchMessage. Сообщение приходит из GetMessage. В GetMessage оно появляется после того, как кто-то туда его отправит по SendMessage или PostMessage. Тебе надо смотреть, откуда посылается этот самый WM_SETTEXT. Кроме того, посмотри вызов CreateWindow, там один из параметров - заголовок окна.



Ранг: 2.6 (гость)
Активность: 0.020
Статус: Участник

Создано: 29 августа 2012 17:15
· Личное сообщение · #16

tomac, а как можно отследить "посыл" на WM_SETTEXT? Бряку то я поставил на этот месседж. Все бряки срабатывают на этом DefWindowProc.
А вот с CreateWindow я еще не пробовал. Сейчас поставлю бряки на импорт - посмотрим



Ранг: 2.6 (гость)
Активность: 0.020
Статус: Участник

Создано: 29 августа 2012 17:58 · Поправил: ghaiklor
· Личное сообщение · #17

Итак, вот такая ситуация. Две строки (одна в панели задач), а другая в главной форме. Первое сообщение:
Code:
  1. 0012FD4C   006EE448  /CALL to CreateWindowExA from GPS_Obje.006EE443
  2. 0012FD50   00000000  |ExtStyle = 0
  3. 0012FD54   00696B00  |Class = "TApplication"
  4. 0012FD58   01347AA8  |WindowName = ""
  5. 0012FD5C   84CA0000  |Style = WS_POPUP|WS_MINIMIZEBOX|WS_CLIPSIBLINGS|WS_SYSMENU|WS_CAPTION
  6. 0012FD60   00000280  |= 280 (640.)
  7. 0012FD64   00000190  |= 190 (400.)
  8. 0012FD68   00000000  |Width = 0
  9. 0012FD6C   00000000  |Height = 0
  10. 0012FD70   00000000  |hParent = NULL
  11. 0012FD74   00000000  |hMenu = NULL
  12. 0012FD78   00400000  |hInst = 00400000
  13. 0012FD7C   00000000  \lParam = NULL

И вот второе:
Code:
  1. 0012E128   006EE448  /CALL to CreateWindowExA from GPS_Obje.006EE443
  2. 0012E12C   00010000  |ExtStyle = WS_EX_CONTROLPARENT
  3. 0012E130   0012E20C  |Class = ""
  4. 0012E134   00000000  |WindowName = NULL
  5. 0012E138   06CF0000  |Style = WS_OVERLAPPED|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_SYSMENU|WS_THICKFRAME|WS_CAPTION
  6. 0012E13C   80000000  |= 80000000 (-2147483648.)
  7. 0012E140   80000000  |= 80000000 (-2147483648.)
  8. 0012E144   00000140  |Width = 140 (320.)
  9. 0012E148   000000F0  |Height = F0 (240.)
  10. 0012E14C   0051060A  |hParent = 0051060A ('',class='TApplication')
  11. 0012E150   00000000  |hMenu = NULL
  12. 0012E154   00400000  |hInst = 00400000
  13. 0012E158   00000000  \lParam = NULL

Из этого я смотрю и понимаю, что все-таки он его где-то меняет.
Сначала идет этот переименованный вроде, а потом чудом уже другой.
UPD:
И как выставить в ольке, чтобы он бряки запоминал после перезапуска? А то делал, а теперь не помню.



Ранг: 65.3 (постоянный), 10thx
Активность: 0.020
Статус: Участник

Создано: 29 августа 2012 23:09 · Поправил: tomac
· Личное сообщение · #18

ghaiklor
Слушай, это ж делфи. В ресурсах в RCData переименовал всё?

Ты пиши, что на что должно поменяться-то. Окно нельзя изменить вызовом CreateWindow[Ex]. Только создать новое.
Тебе какую строку надо изменить? "Gps object manager"? Тогда иди по адресу 006EE448, если это, конечно, адрес вызова апи. И смотри, откуда такое вызвали. В делфи это будет что-то в стиле TForm.Create(). Могут вызывать SetWindowText, это чтобы установить новый заголовок, она посылает WM_SETTEXT.

Про бряки не знаю, олю не использую.
UPD: давай переходить в ЛС, а то что-то ветка форума ICQ напоминает. Вряд ли это будет кому-то полезно в будущем.


 eXeL@B —› Вопросы новичков —› Расчет статического адреса строки
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати