Сейчас на форуме: _MBK_ (+5 невидимых)

 eXeL@B —› Вопросы новичков —› Как можно поменять вывод окон
Посл.ответ Сообщение

Ранг: 1.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 05 ноября 2010 11:09 · Поправил: anvarfromkz
· Личное сообщение · #1

Всем привет.
Сделал тестовую программу на Delphi 7. Загрузил в Olly
Форма состоит из 2-х кнопок.
Button1 , Button2. Сделал при кликанье открывает дополнительное окно Form2.show и Form3.show соответсвенно кнопкам.
Code:
  1. 0044E2A2       8BC0               MOV EAX,EAX
  2. 0044E2A4       A1 58004500        MOV EAX,DWORD PTR DS:[450058]
  3. 0044E2A9    .  8B00               MOV EAX,DWORD PTR DS:[EAX]
  4. 0044E2AB    .  E8 CCAFFFFF        CALL 0044927C
  5. 0044E2B0    .  C3                 RET
  6.  
  7. 0044E2B1       8D40 00            LEA EAX,DWORD PTR DS:[EAX]
  8. 0044E2B4    .  A1 04FF4400        MOV EAX,DWORD PTR DS:[44FF04]
  9. 0044E2B9    .  8B00               MOV EAX,DWORD PTR DS:[EAX]
  10. 0044E2BB    .  E8 BCAFFFFF        CALL 0044927C
  11. 0044E2C0    .  C3                 RET


поменял значение

Code:
  1. MOV EAX,DWORD PTR DS:[450058]


во второй процедуре
Т.е. получается на 2 кнопки навесил показываение одной формы Form2.show

Code:
  1. 0044E2A2       8BC0               MOV EAX,EAX
  2. 0044E2A4       A1 58004500        MOV EAX,DWORD PTR DS:[450058]
  3. 0044E2A9    .  8B00               MOV EAX,DWORD PTR DS:[EAX]
  4. 0044E2AB    .  E8 CCAFFFFF        CALL 0044927C
  5. 0044E2B0    .  C3                 RET
  6.  
  7. 0044E2B1       8D40 00            LEA EAX,DWORD PTR DS:[EAX]
  8. 0044E2B4    .  A1 04FF4400        MOV EAX,DWORD PTR DS:[450058]
  9. 0044E2B9    .  8B00               MOV EAX,DWORD PTR DS:[EAX]
  10. 0044E2BB    .  E8 BCAFFFFF        CALL 0044927C
  11. 0044E2C0    .  C3                 RET


Как узнать значение вот этого параметра 450058 ? например если у меня есть окно-форма About.
Можно было бы просто найти строковые Form3 и заменить на Form2 но такого не нашел
Dede использоваль такой же код как и в Olly.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 05 ноября 2010 11:29
· Личное сообщение · #2

Формы со всеми своими элементами хранятся во внутренних замороченных структурах, смена 1 строки на другую ничего не даст, про внутренности дельфи можешь почитать в 3 статьях здесь на сайте от ред_плейта, кажется.
Ещё вариант-заюзать декомпиляторы, типа ДеДе, ИДР.




Ранг: 282.8 (наставник), 24thx
Активность: 0.260
Статус: Участник
win32.org.ru

Создано: 05 ноября 2010 14:07 · Поправил: Guru_eXe
· Личное сообщение · #3

Archer пишет:
Формы со всеми своими элементами хранятся во внутренних замороченных структурах, смена 1 строки на другую ничего не даст

он вроде и не об этом, в любом случае, если имея две кнопки с событиями Form2.show на одной кнопке и Form3.show на другой, а потом поменять аргументы в олли, то всё будет работать, другое дело, что учитывая формат записи:
Code:
  1. 0044E2A4       A1 58004500        MOV EAX,DWORD PTR DS:[450058]

делаем вывод, что это обычное статическое значение, которое не вычисляется, а хранится в явном виде. Аргумент, в данном случае, 450058, используется в проекте, в данном примере, два раза — непосредственно в событии онклик и криеитформ, при инициализации проекта.

Code:
  1.   Application.Initialize;
  2.   Application.CreateForm(TForm1, Form1);
  3.   Application.CreateForm(TForm2, Form2);
  4.   Application.CreateForm(TForm3, Form3);
  5.   Application.Run;

