繁体   English   中英

在预处理/编译期间内联汇编到字节码?

[英]Inline assembly to bytecodes during preprocessing/compilation?

我有一个程序,我想在运行时修补它,它由许多长函数组成。 我认为如果我可以在函数中修补特定范围的指令而不是完全重写它们,那会更容易。

为此,我想创建一个 function,给定进程的内联程序集、起始地址和结束地址,它将用给定的自定义程序集替换地址范围内的所有程序集代码。

如果在使用WriteProcessMemory写入所有程序集的字节后,在地址范围内还有 memory(即,如果字节的缓冲区小于地址范围),则剩余的地址空间将被nop指令填充。 如果没有足够的空间来容纳程序集,整个地址范围将被nop指令填充,并在开始处放置一条jmp指令,这会将例程重定向到包含所有程序集的 function。

为此,我需要在编译期间知道程序集的字节码,我不确定如何去做,或者是否可能。 更重要的是,我希望 function 是一个宏,其行为与 GCC 使用的内联汇编非常相似,因此 ZC1C425268E68385D1AB4Z5074C17A94F1 看起来像:

BYTE* asm_bytecode = get_asm_bytecodes ( 0x0<start_address>, 0x0<end_address>, 
    "mov eax, eax;"
);
WriteProcessMemory(..., asm_bytecode, ...);

所以我的问题是:

  • 编译期间是否可以获取内联汇编字节码? 如果是这样,怎么做?
  • 是否可以像我的示例中那样在自定义宏中利用内联汇编格式?
  • 有没有比我建议的更好的详细修补程序的方法?

请注意,我将 MinGW 用于 Windows 上的 GCC。

您可以在 function 之外使用asm来组装您喜欢的任何指令序列,并创建标签来标记开始和结束。 然后您将在 memory 中拥有这些字节,并且可以将它们复制到您喜欢的位置。

asm(".text \n\t"
    ".global my_code \n"
    "my_code: \n\t"
    "frob %rax \n\t"
    "grind $12345, %rbx \n\t"
    // ...
    ".global end_of_my_code \n"
    "end_of_my_code: \n\t"
);

extern unsigned char *my_code;
extern unsigned char *end_of_my_code;
size_t my_code_size = end_of_my_code - my_code;

void overwrite(...) {
    WriteProcessMemory(..., my_code, my_code_size, ...);
}

(我忘记了 MinGW 是否需要在符号上使用前导下划线。如有必要,请添加。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM