![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 08.04.2009
Сообщений: 45
|
![]()
При создании EXE-шника компоновщик MASM во всех вызовах как CALL так и INVOKE делает им стандартный выход:
leave ret 04 Причём при вызове DLL входную часть прописывает: push esp mov ebp,esp ///////////// - код leave ret 04 А при вызове локального SUBа не прописывает. Идёт глюк по стёку. Вопрос: Как заставить MASM линковать только то, что я написал, без вышеуказанных входов и выходов CALLов.
После изучения ассемблера стал мозг зависать...
|
![]() |
![]() |
![]() |
#2 | ||
equ asm
Участник клуба
Регистрация: 02.05.2009
Сообщений: 1,605
|
![]() Цитата:
Цитата:
|
||
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 08.04.2009
Сообщений: 45
|
![]()
А как не оформлять, тогда как оформлять (это DLL!)
Там где написано invoke [function], начало и конец функции выглядят в дебаге так: push esp mov ebp,esp ///////////// - код leave ret 04 А там где CALL [соседняя метка]: ///////////// - код leave ret 04 EIP не восстанавливается куда нужно из-за leave
После изучения ассемблера стал мозг зависать...
|
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 23.04.2009
Сообщений: 346
|
![]()
оформить функцию просто как метку, локальные переменные высчитывать придется нецензурно вспоминая матерей создателей стека и интела
также посмотрите хорошую инструкцию enter -> leave ну и ret должен быть с циферкой в зависимости от количества аргументов с которыми вызывали функцию >При создании EXE-шника компоновщик MASM во всех вызовах как CALL >так и INVOKE делает им стандартный выход: >leave >ret 04 это неверно! ; вот малюсенький пример, показывающий пример вызова своей функции, в ней ;можно убрать enter и leave, и параметр передавать не в стеке, а в регистре.. ;вообщем посмотрите в отладчике-ничего сложного Код: Код:
Код:
Нет, ну правда..
Последний раз редактировалось Stilet; 25.08.2010 в 16:05. |
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 25.08.2010
Сообщений: 12
|
![]()
Или где-то так:
Код:
Последний раз редактировалось Stilet; 25.08.2010 в 16:05. |
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 08.04.2009
Сообщений: 45
|
![]()
Всем спaсибo (голосовать за репутацию не могу - не активен значок), вроде допёр, что надо делать...
И кстати (из моих личных изысканий) регистры EDI, ESI надо сохранять в каждой функции DLL, нето они(API) не будут вызываться VisualBasic'oм.
После изучения ассемблера стал мозг зависать...
|
![]() |
![]() |
![]() |
#7 | |||
Форумчанин
Регистрация: 09.03.2008
Сообщений: 127
|
![]()
Не понятно, зачем так заморачиватся:
Цитата:
Код:
Код:
Код:
Ничего ни странно. Он как и полагается вставляет в процедуру 5-ти(или 3-х) байтовый пролог для доступа к стековым параметрам процедуры. Цитата:
Цитата:
|
|||
![]() |
![]() |
![]() |
#8 | |
Пользователь
Регистрация: 25.08.2010
Сообщений: 12
|
![]() Цитата:
![]() Для |{ot: Я тут в книжке про руткиты прочитал, что начиная с WindowsXP SP2 майкрософт сделала во всех АПИ 5-байтовый пролог: mov edi,edi push ebp mov ebp,esp Хотя объяснения я так и не догнал: это надо для того, чтобы после установки обновлений виндовса не надо было перезагружать комп. Может я чего не знаю? Хотя само объяснение выглядит прикольно: "Стремясь удовлетворить (???) пожелания пользователей, фирма майрософт сделала пролог 5-байтным". Насколько я знаю (и это подтверждает ход истории), под пользователями мелкомягкие понимают людей типа секретуток (как сказал Крис Касперски, "они не отличают IP-адрес от пениса"). Это ж куда цивилизация двинулась, чтобы секретарь была в курсе про прологи в АПИ и пр... Не, так мы без работы будем... Последний раз редактировалось VerhoLom; 02.09.2010 в 17:04. |
|
![]() |
![]() |
![]() |
#9 | ||
Форумчанин
Регистрация: 09.03.2008
Сообщений: 127
|
![]()
Я же и писал сверху
Цитата:
Ну а какая глава в книге про руткиты была? ![]() Цитата:
User32.dll ->MessageBox proc .... mov edi,edi push ebp mov ebp,esp ....... ret MessageBox endp Пусть эта функция и обновляется. Тогда, к примеру, обновлением создается Updatedll.dll и подгружается во все процессы где есть User32.dll, а код User32.dll ->MessageBox меняется вот так: User32.dll ->MessageBox proc .... jmp Updatedll.dll ->MessageBox proc .... ret MessageBox endp Получается при вызове MessageBox управление передастся в Updatedll.dll ->MessageBox где и есть новая версия функции. А уже после перезагрузки функция в User32.dll ->MessageBox изменится на новую (наверное заменой файла) Вот и получается, что для jmp Updatedll.dll ->MessageBox нужно 5 байт (1байт = опкод jmp + 4 байта на адрес), а это как раз размер пролога. |
||
![]() |
![]() |
![]() |
#10 |
Форумчанин
Регистрация: 15.04.2012
Сообщений: 103
|
![]()
У меня крмпиоятор выдавал 125 ошибок, тогда иначе организовал код
Код:
|
![]() |
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Механизм CALL | Stilet | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 2 | 30.07.2010 10:06 |
Infra call center | emilregis | Общие вопросы Delphi | 16 | 29.04.2009 11:26 |
Call of duty 4 | Соколов Дмитрий | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 1 | 03.04.2009 12:40 |
Only assignment, call . . . | RIO | Общие вопросы .NET | 2 | 03.05.2008 16:55 |