对c语言函数进行反汇编获取函数大小并复制到内存里执行
最近想注入一个shell code,但是每次写shell code挺麻烦的,就想直接注入函数,但不知道函数的大小没法分配内存。于是想到了通过反汇编的方法获取函数占用内存的大小。原理是从函数入口往下找到ret并统计指令的数量和大小。
关键代码:
size_t GetFuncSIze(void * addr)
{
ZyanU8* data = reinterpret_cast<ZyanU8*>(addr);
// The runtime address (instruction pointer) was chosen arbitrarily here in order to better
// visualize relative addressing. In your actual program, set this to e.g. the memory address
// that the code being disassembled was read from.
ZyanU64 runtime_address = reinterpret_cast<ZyanU64>(data);
// Loop over the instructions in our buffer.
ZyanUSize offset = 0;
ZydisDisassembledInstruction instruction;
while (ZYAN_SUCCESS(ZydisDisassembleIntel(
/* machine_mode: */ ZYDIS_MACHINE_MODE_LONG_64,
/* runtime_address: */ runtime_address,
/* buffer: */ data + offset,
/* length: */ 15,
/* instruction: */ &instruction
))) {
printf("%016" PRIX64 "%s\n", runtime_address, instruction.text);
offset += instruction.info.length; //count instruction length
runtime_address += instruction.info.length;
if (instruction.info.opcode == 0xc3) //find ret, then break
{
return offset;
}
}
return 0;
}
下面的事情就简单了,把函数复制到一篇内存,执行即可。有两点注意:
1.DEBUG模式下函数有个jmp跳转,需要找到jump后的入口
2.函数调用是相对寻址,这里使用参数传入绝对地址
运行结果
代码:https://github.com/oakboat/GetFunctionSIze
Debug下寻找Jmp的代码可以参考我发的一篇文章 https://www.cnblogs.com/iBinary/p/14148137.html
其次想把函数当作ShellCode执行计算大小感觉不用这么麻烦.
void shellcode_fun(){.....}
voidshellCode_fun_end(){return};
将函数转为函数地址.利用end - start就可以算出实际函数的大小了. 但是注意这两个函数要贴着.
auto fun_size = (DWORD)xxx_end - (DWORD)shellcode_fun;
这样函数大小就计算出来了.注入 shellcode_fun 即可.
shellcode_fun 也要注意,里面不要使用到绝对地址. 要注意代码的重定位. ShellCode一定要和地址无关的代码.
页:
[1]