Здравствуйте, меня интересует один вопрос: Может я что-то мимо глаз пропустил, но: Почему в статье http://www.wasm.ru/article.php?article=apihook_1 в приатаченном примере AdwareBox(http://www.wasm.ru/pub/21/files/adwarebox.rar) в функции SetHook в структуре JmpMbw типа far_jmp ставится $68: JmpMbw.PuhsOp := $68; JmpMbw.PushArg := @NewMessageBoxExW; JmpMbw.RetOp := $C3; То есть получается такой код: PUSH <адрес функции> RETN То есть адрес функции передается в стек, но переход по нему не происходит (происходит-то он происходит, но я не понял каким образом), да и начало функции выгляжит так: mov edi, edi push ebp mov ebp, esp (пролог обычный) да и тем более стоит команда возврата(RETN). Ведь по идее там должно стоять что-то типа CALL ($E8). ОБЪЯСНИТЕ МНЕ ПОЖАЛУЙСТА, ЛЮДИ ДОБРЫЕ, ПОЧЕМУ PUSH, А НЕ CALL. Заранее спасибо.
все просто. просто команды JMP/CALL используют относительную адресацию что не очень удобно. push помещает в стек адрес. действие рет заключается в считывании из стека значения и помещения его в EIP
Абсолютная адресация становится ненужным рудиментом в х64 (только mov использует полную размерность 64бит операнда). /про шелкодесы молчу/
Freeman +1, я не вижу никаких неудобств в том, чтобы лишний раз сложить три числа. asmfan а мы сейчас ведь, кажется, про x86
fod читал бы ты кстати лучше учебник. там понятнее расписано. про команды и какое они оказывают действие