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

 eXeL@B —› Программирование —› Как изменить адрес выхода из call'a
Посл.ответ Сообщение

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

Создано: 21 октября 2007 13:49
· Личное сообщение · #1

задача такая
нада сделать так чтоб из call'a выйти не на следующую команду, а по адресу выхода +0Сh




Ранг: 303.7 (мудрец), 4thx
Активность: 0.190
Статус: Участник
tPORt Manager

Создано: 21 октября 2007 13:50
· Личное сообщение · #2

гы, в конце процедуры напиши код, который будет подменять в стеке адрес возврата и всё



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

Создано: 21 октября 2007 13:53
· Личное сообщение · #3

это я знаю, напиши как получить адрес выхода из функции




Ранг: 66.5 (постоянный)
Активность: 0.030
Статус: Участник
Повелитель ЗЛА

Создано: 21 октября 2007 13:58 · Поправил: ev1l_4
· Личное сообщение · #4

bitmaster пишет:
нада сделать так чтоб из call'a выйти не на следующую команду, а по адресу выхода +0Сh

add dword ptr [esp], 0Ch
db 83h, 04h, 24h, 0Ch



Ранг: 160.9 (ветеран), 1thx
Активность: 0.050
Статус: Участник

Создано: 21 октября 2007 14:28 · Поправил: Cigan
· Личное сообщение · #5

Перед ret добваить такой код:
pop eax
add eax,0ch
push eax

при условии что в eax ни чего не возвращается из функции




Ранг: 238.8 (наставник), 67thx
Активность: 0.20
Статус: Участник
CyberHunter

Создано: 21 октября 2007 16:00
· Личное сообщение · #6

продолжаем извращаться

LEA EAX,DWORD PTR SS:[ESP]
MOV EAX,DWORD PTR DS:[EAX]
ADD EAX,0Ch
PUSH EAX
XOR EAX,EAX
PUSH DWORD PTR FS:[EAX]
MOV DWORD PTR FS:[EAX],ESP
UD2

-----
Nulla aetas ad discendum sera





Ранг: 340.0 (мудрец), 22thx
Активность: 0.120
Статус: Участник
THETA

Создано: 21 октября 2007 19:54 · Поправил: FrenFolio
· Личное сообщение · #7

Самую простую реализацию предложил Cigan. Вместо eax подставишь регистр, который не используется в функции и все.
Если же нужно узнать bitmaster пишет: как получить адрес выхода из функции , то примерно так:
mov eax, [esp] - получаем адрес возврата из функции
mov dword ptr [AddrRET],eax - сохраняем в переменную AddrRET
add [AddrRET],0Ch - увеличиваем адрес возврата на 0Ch
add esp,04h - снимаем с верхушки стека 4 байта (старый адрес возврата)
push [AddrRET] - кладем в стек новый полученный (увеличенный на 0Ch)
retn - как ни в чем не бывало возвращаемся обратно


В принципе, должно работать,хотя я не проверял и мог где-то ошибиться.

Как вариант, зачем тебе заниматься таким извратом, и просто в отладчике не занопить инструкции сразу после этого CALL?

-----
Программист SkyNet





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

Создано: 21 октября 2007 20:09
· Личное сообщение · #8

ADD DWORD PTR [ESP],0C уже не в моде?




Ранг: 303.7 (мудрец), 4thx
Активность: 0.190
Статус: Участник
tPORt Manager

Создано: 21 октября 2007 20:33
· Личное сообщение · #9

Archer
+1




Ранг: 271.6 (наставник), 2thx
Активность: 0.30
Статус: Участник

Создано: 21 октября 2007 21:23 · Поправил: Spirit
· Личное сообщение · #10

FrenFolio пишет:
add [AddrRET],0Ch

А не проще написать так
Push [нужный адрес с учетом 0Ch]
Ret


Мое имхо, по голове не бить.

-----
iNTERNATiONAL CoDE CReW




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

Создано: 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)) ;
}




Ранг: 340.0 (мудрец), 22thx
Активность: 0.120
Статус: Участник
THETA

