假設我想執行任意的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