Сейчас на форуме: (+7 невидимых) |
![]() |
eXeL@B —› Вопросы новичков —› Inject - как правильно вставить JMP FAR? |
Посл.ответ | Сообщение |
|
Создано: 05 сентября 2014 19:37 · Поправил: ohos · Личное сообщение · #1 Привет, имеется такой код функции из программы: Code:
я пытаюсь сделать проверку значения на строке Code:
Если DWORD PTR SS:[EBP+8] < 550000 или DWORD PTR SS:[EBP+8] > 560000 то нужно пропустить весь код функции и перейти к её ретурну Пытался заменить строки Code:
на JMP FAR к адресу 8A87CB и в нем выполнить сравнение через cmp и проверку флагов, а так же эти пропущенные строки, если функцию выполнять нужно, возврат полагаю нужно сделать на Code:
Но после замены двух выше указанных строк на NOP'ы и вписывания в первые 4 (из 6) значение EACB878A, оставшиеся внизу 2 NOP'а почему-то присоединяются к этой команде JMP FAR и образуют Code:
смещая при этом байты идущие уже на команде call и разбивая её на кучу непонятных команд Code:
в связи с чем возникло несколько вопросов: 1. правильно ли выбраны строки для инжекта и замены их на JMP? 2. если строки выбраны правильно, то как правильно написать JMP FAR на абсолютный адрес 8A87CB? 3. правильно ли выбран адрес возврата, чтобы пропустить весь код функции, но не пропустить команды необходимые для выполнения return из функции? Псевдокод функции из IDA Code:
В строке v4 = sub_698A80(a1); a1 и есть проверяемое значение ![]() |
|
Создано: 05 сентября 2014 19:58 · Поправил: microxa · Личное сообщение · #2 |
|
Создано: 05 сентября 2014 21:22 · Личное сообщение · #3 |
|
Создано: 06 сентября 2014 00:48 · Поправил: dosprog · Личное сообщение · #4 Позволю себе уточнить. <JMP FAR> в программах WIN32 не используется, поскольку нет нужды применять межсегментные вызовы, разрядности регистра адреса хватает для работы во флат-модели памяти. Прыжки в 32-бит программах бывают: Code:
То-есть, в вашем случае код ЕА не нужен, а код EB не подходит, так как одним байтом не удастся закодировать требуемую дельту адреса перехода. Подходит код Е9, но тогда нужно вычислить эту самую разность адресов (дельту), на сколько прыгать. (Это можно сделать с помощью симпатичной утилитки, которую TryAga1n выложил в следующем посте). Поэтому и удобнее просто запихнуть (PUSH) желаемый абсолютный адрес в стек и выполнить ближний возврат (RETN). Как и порекомендовал ajax. Длины инструкций нужно учитывать. Если прыжок вставляется вместо более длинной инструкции, то остальные байты этой прежней инструкции в дизассемблере будут грязью, но это и не важно. Важно прыгнуть потом обратно не в эту грязь, а на адрес следующей за нею осмысленной инструкции. ![]() |
|
Создано: 06 сентября 2014 01:12 · Личное сообщение · #5 А еще для этого дела есть вот такой вот source included калькулятор прыгов, может оказаться полезным ![]() ![]() ![]() |
|
Создано: 06 сентября 2014 03:59 · Личное сообщение · #6 |
|
Создано: 06 сентября 2014 04:34 · Поправил: dosprog · Личное сообщение · #7 |
|
Создано: 06 сентября 2014 04:45 · Поправил: ajax · Личное сообщение · #8 |
|
Создано: 06 сентября 2014 06:40 · Личное сообщение · #9 |
|
Создано: 08 сентября 2014 12:27 · Поправил: ohos · Личное сообщение · #10 |
|
Создано: 08 сентября 2014 14:15 · Личное сообщение · #11 |
![]() |
eXeL@B —› Вопросы новичков —› Inject - как правильно вставить JMP FAR? |