Сейчас на форуме: (+5 невидимых) |
![]() |
eXeL@B —› Программирование —› Как изменить адрес выхода из call'a |
Посл.ответ | Сообщение |
|
Создано: 21 октября 2007 13:49 · Личное сообщение · #1 |
|
Создано: 21 октября 2007 13:50 · Личное сообщение · #2 |
|
Создано: 21 октября 2007 13:53 · Личное сообщение · #3 |
|
Создано: 21 октября 2007 13:58 · Поправил: ev1l_4 · Личное сообщение · #4 |
|
Создано: 21 октября 2007 14:28 · Поправил: Cigan · Личное сообщение · #5 |
|
Создано: 21 октября 2007 16:00 · Личное сообщение · #6 |
|
Создано: 21 октября 2007 19:54 · Поправил: FrenFolio · Личное сообщение · #7 Самую простую реализацию предложил Cigan. Вместо eax подставишь регистр, который не используется в функции и все. Если же нужно узнать bitmaster пишет: как получить адрес выхода из функции , то примерно так: mov eax, [esp] - получаем адрес возврата из функции
В принципе, должно работать,хотя я не проверял и мог где-то ошибиться. Как вариант, зачем тебе заниматься таким извратом, и просто в отладчике не занопить инструкции сразу после этого CALL? ----- Программист SkyNet ![]() |
|
Создано: 21 октября 2007 20:09 · Личное сообщение · #8 |
|
Создано: 21 октября 2007 20:33 · Личное сообщение · #9 |
|
Создано: 21 октября 2007 21:23 · Поправил: Spirit · Личное сообщение · #10 |
|
Создано: 21 октября 2007 23:57 · Поправил: AlexKlm · Личное сообщение · #11 Может пригодится, пример на СИ: void SomeFunc(int iFistParameter) { DWORD dwRetAdr=(DWORD)&iFistParameter - 4; // dwRetAdr - это указатель на адрес возврата // *((PDWORD)dwRetAdr ) - а это сам адрес возврата //Изменяем адрес возврата *((PDWORD)dwRetAdr )= мой адрес; // или тот что + 0x0C дальше *((PDWORD)dwRetAdr )=*((PDWORD)(dwRetAdr + 0x0C)) ; } ![]() |
|
Создано: 22 октября 2007 06:11 · Поправил: FrenFolio · Личное сообщение · #12 FrenFolio пишет: мог где-то ошибиться. Потороплся малость - ошибся. Нужно еще учесть регистр ebp, обычно сохраняемый в стеке в начале функции и передаваемые функции параметры. Вот реализация для функции с одним параметром DWORD: mov eax, [esp+4] - получаем адрес возврата из функции, с учетом сдвига из-за push ebp
Spirit пишет: А не проще написать так Push [нужный адрес с учетом 0Ch] Ret Да разницы особо никакой, по сути. ![]() Проще всего, конечно же, обойтись одной строчкой add dword ptr [esp], 0Ch - увеличиваем адрес возврата из функции на Ch
как написали ev1l_4 и Archer. ![]() А вообще теу уже можно и закрыть, если это единственный вопрос, то обсуждать тут больше нечего. ----- Программист SkyNet ![]() |
|
Создано: 22 октября 2007 06:59 · Личное сообщение · #13 только не понятно.. есле это такой патч, то стопудово придецо тереть какие-то команды... сталобыть если места для кода нету, то придецо извращацо покруче.. вместо последней команды и RET пишем jmp на свой кодес и все, как всегда, там он доделывает все дела, потом можно просто джамп сделать, куда надо (тока add ESP, 04h не забыть) ----- invoke OpenFire ![]() |
|
Создано: 22 октября 2007 12:13 · Личное сообщение · #14 |
|
Создано: 22 октября 2007 19:46 · Поправил: Kiev78 · Личное сообщение · #15 |
|
Создано: 22 октября 2007 22:02 · Личное сообщение · #16 |
|
Создано: 22 октября 2007 22:07 · Поправил: Grom_ · Личное сообщение · #17 Kiev78 пишет: Spirit пишет: А не проще написать так Push [нужный адрес с учетом 0Ch] Ret Так нельзя делать!!! Действительно, по выходу(новому) из функции(1) у вас на верхушке стека адрес выхода(изначального) из функции(1) , и если опять(тут же) произойдет выход из функции(2), то вместо выхода из функции(2), вы получите выход(изначальный) из функции(1). Да и вооще если будет обращение к стеку. От сюда и вытекающие.... ЗЫ В принципе можно retn <n> перелететь старый адрес возврата из функции, но при обращении к стеку по адресам(база Регистр +/- смещение) - быдут проблемы, от старого адреса возврата придется избавиться. ![]() |
|
Создано: 23 октября 2007 07:10 · Поправил: Grom_ · Личное сообщение · #18 AlexKlm пишет: DWORD dwRetAdr=(DWORD)&iFistParameter - 4; // dwRetAdr - это указатель на адрес возврата почему это указатель на адрес возврата, разве это не указатель на команду, адрес переменной(iFistParameter) - 16 байт, а там может быть все что угодно! ой!!!! *- 4 байта* AlexKlmОбьясни что бы знать. ![]() |
|
Создано: 23 октября 2007 09:31 · Поправил: Grom_ · Личное сообщение · #19 |
|
Создано: 23 октября 2007 17:06 · Личное сообщение · #20 |
![]() |
eXeL@B —› Программирование —› Как изменить адрес выхода из call'a |