Сейчас на форуме: cppasm, asfa (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Delphi - Forms.TApplication.GetExeName()
Посл.ответ Сообщение

Ранг: -0.7 (гость), 1thx
Активность: 0.010
Статус: Участник

Создано: 07 мая 2016 15:52
· Личное сообщение · #1

Есть программа на Delphi (Borland Delphi(7)[-]), накрытая UPX (UPX(2.92)[NRV,brute]). UPX я снял. Прога просит обновиться. Значит, есть проверка целостности. Поставил бряк на CreateFileA. Прога действительно пытается через него себя прочитать. Перезапустил прогу. Через DeDe нашел ф-цию Forms.TApplication.GetExeName(), поставил бряк на нее. Действительно сначала вызывается она, а потом читается файл. Хотел Forms.TApplication.GetExeName() пропатчить так, чтобы это ф-ция возвращала всегда "C:\original.exe", но в Delphi переменные, возвращаемые значения и все такое слишком сильно запутанно. Начало ф-ции Forms.TApplication.GetExeName() - 00464250. Тех, кто знает что в ней и как патчить, прошу рассказать мне, а еще лучше дать ссылочку или рассказать как и куда в Delphi ф-ции возвращают свои результаты. Прошу прощения, если местами путал ф-ции, методы и подпрограммы. Я на Delphi не пишу.

Если нужно, то вот листинг ф-ции Forms.TApplication.GetExeName():
Code:
  1. CPU Disasm
  2. Address   Hex dump          Command                                  Comments
  3. 00464250  /$  53            PUSH EBX
  4. 00464251  |.  8BDA          MOV EBX,EDX
  5. 00464253  |.  8BD3          MOV EDX,EBX
  6. 00464255  |.  33C0          XOR EAX,EAX
  7. 00464257  |.  E8 54E8F9FF   CALL 00402AB0
  8. 0046425C  |.  5B            POP EBX
  9. 0046425D  \.  C3            RETN
  10.  
  11. CPU Disasm
  12. Address   Hex dump          Command                                  Comments
  13. 00402AB0  /$  53            PUSH EBX
  14. 00402AB1  |.  56            PUSH ESI
  15. 00402AB2  |.  57            PUSH EDI
  16. 00402AB3  |.  81C4 F8FEFFFF ADD ESP,-108
  17. 00402AB9  |.  8BDA          MOV EBX,EDX
  18. 00402ABB  |.  8BF0          MOV ESI,EAX
  19. 00402ABD  |.  8BC3          MOV EAX,EBX
  20. 00402ABF  |.  E8 C81B0000   CALL 0040468C
  21. 00402AC4  |.  85F6          TEST ESI,ESI
  22. 00402AC6  |.  75 1E         JNZ SHORT 00402AE6
  23. 00402AC8  |.  68 05010000   PUSH 105                                 ; /Count = 261.
  24. 00402ACD  |.  8D4424 04     LEA EAX,[LOCAL.68]                       ; |
  25. 00402AD1  |.  50            PUSH EAX                                 ; |Buffer => OFFSET LOCAL.68
  26. 00402AD2  |.  6A 00         PUSH 0                                   ; |hModule = NULL
  27. 00402AD4  |.  E8 43E8FFFF   CALL <JMP.&KERNEL32.GetModuleFileNameA>  ; \KERNEL32.GetModuleFileNameA
  28. 00402AD9  |.  8BC8          MOV ECX,EAX
  29. 00402ADB  |.  8BD4          MOV EDX,ESP
  30. 00402ADD  |.  8BC3          MOV EAX,EBX
  31. 00402ADF  |.  E8 981C0000   CALL 0040477C                            ; [mm2.0040477C
  32. 00402AE4  |.  EB 1E         JMP SHORT 00402B04
  33. 00402AE6  |>  E8 19E8FFFF   CALL <JMP.&KERNEL32.GetCommandLineA>     ; [KERNEL32.GetCommandLineA
  34. 00402AEB  |.  8BF8          MOV EDI,EAX
  35. 00402AED  |>  8BD3          /MOV EDX,EBX
  36. 00402AEF  |.  8BC7          |MOV EAX,EDI
  37. 00402AF1  |.  E8 CEFEFFFF   |CALL 004029C4
  38. 00402AF6  |.  8BF8          |MOV EDI,EAX
  39. 00402AF8  |.  85F6          |TEST ESI,ESI
  40. 00402AFA  |.  74 08         |JZ SHORT 00402B04
  41. 00402AFC  |.  833B 00       |CMP DWORD PTR DS:[EBX],0
  42. 00402AFF  |.  74 03         |JE SHORT 00402B04
  43. 00402B01  |.  4E            |DEC ESI
  44. 00402B02  |.^ EB E9         \JMP SHORT 00402AED
  45. 00402B04  |>  81C4 08010000 ADD ESP,108
  46. 00402B0A  |.  5F            POP EDI
  47. 00402B0B  |.  5E            POP ESI
  48. 00402B0C  |.  5B            POP EBX
  49. 00402B0D  \.  C3            RETN


Зарание спасибо за любую помощь.




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

Создано: 07 мая 2016 17:26
· Личное сообщение · #2

Если верить Вам, если Вы ни в чём не ошиблись, не имея больше никаких других данных, кроме листинга функции, то посмотрите внимательно -
1)
Code:
  1. 00464255  |.  33C0          XOR EAX,EAX
  2. 00464257  |.  E8 54E8F9FF   CALL 00402AB0


2)
Code:
  1. 00402ABB  |.  8BF0          MOV ESI,EAX
  2. ...
  3. 00402AC4  |.  85F6          TEST ESI,ESI
  4. 00402AC6  |.  75 1E         JNZ SHORT 00402AE6


Переход не будет срабатывать, если вызов из 464250 и если 0040468C не меняет ESI. В Delphi есть некоторые функции, которые в качестве возвращаемого значения используют ESI вместо EAX. Я помню одну из таких - через ESI возвращался указатель на функцию...

Вы б дали ссылочку на залитый на обменник файл, больше б можно было сказать. А так вижу на 80%, что Вы ошиблись.

Добавлено спустя 2 минуты
Так как Forms.TApplication.GetExeName() лишь получает имя исполняемого файла!

Добавлено спустя 13 минут
Хотя, если цель просто подсунуть имя другого файла, нормального - ...

на вскидку, упражняясь в ассемблинге в уме, Вам надо по адресу 402AC8 внести такой патч для C:\original.exe
Code:
  1. b8 cf 2a 40 00 eb 35 43 3a 5c 6f 72 69 67 69 6e 61 6c 2e 65 79 65 00


Добавлено спустя 16 минут
Code:
  1. b8 cf 2a 40 00 eb 35 43 3a 5c 6f 72 69 67 69 6e 61 6c 2e 65 78 65 00


-----
IZ.RU




Ранг: -0.7 (гость), 1thx
Активность: 0.010
Статус: Участник

Создано: 07 мая 2016 19:53
· Личное сообщение · #3

Спасибо за попытку помочь, но к сожалению предложенный Вами патч не сработал. Программа крашнулась Нормальная работа ф-ции Forms.TApplication.GetExeName():
До:CPU - main thread, module mm2

EAX 029D1714
ECX 00000000
EDX 0019FD28
EBX 029E5C01
ESP 0019FD10
EBP 0019FD6C
ESI 029D79F8
EDI 01120F2C
EIP 004D34C3 mm2.004D34C3

C 0 ES 002B 32bit 0(FFFFFFFF)
P 1 CS 0023 32bit 0(FFFFFFFF)
A 0 SS 002B 32bit 0(FFFFFFFF)
Z 1 DS 002B 32bit 0(FFFFFFFF)
S 0 FS 0053 32bit 3BD000(FFF)
T 0 GS 002B 32bit 0(FFFFFFFF)
D 0
O 0 LastErr 00000000 ERROR_SUCCESS

CPU Stack
Address Value ASCII Comments
0019FD10 /029FCCCC ÌÌŸ ; ASCII "94D8E837BF49FED4AB6AE0816C3CC388"
0019FD14 |0019FD7C |ý ; Pointer to next SEH record
0019FD18 |004D3599 ™5M ; SE handler
0019FD1C |0019FD6C lý
0019FD20 |004355CC ÌUC ; Entry point
0019FD24 |029E5C20 \ž ; ASCII "|?C"
0019FD28 |00000000
0019FD2C |00000000
0019FD30 |029FCCCC ÌÌŸ ; ASCII "94D8E837BF49FED4AB6AE0816C3CC388"
0019FD34 |029F41C0 ÀAŸ ; ASCII "ST1000LM024 HN-M101MBBS2Y4J9EDA19479"
0019FD38 |00C02DD0 Ð-À
0019FD3C |3716F287 ‡ò7
0019FD40 |696BA17B {¡ki
0019FD44 |C0A31A78 x£À

После:CPU - main thread, module mm2

EAX 0019FD28
ECX 00000000
EDX 00000000
EBX 029E5C01
ESP 0019FD10
EBP 0019FD6C
ESI 029D79F8
EDI 01120F2C
EIP 004D34C8 mm2.004D34C8

C 0 ES 002B 32bit 0(FFFFFFFF)
P 0 CS 0023 32bit 0(FFFFFFFF)
A 0 SS 002B 32bit 0(FFFFFFFF)
Z 0 DS 002B 32bit 0(FFFFFFFF)
S 0 FS 0053 32bit 3BD000(FFF)
T 0 GS 002B 32bit 0(FFFFFFFF)
D 0
O 0 LastErr 00000000 ERROR_SUCCESS

CPU Stack
Address Value ASCII Comments
0019FD10 /029FCCCC ÌÌŸ ; ASCII "94D8E837BF49FED4AB6AE0816C3CC388"
0019FD14 |0019FD7C |ý ; Pointer to next SEH record
0019FD18 |004D3599 ™5M ; SE handler
0019FD1C |0019FD6C lý
0019FD20 |004355CC ÌUC ; Entry point
0019FD24 |029E5C20 \ž ; ASCII "|?C"
0019FD28 |029FCCFC üÌŸ
0019FD2C |00000000
0019FD30 |029FCCCC ÌÌŸ ; ASCII "94D8E837BF49FED4AB6AE0816C3CC388"
0019FD34 |029F41C0 ÀAŸ ; ASCII "ST1000LM024 HN-M101MBBS2Y4J9EDA19479"
0019FD38 |00C02DD0 Ð-À
0019FD3C |3716F287 ‡ò7
0019FD40 |696BA17B {¡ki
0019FD44 |C0A31A78 x£À

И потом значение используется так:
Code:
  1. CPU Disasm
  2. Address   Hex dump          Command                                  Comments
  3. 004D34C3  |.  E8 880DF9FF   CALL 00464250
  4. 004D34C8  |.  8B45 BC       MOV EAX,DWORD PTR SS:[EBP-44]


Call'ы, листинг которых я не указал в первом сообщении:
Code:
  1. CPU Disasm
  2. Address   Hex dump          Command                                  Comments
  3. 0040468C  /$  8B10          MOV EDX,DWORD PTR DS:[EAX]
  4. 0040468E  |.  85D2          TEST EDX,EDX
  5. 00404690  |.  74 1C         JZ SHORT 004046AE
  6. 00404692  |.  C700 00000000 MOV DWORD PTR DS:[EAX],0
  7. 00404698  |.  8B4A F8       MOV ECX,DWORD PTR DS:[EDX-8]
  8. 0040469B  |.  49            DEC ECX
  9. 0040469C  |.  7C 10         JL SHORT 004046AE
  10. 0040469E  |.  F0:FF4A F8    LOCK DEC DWORD PTR DS:[EDX-8]
  11. 004046A2  |.  75 0A         JNZ SHORT 004046AE
  12. 004046A4  |.  50            PUSH EAX
  13. 004046A5  |.  8D42 F8       LEA EAX,[EDX-8]
  14. 004046A8  |.  E8 EFE0FFFF   CALL 0040279C                            ; [mm2.0040279C
  15. 004046AD  |.  58            POP EAX
  16. 004046AE  \>  C3            RETN
  17.  
  18. CPU Disasm
  19. Address   Hex dump          Command                                  Comments
  20. 0040279C  /$  53            PUSH EBX                                 ; mm2.0040279C(guessed void)
  21. 0040279D  |.  85C0          TEST EAX,EAX
  22. 0040279F  |.  74 15         JZ SHORT 004027B6
  23. 004027A1  |.  FF15 44604D00 CALL DWORD PTR DS:[4D6044]
  24. 004027A7  |.  8BD8          MOV EBX,EAX
  25. 004027A9  |.  85DB          TEST EBX,EBX
  26. 004027AB  |.  74 0B         JZ SHORT 004027B8
  27. 004027AD  |.  B0 02         MOV AL,2
  28. 004027AF  |.  E8 24010000   CALL 004028D8
  29. 004027B4  |.  EB 02         JMP SHORT 004027B8
  30. 004027B6  |>  33DB          XOR EBX,EBX
  31. 004027B8  |>  8BC3          MOV EAX,EBX
  32. 004027BA  |.  5B            POP EBX
  33. 004027BB  \.  C3            RETN
  34.  
  35. CPU Disasm
  36. Address   Hex dump          Command                                  Comments
  37. 004028D8  |$ >83E0 7F       AND EAX,0000007F
  38. 004028DB  |. |8B1424        MOV EDX,DWORD PTR SS:[ARG.RETADDR]
  39. 004028DE  \.^|E9 A9FFFFFF   JMP 0040288C
  40. CPU Disasm
  41. Address   Hex dump          Command                                  Comments
  42. 0040288C  /> /53            PUSH EBX
  43. 0040288D  |. |56            PUSH ESI
  44. 0040288E  |. |8BF2          MOV ESI,EDX
  45. 00402890  |. |8BD8          MOV EBX,EAX
  46. 00402892  |. |80E3 7F       AND BL,7F
  47. 00402895  |. |833D 08C04D00 CMP DWORD PTR DS:[4DC008],0              ; Entry point
  48. 0040289C  |. |74 0A         JE SHORT 004028A8
  49. 0040289E  |. |8BD6          MOV EDX,ESI
  50. 004028A0  |. |8BC3          MOV EAX,EBX
  51. 004028A2  |. |FF15 08C04D00 CALL DWORD PTR DS:[4DC008]
  52. 004028A8  |> |84DB          TEST BL,BL
  53. 004028AA  |. |75 0D         JNZ SHORT 004028B9
  54. 004028AC  |. |E8 2F410000   CALL 004069E0                            ; [mm2.004069E0
  55. 004028B1  |. |8B98 04000000 MOV EBX,DWORD PTR DS:[EAX+4]
  56. 004028B7  |. |EB 0F         JMP SHORT 004028C8
  57. 004028B9  |> |80FB 18       CMP BL,18
  58. 004028BC  |. |77 0A         JA SHORT 004028C8
  59. 004028BE  |. |33C0          XOR EAX,EAX
  60. 004028C0  |. |8AC3          MOV AL,BL
  61. 004028C2  |. |8A98 4C604D00 MOV BL,BYTE PTR DS:[EAX+4D604C]
  62. 004028C8  |> |33C0          XOR EAX,EAX
  63. 004028CA  |. |8AC3          MOV AL,BL
  64. 004028CC  |. |8BD6          MOV EDX,ESI
  65. 004028CE  |. |E8 ADFFFFFF   CALL 00402880
  66. 004028D3  |. |5E            POP ESI
  67. 004028D4  |. |5B            POP EBX
  68. 004028D5  |. |C3            RETN
  69.  
  70. CPU Disasm
  71. Address   Hex dump          Command                                  Comments
  72. 0040477C  /$ /53            PUSH EBX                                 ; mm2.0040477C(guessed void)
  73. 0040477D  |. |56            PUSH ESI
  74. 0040477E  |. |57            PUSH EDI
  75. 0040477F  |. |89C3          MOV EBX,EAX
  76. 00404781  |. |89D6          MOV ESI,EDX
  77. 00404783  |. |89CF          MOV EDI,ECX
  78. 00404785  |. |89F8          MOV EAX,EDI
  79. 00404787  |. |E8 C4FFFFFF   CALL 00404750                            ; [mm2.00404750
  80. 0040478C  |. |89F9          MOV ECX,EDI
  81. 0040478E  |. |89C7          MOV EDI,EAX
  82. 00404790  |. |85F6          TEST ESI,ESI
  83. 00404792  |. |74 09         JZ SHORT 0040479D
  84. 00404794  |. |89C2          MOV EDX,EAX
  85. 00404796  |. |89F0          MOV EAX,ESI
  86. 00404798  |. |E8 E7E1FFFF   CALL 00402984
  87. 0040479D  |> |89D8          MOV EAX,EBX
  88. 0040479F  |. |E8 E8FEFFFF   CALL 0040468C
  89. 004047A4  |. |893B          MOV DWORD PTR DS:[EBX],EDI
  90. 004047A6  |. |5F            POP EDI
  91. 004047A7  |. |5E            POP ESI
  92. 004047A8  |. |5B            POP EBX
  93. 004047A9  \. |C3            RETN
  94. 00404750

Насколько я понял, ф-ция находит свободное место в памяти программы, пишет туда значение, а указатель на это место в памяти кладет на стек. Но тут у меня возникает трудность: я не понимаю каким образом программа понимает на какое именно место в стеке ф-ция должна положить указатель. Ведь в вышеприведенном листинге это EBP-44, а тут
Code:
  1. CPU Disasm
  2. Address   Hex dump          Command                                  Comments
  3. 004D4CE6  |.  E8 65F5F8FF   CALL 00464250
  4. 004D4CEB  |.  8B45 E4       MOV EAX,DWORD PTR SS:[LOCAL.7]
EBP-1C.




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

Создано: 08 мая 2016 00:11
· Личное сообщение · #4

Fereter пишет:
но к сожалению предложенный Вами патч не сработал.

Да, отвлёкся, и не заметил, что там же GetModuleHandleA() и следом передача полученного имени в 40477C()

Fereter пишет:
Но тут у меня возникает трудность: я не понимаю каким образом программа понимает на какое именно место в стеке ф-ция должна положить указатель.

По тому, что не выкладываете код до вызова функции, предположу, что и сами туда не смотрите. А очень важно знать, какие аргументы передаются функции! В программах на дельфи под x86 любят их передавать по конвенции fastcall, это регистры ecx, edx, eax. Всё, что не влезает в 3 аргумента - через стек.

В сейчас приведённых Вами данных полезная часть в
Code:
  1. До:CPU - main thread, module mm2
  2. EDX 0019FD28
  3. CPU Stack
  4. 0019FD28 |00000000
  5.  
  6. После:CPU - main thread, module mm2
  7. EAX 0019FD28
  8. 0019FD28 |029FCCFC &#252;&#204;&#376;


Но что там - Вам никто гадать не будет!

Fereter пишет:
Зарание спасибо за любую помощь.

->
DenCoder пишет:
Вы б дали ссылочку на залитый на обменник файл, больше б можно было сказать.

->
Fereter пишет:
Call'ы, листинг которых я не указал в первом сообщении:

Бесполезно! Вы плохо заботитесь, чтоб Вам помогли. Разбор чьих-то листингов с затяжным общением ... гадать по адресам функций... особо ни кому это не надо. Это мне было скучно, временами отвлекаюсь на что-то может быть интересное. Но и у меня в эти дни, не столько от праздников зависящие, не удалось уделить Вам полноценно то время, которое хотел...

Добавлено спустя 9 минут
Судя по магическим символам üÌŸ, там ни что иное как указатель на класс/структуру/метод или их таблицу - 0x2594975 (может быть и 0x2594981 - забыл какая кодировка в ольке). Неужели Вы думаете, что это кому-то что-то полезного даёт?

Ещё вариант подмены имени екзешника - хук на GetModuleFileNameA() и GetCommandLine(). Но тут уже знания и навыки необходимы!

Добавлено спустя 11 минут
Саму CreateFile() проще хукнуть!

-----
IZ.RU




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

Создано: 08 мая 2016 02:21
· Личное сообщение · #5

DenCoder пишет:
Это мне было скучно, временами отвлекаюсь на что-то может быть интересное.


..DenCoder добрая душа..




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

Создано: 08 мая 2016 11:47
· Личное сообщение · #6

DenCoder пишет:
Судя по магическим символам üÌŸ, там ни что иное как указатель на класс/структуру/метод или их таблицу - 0x2594975 (может быть и 0x2594981 - забыл какая кодировка в ольке)

Тут наврал - тоже было скучно

-----
IZ.RU




Ранг: -0.7 (гость), 1thx
Активность: 0.010
Статус: Участник

Создано: 08 мая 2016 12:16
· Личное сообщение · #7

DenCoder пишет:
Судя по магическим символам üÌŸ, там ни что иное как указатель на класс/структуру/метод или их таблицу - 0x2594975 (может быть и 0x2594981 - забыл какая кодировка в ольке). Неужели Вы думаете, что это кому-то что-то полезного даёт?

Ещё вариант подмены имени екзешника - хук на GetModuleFileNameA() и GetCommandLine(). Но тут уже знания и навыки необходимы!

Да, там указатель на строку пути к файлу (
Code:
  1. CPU Dump
  2. Address   Hex dump                                         ASCII
  3. 028ACCFC  43 3A 5C 55|73 65 72 73|5C 41 6E 64|72 65 79 5C| C:\Users\Andrey\
). Хуки на GetModuleFileNameA() и GetCommandLine() -- хорошая идея на случай, если не удастся пропатчить Forms.TApplication.GetExeName().
DenCoder пишет:
Саму CreateFile() проще хукнуть!

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

Спасибо, что про fastcall рассказали. Попытаюсь самостоятельно продолжить разбор. Спасибо за всю помощь.




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

Создано: 08 мая 2016 15:49
· Личное сообщение · #8

Fereter пишет:
Может быть и так, но придется проверять имя файла, а не тупо его подменять

без базара )

-----
IZ.RU





Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 08 мая 2016 18:23
· Личное сообщение · #9

нужно запатчить строку:
Code:
  1. 00402AD4  |.  E8 43E8FFFF   CALL <JMP.&KERNEL32.GetModuleFileNameA>

менять call на пустое место и там с помощью плагина multiline ultimate assembler вписать код:
Code:
  1.          jmp @start
  2.          
  3.          @newPath:
  4.          "C:\file.exe\0" ; первый слеш двойной тут
  5.  
  6.          @start:
  7.          push esi
  8.          push edi
  9.          mov edi,eax
  10.          mov esi,@newPath
  11.          mov eax,0Bh ; длина новой строки
  12.          lea ecx,[eax+1]
  13.          repne movsb
  14.          pop edi
  15.          pop esi
  16.     
  17.          ret 0Ch

но имхо проще запатчть првоверку

-----
[nice coder and reverser]




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

Создано: 09 мая 2016 02:02 · Поправил: dosprog
· Личное сообщение · #10

Hellspawn пишет:
@newPath:
"C:\file.exe\0" ; первый слеш двойной тут


@newPath:
"file.exe\0"

- И класть его рядом (хотя, может и не работать, если текущий каталог не тот, откуда запущена программа).
Но это извращение, да




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


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