распарсив этот кусок, можно получит и аргументы. Собственно, все это действо начинает работать прямо с ЕП:
Code:
  1. (поскипано)
  2. Address   Hex dump            Command                                  Comments
  3. 0044E7AC  |.  A1 C4FF4400     MOV EAX,DWORD PTR DS:[44FFC4]
  4. 0044E7B1  |.  8B00            MOV EAX,DWORD PTR DS:[EAX]
  5. 0044E7B3  |.  E8 08E2FFFF     CALL 0044C9C0                            ; [Project1.0044C9C0 ; Application.Initialize
  6. 0044E7B8  |.  8B0D A0004500   MOV ECX,DWORD PTR DS:[4500A0]
  7. 0044E7BE  |.  A1 C4FF4400     MOV EAX,DWORD PTR DS:[44FFC4]
  8. 0044E7C3  |.  8B00            MOV EAX,DWORD PTR DS:[EAX]
  9. 0044E7C5  |.  8B15 74E34400   MOV EDX,DWORD PTR DS:[44E374]
  10. 0044E7CB  |.  E8 08E2FFFF     CALL 0044C9D8                            ; [Project1.0044C9D8 ; Application.CreateForm(TForm1, Form1)
  11. 0044E7D0  |.  8B0D D8004500   MOV ECX,DWORD PTR DS:[4500D8]
  12. 0044E7D6  |.  A1 C4FF4400     MOV EAX,DWORD PTR DS:[44FFC4]
  13. 0044E7DB  |.  8B00            MOV EAX,DWORD PTR DS:[EAX]
  14. 0044E7DD  |.  8B15 34E04400   MOV EDX,DWORD PTR DS:[44E034]
  15. 0044E7E3  |.  E8 F0E1FFFF     CALL 0044C9D8                            ; [Project1.0044C9D8 ; Application.CreateForm(TForm2, Form2)
  16. 0044E7E8  |.  8B0D 7CFF4400   MOV ECX,DWORD PTR DS:[44FF7C]
  17. 0044E7EE  |.  A1 C4FF4400     MOV EAX,DWORD PTR DS:[44FFC4]
  18. 0044E7F3  |.  8B00            MOV EAX,DWORD PTR DS:[EAX]
  19. 0044E7F5  |.  8B15 D4E14400   MOV EDX,DWORD PTR DS:[44E1D4]
  20. 0044E7FB  |.  E8 D8E1FFFF     CALL 0044C9D8                            ; [Project1.0044C9D8 ; Application.CreateForm(TForm3, Form3)
  21. 0044E800  |.  A1 C4FF4400     MOV EAX,DWORD PTR DS:[44FFC4]
  22. 0044E805  |.  8B00            MOV EAX,DWORD PTR DS:[EAX]
  23. 0044E807  |.  E8 4CE2FFFF     CALL 0044CA58                            ; [Project1.0044CA58 ;Application.Run

На примере:
Code:
  1. 0044E7D0  |.  8B0D D8004500   MOV ECX,DWORD PTR DS:[4500D8]
  2. 0044E7D6  |.  A1 C4FF4400     MOV EAX,DWORD PTR DS:[44FFC4]
  3. 0044E7DB  |.  8B00            MOV EAX,DWORD PTR DS:[EAX]
  4. 0044E7DD  |.  8B15 34E04400   MOV EDX,DWORD PTR DS:[44E034]

4500D8 — необходимый аргумент
44FFC4 — не знаю что
44E034 — тут вся информация по форме

Лучше, наверное, спросить у GPcH как оно все работает, но, наверное, DeDe начинает копать так, как я описал, то есть смотрит "инициализацию" из которой уже можно получить любую информацию.

Найти ОнКлик, с вызовом формы — очень легко, смотрим на CreateForm(TForm1, Form1) в олли и берем последний аргумент — 44E374, Контрл+Г и переходим на адрес 44E374, далее крутим вниз пропуская кучу "конструкций" и видим:
Code:
  1. CPU Disasm
  2. Address   Hex dump          Command                                  Comments
  3. 0044E4D8      13            DB 13                                    ; длина всей "конструкции"
  4. 0044E4D9      00            DB 00
  5. 0044E4DA   .  2CE54400      DD 0044E52C                              ; адрес события Button1Click
  6. 0044E4DE   .  0C            DB 0C                                    ; длина строки "Button1Click"
  7. 0044E4DF   .  42 75 74 74 6 ASCII "Button1Click"                     ; строка
  8. 0044E4EB      13            DB 13                                    ; всё аналогично
  9. 0044E4EC      00            DB 00
  10. 0044E4ED   .  3CE54400      DD 0044E53C
  11. 0044E4F1   .  0C            DB 0C
  12. 0044E4F2   .  42 75 74 74 6 ASCII "Button2Click"

А по адресу 0044E52C, знакомый код:
Code:
  1. CPU Disasm
  2. Address   Hex dump          Command                                  Comments
  3. 0044E52C      A1 D8004500   MOV EAX,DWORD PTR DS:[4500D8]            ; необходимый аргумент
  4. 0044E531  |.  8B00          MOV EAX,DWORD PTR DS:[EAX]
  5. 0044E533  |.  E8 E4AFFFFF   CALL 0044951C                            ; вызов
  6. 0044E538  \.  C3            RETN


-----
may all your PUSHes be POPed!



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


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