Ассемблирование переходов и вызовов системных апи в HIEW

Тема в разделе "WASM.BEGINNERS", создана пользователем Aoizora, 11 июл 2019.

  1. Aoizora

    Aoizora Active Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    351
    Есть программа с некоторым функционалов в точке входа (адрес 0x401000).
    Я хочу модифицировать этот функционал, не поломав файл. Для этого я хочу в области нулей написать свой код и сделать на него переход. В этом коде я в том числе хочу передать управление на оригинальную точку входа. Но есть две проблемы:

    1) Когда я хочу сделать переход на оригинальную точку входа, в области нулей при помощи HIEW я ассемблирую код call 0401000, но в результате получается какой-то мусор (опкод E8100D4000). OllyDbg не может правильно выполнить эту инструкцию и тоже показывает не те команды, которые я ожидаю. Как правильно ассемблировать такие переходы?

    2) В своем новом коде я хочу вызывать системные апи. Как, например, в HIEW ассемблировать вызов системных апи типа call MessageBoxA? Я так и записываю, но HIEW говорит, что не понимает, что от него хотят.
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
  3. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Обычно такие штуки делают cff explorer'ом, тебе надо секцию добавить и в импорт накидать дополнительных функций. В hiew наверное лучше не ассемблировать ничего серьезного, дополнительный кусок кода проще собирать внешним ассемблером, объявив в нем адреса из импорта и базовый адрес, по которому он будет находиться в образе. Можно оформить в фасме, который сам при сборке поселит нужный код куда надо.
     
  4. Aoizora

    Aoizora Active Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    351
    А как ассемблировать инструкцию call 04010EB в олли или в hiew? Это начало моего кода.
    Почему-то инструкция call 04010eb превращается в
    00401109 E8 DF0D4000 CALL 00801EED
    0040110E E8 DA0D4000 CALL 00801EED
     
  5. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Внутри инструкции смещение относительно ea + 5
    801EED - 00401109 - 5 = 400DDF (в LE в самой инструкции закодировано: DF0D4000). Наверное ты ассемблируешь ее не там, куда помещаешь.
    Должно быть:
    04010EB - 00401109 - 5 = FFFFFFDD
    E8 DDFFFFFF
     
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Aoizora,
    4010EB(адрес функции) - 00401109 (текущий адрес) -5(длина кодировки CALL) = -23 = FFFFFFDD
    00401109: E8 DDFFFFFF = call 4010EB
    у тебя
    00401109: E8 DF0D4000
    00401109+00400DDF+5 = 00801EED
    но это при обращении к твоим собственным функциям (CALL=E8 адрес), а для вызова системной функции, ее адрес нужно найти в секции Import и сделать КОСВЕННЫЙ вызов (CALL=FF15 адрес)
     
  7. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Aoizora,

    > Для этого я хочу в области нулей написать свой код и сделать на него переход. В этом коде я в том числе хочу передать управление на оригинальную точку входа.

    В нулях исполнение заблокировано системой, это нижняя часть ап. Сделано по причине нулевого раскрытия ссылки - это самые простые ошибки в км. Управление передавалось lpe на нулевой адрес. По этой причине первый блок в ап заблокирован.

    Что ты под этим имеешь ввиду твоё личное дело.
     
  8. Aoizora

    Aoizora Active Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    351
    Я размещаю код в нулях, которые выравнивают секцию кода. У меня секция кода смержена с данными, и там есть еще и импорт, но немного свободного места остается.
     
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Aoizora,
    внимательно прочитай сообщения #2 и #6
    а загрузчик твоей программы знает, что там у тебя секция импорта?
    а РЕ-заголовок откорректирован?
    а в секции импорта есть строка с именем функции и именем dll, из которой эта функция берется?
     
  10. Aoizora

    Aoizora Active Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    351
    Я уже сделал. Файл очень простой, проблема была именно в понимании того, как работает инструкция call. Файл очень компактный, но в конце место для внедрения было.