Создано: 22 октября 2007 06:11 · Поправил: FrenFolio
· Личное сообщение · #12

FrenFolio пишет:
мог где-то ошибиться.

Потороплся малость - ошибся. Нужно еще учесть регистр ebp, обычно сохраняемый в стеке в начале функции и передаваемые функции параметры. Вот реализация для функции с одним параметром DWORD:
mov eax, [esp+4] - получаем адрес возврата из функции, с учетом сдвига из-за push ebp
mov dword ptr [AddrRET],eax
add dword ptr [AddrRET],0Ch
add esp,08h - снимаем с верхушки стека 8 байт (старый адрес возврата+параметр функции)
push [AddrRET]
ret

Spirit пишет:
А не проще написать так
Push [нужный адрес с учетом 0Ch]
Ret

Да разницы особо никакой, по сути.
Проще всего, конечно же, обойтись одной строчкой
add dword ptr [esp], 0Ch - увеличиваем адрес возврата из функции на Ch
как написали ev1l_4 и Archer.

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

-----
Программист SkyNet





Ранг: 126.7 (ветеран)
Активность: 0.140
Статус: Участник
#CCh

Создано: 22 октября 2007 06:59
· Личное сообщение · #13

только не понятно.. есле это такой патч, то стопудово придецо тереть какие-то команды... сталобыть если места для кода нету, то придецо извращацо покруче.. вместо последней команды и RET пишем jmp на свой кодес и все, как всегда, там он доделывает все дела, потом можно просто джамп сделать, куда надо (тока add ESP, 04h не забыть)

-----
invoke OpenFire




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

Создано: 22 октября 2007 12:13
· Личное сообщение · #14

спасиба за помащь, тему можно закрыть!



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

Создано: 22 октября 2007 19:46 · Поправил: Kiev78
· Личное сообщение · #15

---



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

Создано: 22 октября 2007 22:02
· Личное сообщение · #16

ev1l_4 и Archer
+1



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

Создано: 22 октября 2007 22:07 · Поправил: Grom_
· Личное сообщение · #17

Kiev78 пишет:
Spirit пишет:
А не проще написать так
Push [нужный адрес с учетом 0Ch]
Ret
Так нельзя делать!!!

Действительно, по выходу(новому) из функции(1) у вас на верхушке стека адрес выхода(изначального) из функции(1) , и если опять(тут же) произойдет выход из функции(2), то вместо выхода из функции(2), вы получите выход(изначальный) из функции(1). Да и вооще если будет обращение к стеку. От сюда и вытекающие....

ЗЫ В принципе можно retn <n> перелететь старый адрес возврата из функции, но при обращении к стеку по адресам(база Регистр +/- смещение) - быдут проблемы, от старого адреса возврата придется избавиться.



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

Создано: 23 октября 2007 07:10 · Поправил: Grom_
· Личное сообщение · #18

AlexKlm пишет:
DWORD dwRetAdr=(DWORD)&iFistParameter - 4;
// dwRetAdr - это указатель на адрес возврата

почему это указатель на адрес возврата, разве это не указатель на команду, адрес переменной(iFistParameter) - 16 байт, а там может быть все что угодно!

ой!!!! *- 4 байта*

AlexKlmОбьясни что бы знать.



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

Создано: 23 октября 2007 09:31 · Поправил: Grom_
· Личное сообщение · #19

AlexKlm пишет:
// или тот что + 0x0C дальше
*((PDWORD)dwRetAdr )=*((PDWORD)(dwRetAdr + 0x0C)) ;

это алгоритм для выхода из функции дальше на 0х0С байт ????
а может *((PDWORD)dwRetAdr )+=0x0C ;

ЗЫ кстате прикольная штука, разобрался как это работает




Ранг: 340.0 (мудрец), 22thx
Активность: 0.120
Статус: Участник
THETA

Создано: 23 октября 2007 17:06
· Личное сообщение · #20

Grom_
да, е-мое , какая нафик разница.
Топик давно пора закрыть, - ТС кнопка внизу есть, если не догононяешь. Если продолжать дисскусию, то давно бы жил в коммунизме.

-----
Программист SkyNet



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


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