假设我想执行任意 mov 指令。我可以编写以下函数(使用 GCC 内联汇编):
void mov_value_to_eax()
{
asm volatile("movl %0, %%eax"::"m"(function_parameter):"%eax");
// will move the value of the variable function_parameter to register eax
}
我可以制作像这样的函数,可以在每个可能的寄存器上工作。我是说 -
void movl_value_to_ebx() { asm volatile("movl %0, %%ebx"::"m"(function_parameter):"%ebx"); }
void movl_value_to_ecx() { asm volatile("movl %0, %%ecx"::"m"(function_parameter):"%ecx"); }
...
以类似的方式,我可以编写将任意地址中的内存移动到特定寄存器的函数,并将特定寄存器移动到内存中的任意地址。(mov eax, [memory_address]
和mov [memory_address]
,eax)
现在,我可以随时执行这些基本指令,因此我可以创建其他指令。例如,要将一个寄存器移动到另一个寄存器:
function_parameter = 0x028FC;
mov_eax_to_memory(); // parameter is a pointer to some temporary memory address
mov_memory_to_ebx(); // same parameter
所以我可以解析一条汇编指令,并根据它决定使用哪些函数,如下所示:
if (sourceRegister == ECX) mov_ecx_to_memory();
if (sourceRegister == EAX) mov_eax_to_memory();
...
if (destRegister == EBX) mov_memory_to_ebx();
if (destRegister == EDX) mov_memory_to_edx();
...
如果它可以工作,它允许您执行任意 mov 指令。
另一种选择是制作一个要调用的函数列表,然后遍历列表并调用每个函数。也许它需要更多的技巧来制作像这样的等效指令。
所以我的问题是:是否有可能为所有(或部分)可能的操作码制作这样的东西?它可能需要编写很多函数,但是是否有可能制作一个解析器,它将基于给定的汇编指令以某种方式构建代码,然后执行它,或者那是不可能的?
编辑:您不能更改内存保护或写入可执行内存位置。