eXeL@B —› Вопросы новичков —› Delphi - Forms.TApplication.GetExeName() |
Посл.ответ | Сообщение |
|
Создано: 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:
Зарание спасибо за любую помощь. |
|
Создано: 07 мая 2016 17:26 · Личное сообщение · #2 Если верить Вам, если Вы ни в чём не ошиблись, не имея больше никаких других данных, кроме листинга функции, то посмотрите внимательно - 1) Code:
2) Code:
Переход не будет срабатывать, если вызов из 464250 и если 0040468C не меняет ESI. В Delphi есть некоторые функции, которые в качестве возвращаемого значения используют ESI вместо EAX. Я помню одну из таких - через ESI возвращался указатель на функцию... Вы б дали ссылочку на залитый на обменник файл, больше б можно было сказать. А так вижу на 80%, что Вы ошиблись. Добавлено спустя 2 минуты Так как Forms.TApplication.GetExeName() лишь получает имя исполняемого файла! Добавлено спустя 13 минут Хотя, если цель просто подсунуть имя другого файла, нормального - ... на вскидку, упражняясь в ассемблинге в уме, Вам надо по адресу 402AC8 внести такой патч для C:\original.exe Code:
Добавлено спустя 16 минут Code:
----- IZ.RU |
|
Создано: 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:
Call'ы, листинг которых я не указал в первом сообщении: Code:
Насколько я понял, ф-ция находит свободное место в памяти программы, пишет туда значение, а указатель на это место в памяти кладет на стек. Но тут у меня возникает трудность: я не понимаю каким образом программа понимает на какое именно место в стеке ф-ция должна положить указатель. Ведь в вышеприведенном листинге это EBP-44, а тут Code:
|
|
Создано: 08 мая 2016 00:11 · Личное сообщение · #4 Fereter пишет: но к сожалению предложенный Вами патч не сработал. Да, отвлёкся, и не заметил, что там же GetModuleHandleA() и следом передача полученного имени в 40477C() Fereter пишет: Но тут у меня возникает трудность: я не понимаю каким образом программа понимает на какое именно место в стеке ф-ция должна положить указатель. По тому, что не выкладываете код до вызова функции, предположу, что и сами туда не смотрите. А очень важно знать, какие аргументы передаются функции! В программах на дельфи под x86 любят их передавать по конвенции fastcall, это регистры ecx, edx, eax. Всё, что не влезает в 3 аргумента - через стек. В сейчас приведённых Вами данных полезная часть в Code:
Но что там - Вам никто гадать не будет! Fereter пишет: Зарание спасибо за любую помощь. -> DenCoder пишет: Вы б дали ссылочку на залитый на обменник файл, больше б можно было сказать. -> Fereter пишет: Call'ы, листинг которых я не указал в первом сообщении: Бесполезно! Вы плохо заботитесь, чтоб Вам помогли. Разбор чьих-то листингов с затяжным общением ... гадать по адресам функций... особо ни кому это не надо. Это мне было скучно, временами отвлекаюсь на что-то может быть интересное. Но и у меня в эти дни, не столько от праздников зависящие, не удалось уделить Вам полноценно то время, которое хотел... Добавлено спустя 9 минут Судя по магическим символам üÌŸ, там ни что иное как указатель на класс/структуру/метод или их таблицу - 0x2594975 (может быть и 0x2594981 - забыл какая кодировка в ольке). Неужели Вы думаете, что это кому-то что-то полезного даёт? Ещё вариант подмены имени екзешника - хук на GetModuleFileNameA() и GetCommandLine(). Но тут уже знания и навыки необходимы! Добавлено спустя 11 минут Саму CreateFile() проще хукнуть! ----- IZ.RU |
|
Создано: 08 мая 2016 02:21 · Личное сообщение · #5 |
|
Создано: 08 мая 2016 11:47 · Личное сообщение · #6 |
|
Создано: 08 мая 2016 12:16 · Личное сообщение · #7 DenCoder пишет: Судя по магическим символам üÌŸ, там ни что иное как указатель на класс/структуру/метод или их таблицу - 0x2594975 (может быть и 0x2594981 - забыл какая кодировка в ольке). Неужели Вы думаете, что это кому-то что-то полезного даёт? Ещё вариант подмены имени екзешника - хук на GetModuleFileNameA() и GetCommandLine(). Но тут уже знания и навыки необходимы! Да, там указатель на строку пути к файлу ( Code:
DenCoder пишет: Саму CreateFile() проще хукнуть! Может быть и так, но придется проверять имя файла, а не тупо его подменять, так как программы читает не только себя, но и свои настройки и еще море чего. Спасибо, что про fastcall рассказали. Попытаюсь самостоятельно продолжить разбор. Спасибо за всю помощь. |
|
Создано: 08 мая 2016 15:49 · Личное сообщение · #8 |
|
Создано: 08 мая 2016 18:23 · Личное сообщение · #9 нужно запатчить строку: Code:
менять call на пустое место и там с помощью плагина multiline ultimate assembler вписать код: Code:
но имхо проще запатчть првоверку ----- [nice coder and reverser] |
|
Создано: 09 мая 2016 02:02 · Поправил: dosprog · Личное сообщение · #10 |
eXeL@B —› Вопросы новичков —› Delphi - Forms.TApplication.GetExeName() |