VirtualAlloc C++, внедренный dll, asm

Я хочу зарезервировать место для моей кодовой пещеры в приложении. Я использую функцию VirtualAlloc, чтобы зарезервировать это пространство. У меня есть X вопросов.

  1. Какие параметры (тип размещения и защита) я должен использовать для выделения памяти для код-пещеры?

  2. В качестве возвращаемого значения я получаю адрес моей кодовой пещеры. В другой части программы я хочу, чтобы JMP к этой кодовой пещере. Как это сделать? Я знаю (поправьте меня, если я ошибаюсь), что JMP воспринимает как ноль агумента, который смещен относительно текущего местоположения. Но я хочу, чтобы JMP сделал CodeCave. Как рассчитать это смещение.

3 ответа

Решение

Вычитая адрес вашей цели прыжка из адреса инструкции после прыжка, вы получите смещение прыжка.

Просто наткнулся. Чтобы прояснить эту тему для остальных из нас: Расчет относительного смещения JMP для патча кодовой пещеры работает путем вычитания вашего адреса патча с вашим текущим адресом счетчика программы:

uint32_t patch_address = (uint32_t) VirtualAlloc(...);
uint32_t jmp_offset = patch_address - (current_offset + current_len);

Примечание: current_len - это количество байтов, которое занимает ваша инструкция JMP. Это зависит от того, является ли это коротким JMP (EB) или длинным прыжком (E9). В вашем примере 2 байта, но обычный JMP (E8 0x12345678) занимает 5 байтов.

Итак, здесь мы видим, что ваш пример не будет работать легко, потому что вам придется переопределить следующие байты, которые принадлежат следующему MOV и даже инструкции CALL. Это основано на том факте, что ваша кодовая пещера имеет большее расстояние до текущего смещения инструкции, поскольку она расположена в другом регионе в адресном пространстве.

Итак, что вы можете сделать, это скопировать перезаписанные 7 байт в вашу пещеру. Это может работать, только если вы не связываетесь с регистрацией EDI в вашем патче (из-за "MOV ECX, EDI"). И вам придется исправить адрес CALLs, который вы перезаписываете. Так что это, вероятно, не лучшее место для размещения кодовой пещеры, но это выполнимо.

я написал свою собственную библиотеку перехвата, которая заботится об универсальных аргументах регистра, очистке стека и перезаписываемых заполнениях asm, но я предлагаю использовать вышеупомянутые фреймворки.

С уважением, Майкл

Если у вас нет таких вещей, используйте такую ​​библиотеку, как MS Detours, N-CodeHook или что-то еще.

Другие вопросы по тегам