wangab 发表于 2024-1-1 15:39

对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

IBinary 发表于 2024-1-2 10:47

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]
查看完整版本: 对c语言函数进行反汇编获取函数大小并复制到内存里执行