Гость Pentester Опубликовано 31 октября, 2014 Поделиться Опубликовано 31 октября, 2014 (изменено) Я пишу трейнер на C#, он должен сделать иньекцию кода, но когда я записываю JMP ( 0xE9 ) и адрес куда прыгнуть ( 0x004121E2 ) , то записывается в MemoryViewer нужный адрес, а на самом деле прыгает в совершенно другой адрес.Подскажите как правильно записывать адреса в память. Изменено 31 октября, 2014 пользователем Pentester Картинки надо уменьшать перед заливкой на форум и прятать под спойлер. Ссылка на комментарий Поделиться на другие сайты Поделиться
A1t0r Опубликовано 31 октября, 2014 Поделиться Опубликовано 31 октября, 2014 (изменено) Я пишу трейнер на C#, он должен сделать иньекцию кода, но когда я записываю JMP ( 0xE9 ) и адрес куда прыгнуть ( 0x004121E2 ) , то записывается в MemoryViewer нужный адрес, а на самом деле прыгает в совершенно другой адрес.Подскажите как правильно записывать адреса в память. Всё зависит от первого байта команды. Ты используешь E9 - это близкий ОТНОСИТЕЛЬНЫЙ переход, смещение 4-байтовое. В этом случае опкоды для перехода на 0x004121E2 такие:E9 F6 FF FF FF Если указать смещение 00 00 00 00, то будет произведён переход на след. инструкцию. Смещение считается от последнего байта данной инструкции, т. е. 004121EB. Чтобы перейти на E2 нужно сделать: от последнего байта инструкции до первого 4 шага(будем на E7) + 5 шагов до E2. Смещение FF FF FF FF указывает на последний байт команды (004121EB). Итого: (FF - 4) - 5 = FB - 5 = F6. Для экономии места лучше использовать короткий прыжок (Short 0xEB) со смещением -128 +127. Опкоды такиеEB F9А если ты хочешь писать абсолютный адрес, тогда прыжок имеет код 0xEA(jmp FAR). ОпкодEA E2 21 41 00Если хочешь почитать, например, здесь, начиная с раздела "Команда безусловного перехода JMP(Переход, прыжок =”JUMP”)" Изменено 31 октября, 2014 пользователем Xipho Длинные посты не нужно цитировать целиком, достаточно первых несколько строк, чтобы было понятно, к кому обращаешься. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 31 октября, 2014 Поделиться Опубликовано 31 октября, 2014 В случае с E9 - прыжок записывается как разница между текущим адресом и адресом, куда надо прыгнуть. Ссылка на комментарий Поделиться на другие сайты Поделиться
A1t0r Опубликовано 31 октября, 2014 Поделиться Опубликовано 31 октября, 2014 В случае с E9 - прыжок записывается как разница между текущим адресом и адресом, куда надо прыгнуть.Согласен, только разница между последним байтом инструкции и куда прыгнуть, а длина инструкции прыжка 5 байт. Если вперед, то всё просто, назад - нужно учитывать эти 5 байт. Проверено на себе) Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Pentester Опубликовано 31 октября, 2014 Поделиться Опубликовано 31 октября, 2014 Спасибо, помогло. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения