Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что делает этот код??? Т.е. какая его смысловая нагрузка? 
:(
    Опции темы
neutrino
Дата 4.6.2006, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Приветствую!

Вот код:
Код

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

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


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
rsm
Дата 4.6.2006, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: 3
Всего: 62



Код

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 байта;
Есть мнение, что появление этого кода есть либо результат оптимизации компилятором, либо замысел разработчика, имеющий цель и смысл только для него.

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

Это сообщение отредактировал(а) rsm - 4.6.2006, 18:37
PM MAIL   Вверх
DrLazy
Дата 4.6.2006, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 8.7.2005

Репутация: нет
Всего: нет



Все проще smile


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


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

Это сообщение отредактировал(а) DrLazy - 4.6.2006, 18:47
PM   Вверх
rsm
Дата 4.6.2006, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: 3
Всего: 62



Цитата(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
   

Это сообщение отредактировал(а) rsm - 4.6.2006, 19:04
PM MAIL   Вверх
DrLazy
Дата 4.6.2006, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 8.7.2005

Репутация: нет
Всего: нет



Ну в обем да smile провокация для таких как я. Внешне привычный и безобидный код функции делает совсем другое smile
Причем я так предполагаю что адрес вызова + 8 окажется гдето посередине инструкции. Опять таки защита от дизасма smile
 
PM   Вверх
neutrino
Дата 4.6.2006, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



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

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

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

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

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

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


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1603 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.