Замена CALL

Тема в разделе "WASM.A&O", создана пользователем cpp_and_wasm, 24 сен 2006.

  1. cpp_and_wasm

    cpp_and_wasm Владимир

    Публикаций:
    0
    Регистрация:
    27 июл 2006
    Сообщения:
    128
    Исправленный вариант читайте ниже
     
  2. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    можно конечно:
    Код (Text):
    1. push return_address
    2. push STD_INPUT_HANDLE
    3. jmp dword [GetStdHandle]
    можно заюзать вот так:
    Код (Text):
    1. stdcall _gethandle
    2. nop
    3.  
    4. proc _gethandle
    5. push STD_INPUT_HANDLE
    6. jmp dword [GetStdHandle]
    7. ; после вызова вернёмся на nop
    8. endp
     
  3. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Avoidik
    А проверить?

    cpp_and_wasm
    Нету такой инструкции.

    И чем это лучше стандартного CALL DWORD PTR DS:[<&kernel32.GetStdHandle>] ?
     
  4. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    А проверить?

    подумаешь описАлся

    Код (Text):
    1. push STD_INPUT_HANDLE
    2. push return_address
    3. jmp dword [GetStdHandle]
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    И откуда ты возьмешь адрес возврата?
     
  6. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    cpp_and_wasm
    А цель?
    По моему все современные ф-ции вызваются как:
    call dword[MessageBoxA]

    где MessageBoxA это уже готовый и поправленный адрес системным загрузчиком! Зачем извращаться то?

    Или уже есть готовый файл, который надо оптимизировать?
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    cpp_and_wasm
    Что-то непонятно, на чём ты сэкономить хочешь.
     
  8. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    даже если бы команда push eip существовала, она бы здесь не работала, т.к. вернться ты должен не на текущую интсруцию, а не следующую
    т.о. экономии никакой нет, даже наоборот. т.к. вместо простого call ты должен делать push адрес_возврата/jmp
     
  9. cpp_and_wasm

    cpp_and_wasm Владимир

    Публикаций:
    0
    Регистрация:
    27 июл 2006
    Сообщения:
    128
    Извините, неправильно выразил свою мысль :)
    Я вот как-то на досуге делал кейген для крэкМИ и посмотрел скомпилированный вариант в OllyDbg. Можно ли сделать так чтобы, например, call GetStdHandle@4(1) не перепрыгивал на JMP DWORD PTR DS:[<&kernel32.GetStdHandle>](2)? А именно каким образом заменить (1) на (2)?
    Я пробовал по разному, но что-то никак не получается! Файлик прилагается...
    ПС: не пугайтесь отсутствием invoke
     
  10. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    cpp_and_wasm
    http://www.wasm.ru/article.php?article=dznotes
     
  11. cpp_and_wasm

    cpp_and_wasm Владимир

    Публикаций:
    0
    Регистрация:
    27 июл 2006
    Сообщения:
    128
    А можно ли обойтись безо всяких макросов? Как прописать это в сырце? Или это невозможно и без макроса не обойтись?
     
  12. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    прописать в исходнике подобно
    EXTRN _imp__ExitProcess@4:lol: WORD
    ExitProcess TEXTEQU <_imp__ExitProcess@4>
    EXTRN _imp__MessageBoxA@16:lol: WORD
    MessageBox TEXTEQU <_imp__MessageBoxA@16>

    для каждой вызываемой функции, или сделать такие новые инклуды
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Тогда я был прав - на сайте есть либы от НТ, подключением которых можно генерировать сразу вызовы API без переходов (хотя последние вроде экономят размер кода).
     
  14. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    IceStudent
    Да, экономят, если функция вызывается в коде более н-ного количества раз. Только я уже забыл чему равно н. Зато прямой call [x] должен быть быстрее, чем call [jmp [x]]
     
  15. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Это да.
     
  16. cpp_and_wasm

    cpp_and_wasm Владимир

    Публикаций:
    0
    Регистрация:
    27 июл 2006
    Сообщения:
    128
    Спасибо всем! Теперь работает без "заглушек".
    Только вот интересно: зачем в своей книге В.Ю.Пирогов (Assembler для Windows) использует при объявлении внешних Windows'ких функций тип near, например:
    EXTERN CreateWindowExA@48:NEAR ?
     
  17. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Потому что это не FAR :)