можно конечно: Код (Text): push return_address push STD_INPUT_HANDLE jmp dword [GetStdHandle] можно заюзать вот так: Код (Text): stdcall _gethandle nop proc _gethandle push STD_INPUT_HANDLE jmp dword [GetStdHandle] ; после вызова вернёмся на nop endp
Avoidik А проверить? cpp_and_wasm Нету такой инструкции. И чем это лучше стандартного CALL DWORD PTR DS:[<&kernel32.GetStdHandle>] ?
А проверить? подумаешь описАлся Код (Text): push STD_INPUT_HANDLE push return_address jmp dword [GetStdHandle]
cpp_and_wasm А цель? По моему все современные ф-ции вызваются как: call dword[MessageBoxA] где MessageBoxA это уже готовый и поправленный адрес системным загрузчиком! Зачем извращаться то? Или уже есть готовый файл, который надо оптимизировать?
даже если бы команда push eip существовала, она бы здесь не работала, т.к. вернться ты должен не на текущую интсруцию, а не следующую т.о. экономии никакой нет, даже наоборот. т.к. вместо простого call ты должен делать push адрес_возврата/jmp
Извините, неправильно выразил свою мысль Я вот как-то на досуге делал кейген для крэкМИ и посмотрел скомпилированный вариант в OllyDbg. Можно ли сделать так чтобы, например, call GetStdHandle@4(1) не перепрыгивал на JMP DWORD PTR DS:[<&kernel32.GetStdHandle>](2)? А именно каким образом заменить (1) на (2)? Я пробовал по разному, но что-то никак не получается! Файлик прилагается... ПС: не пугайтесь отсутствием invoke
А можно ли обойтись безо всяких макросов? Как прописать это в сырце? Или это невозможно и без макроса не обойтись?
прописать в исходнике подобно EXTRN _imp__ExitProcess@4WORD ExitProcess TEXTEQU <_imp__ExitProcess@4> EXTRN _imp__MessageBoxA@16WORD MessageBox TEXTEQU <_imp__MessageBoxA@16> для каждой вызываемой функции, или сделать такие новые инклуды
Тогда я был прав - на сайте есть либы от НТ, подключением которых можно генерировать сразу вызовы API без переходов (хотя последние вроде экономят размер кода).
IceStudent Да, экономят, если функция вызывается в коде более н-ного количества раз. Только я уже забыл чему равно н. Зато прямой call [x] должен быть быстрее, чем call [jmp [x]]
Спасибо всем! Теперь работает без "заглушек". Только вот интересно: зачем в своей книге В.Ю.Пирогов (Assembler для Windows) использует при объявлении внешних Windows'ких функций тип near, например: EXTERN CreateWindowExA@48:NEAR ?