Я хочу создать код, который читает инструкции по сборке (только для x86) и воссоздает их в другом месте памяти для создания кода подключения. Например, я хочу перехватить функцию X, поэтому мне нужно пропатчить ее (как минимум) первые байты с помощью перехода и каждую заменяемую инструкцию (что может варьироваться в зависимости от кода сборки) (частично или нет) мне нужно воссоздать в памяти мой блок, а затем добавить инструкцию, чтобы вернуться к исходной функции X со смещением следующей инструкции, которую я не трогал. Вы, наверное, знаете, что я говорю, так как это не ново для многих. Я не хочу делать полную идеальную программу, но я хочу создать полностью расширяемую кодовую базу, которая будет использовать дерево, как я объясню ниже. Для начала давайте представим несколько инструкций:
- A - «0x12 0x13.» Эта инструкция имеет 4 байта, а первые два являются статическими.
- B - "0x12." Эта инструкция имеет 2 байта, а первый является статическим.
Для этого случая у меня будет дерево, которое будет выглядеть как
Tree
|
|
0x12
/ \
B 0x13
|
A
Таким образом, когда код должен был проанализировать инструкцию, он попытался бы получить инструкцию с самым длинным префиксом, а в случае неудачи он мог бы остановиться и потерпеть неудачу или попытаться выполнить одну из приведенных выше задач в дереве.
Причиной желания сделать что-то подобное является то, что я могу расширить позже с помощью инструкций, предоставляемых dll, которые необходимы для того, что я делаю, потому что я хочу отправить код раньше, который будет обрабатывать примерно 90% инструкций и только позаботьтесь о тех, кто более продвинут, на тот случай, если мне это понадобится в будущем.
Итак, теперь мой вопрос: какова точная полная информация, которая понадобится dll, которая будет обрабатывать инструкцию кода?
Нравится:
- адрес, с которого начинается инструкция. (обязательно, конечно)
- ? базовый адрес модуля, который содержит адрес, с которого начинается инструкция (я полагаю, этот нужен в случае, если инструкция ссылается на некоторую часть памяти своего модуля)
- ? предыдущая инструкция. Не знаю, есть ли инструкции, которые должны знать, что за инструкция до этого выполнялась или что-то в этом роде
Я также хочу спросить, в порядке ли древовидная структура или возникнут какие-то проблемы.
Итак, в основном я хочу попросить вас помочь решить, какая информация мне нужна для создания наиболее общего кода, который:
по указанному адресу анализирует его инструкции по сборке и в соответствии с инструкцией будет вызывать указатели на функции в dll, которые будут копировать эти инструкции.
Итак, что-то вроде
void* copy_instructions(void* address,int& len)
{
int bytes_copied = 0;
void* instructions = block of bytes // don't care about the implementation
do
{
void (*copy_instruction)(void*,int*) = get_a_handler_to_instruction_at(address) // this function will use the tree structure and retrieve a function from a dll
if(copy_instruction != NULL)
int len = 0;
void* instruction = copy_instruction(void* address,&len,...) // I want to know how to make this function complete in terms of what it need for every case
if(!instruction)
fail
instructions += instruction // don't care about the implementation
address += len
bytes_copied += len
else
fail
}
while(bytes_copied < 5)
add_instructions_jump_to(instructions,address + bytes_copied)
len = bytes_copied;
return
}
Мои вопросы будут:
Как будет выглядеть полный заголовок функции copy_instruction?
Можно ли использовать дерево, указанное выше, для реализации "get_a_handler_to_instruction_at" или мне нужно что-то еще?