假设我想执行任意的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指令。
另一种方法是创建一个函数列表来调用,然后遍历列表并调用每个函数。也许它需要更多的技巧来制作像这样的等效指令。
所以我的问题是这样的:是可以为所有(或某些)可能的操作码做这样的事情吗?它可能需要很多函数来编写,但是有可能创建一个解析器,它将基于给定的汇编指令以某种方式构建代码,并执行它,否则这是不可能的?
编辑:您不能更改内存保护或写入可执行的内存位置。
这类问题引发了一个问题:“为什么要做这样的事情?” – phonetagger
因为如果它可以工作,它可以是一种执行代码的方法,如果你不能将它写入内存。 (操作系统可能会阻止下载和执行代码) – Tomer