Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Что делает этот код???


Автор: neutrino 4.6.2006, 17:58
Приветствую!

Вот код:
Код

PUSH EBP
MOV EBP,ESP
PUSH ESI
MOV ESI,4[EBP]
MOV EAX,[ESI]
ADD EAX,4[ESI]
ADD ESI,8
MOV 4[EBP],ESI
POP ESI
POP EBP
RET

В чем смысл этого кода? И если он есть, то как эту процедуру вызывать (имеется в виду какие действия нужно выполнить до ее вызова)? 

Автор: rsm 4.6.2006, 18:35
Код

push ebp
mov ebp,esp
push esi

mov esi,[ebp+4] ; в esi адрес возврата из этой функции

mov eax,[esi] ; в eax 4 байта из памяти по адресу возврата (далее АВ)

add eax,[esi+4] ; добавим к eax 4 байта из памяти по АВ+4

add esi,8 ; добавим к esi 8

mov [ebp+4],esi ; изменим АВ на АВ + 8

pop esi
pop ebp
ret

Особого смысла в этом коде нет:
- возврат из функции происходит по адресу на 8 байт дальше оригинального адреса возврата;
- возвращаемое значение это лишь сумма байт, составляющих машинный код, расположенный по адресу возврата плюс следующие за ним 4 байта;
Есть мнение, что появление этого кода есть либо результат оптимизации компилятором, либо замысел разработчика, имеющий цель и смысл только для него.

Никаких особых условий по вызову нет - аргументов функция не имеет, локальных переменных в ней тоже нет. 

Автор: DrLazy 4.6.2006, 18:39
Все проще smile


int YourFunction( int *ptr )
{
  return *ptr++ + *ptr++;


Added:
Виноват, ошибся. вот если бы было 6[ebp] , тогда да....
 

Автор: rsm 4.6.2006, 19:00
Цитата(DrLazy)
вот если бы было 6[ebp] , тогда да....

И даже не 6, а 8. Потому что первый аргумент функции начинается с ebp+8.

neutrino, как вариант, функцию можно использовать для контроля целостности кода примерно так:
Код

call your_function ; вызов этой функции

nop ; начало контролируемых 8 байт кода
nop
nop
nop
nop
nop
nop
nop ; конец контролируемых байт

cmp eax,21212120 ; <- вот сюда вернется управление после вызова функции
je _some_addr
   

Автор: DrLazy 4.6.2006, 20:13
Ну в обем да smile провокация для таких как я. Внешне привычный и безобидный код функции делает совсем другое smile
Причем я так предполагаю что адрес вызова + 8 окажется гдето посередине инструкции. Опять таки защита от дизасма smile
 

Автор: neutrino 4.6.2006, 21:23
Спасибо всем за ответы! Не знал, что у нас в этом форуме так быстро стали реагировать smile

Цитата(rsm @  4.6.2006,  17:35 Найти цитируемый пост)
Особого смысла в этом коде нет:
- возврат из функции происходит по адресу на 8 байт дальше оригинального адреса возврата;
- возвращаемое значение это лишь сумма байт, составляющих машинный код, расположенный по адресу возврата плюс следующие за ним 4 байта;
Есть мнение, что появление этого кода есть либо результат оптимизации компилятором, либо замысел разработчика, имеющий цель и смысл только для него.

Никаких особых условий по вызову нет - аргументов функция не имеет, локальных переменных в ней тоже нет. 

Да, это я понимаю. Я вот ломал голову на кой черт это писать в программе...

Цитата(rsm @  4.6.2006,  18:00 Найти цитируемый пост)
neutrino, как вариант, функцию можно использовать для контроля целостности кода примерно так:

Вот, чего я ожидал. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)