C++ и ПОЛНОСТЬЮ динамические функции

У меня проблема с объездами. Объезды, как вы все знаете, могут перемещаться только между 5 байтами пространства (, т.е. вызовом 'jmp' и 4-байтовым адресом ). Из-за этого невозможно иметь функцию «hook» в классе (методе ), вы не можете предоставить указатель «this», потому что просто не хватает места(вот проблема далее подробно объяснил ). Итак, я весь день провел мозговой штурм в поисках решения, а теперь мне нужны ваши мысли по этому поводу, чтобы я не начинал трех -5-дневный проект, не зная, возможно это или нет.

Изначально у меня было 3 цели: я хотел, чтобы функции-ловушки были методами класса, я хотел, чтобы весь подход был объектно-ориентированным -(без статических функций или глобальных объектов )и, что хуже всего, самая сложная часть, чтобы быть полностью динамичным. Это мое (теоретическое )решение; с помощью ассемблера можно изменять функции во время выполнения (прекрасным примером является любой обходной метод ). Итак, поскольку я могу динамически изменять функции, не должен ли я также создавать их динамически? Например; Я выделяю память, скажем, для ~30 байт (через malloc/new ).Разве нельзя было бы просто заменить все байты двоичными числами, соответствующими различным операторам сборки (, например, 0xE9 — это 'jmp' ), а затем напрямую вызвать адрес (, так как он будет содержать функцию )?

ПРИМЕЧАНИЕ. :Я заранее знаю возвращаемое значение и все аргументы всех функций, которые я хочу обойти, и, поскольку я использую GCC, соглашение thiscall практически идентично соглашению _cdecl.

Итак, это моя мысль/скоро -для -реализации; Я создаю класс «Функция». Этот конструктор принимает переменное количество аргументов (, кроме первого аргумента, который описывает возвращаемое значение целевой функции ).

Каждый аргумент представляет собой описание аргументов, которые хук получит (размер и является ли он указателем или нет ). Допустим, я хочу создать класс Function для int * RandomClass::IntCheckNum(short arg1);. Тогда мне просто нужно было бы сделать вот так:Function func(Type(4, true), Type(4, true), Type(2, false));. Где «Тип» определяется как Type(uint size, bool pointer). Затем с помощью ассемблера я мог бы динамически создать функцию (note :, все это будет использовать _соглашение о вызовах cdecl ), поскольку я могу рассчитать количество аргументов и общий размер.

РЕДАКТИРОВАТЬ :В примере Type(4, true)— это возвращаемое значение (int *), второй Type(4, true)— это указатель RandomClass 'this', а Type(2, false)описывает первый аргумент (short arg1 ).

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

Так я хотел знать; Это возможно? Сколько работы это потребует, и я слишком высоко над головой здесь?

РЕДАКТИРОВАТЬ :Извините, если я представил все немного нечетко, но если есть что-то, что вы хотите объяснить более подробно, спрашивайте!

EDIT2 :Я также хотел бы знать, могу ли я где-нибудь найти шестнадцатеричные значения для всех операторов сборки? Список бы очень помог! И/или если можно как-то "сохранить" ассемблер ("" ); код по адресу памяти (, в чем я очень сомневаюсь ).

6
задан Community 23 May 2017 в 11:48
поделиться