我有一个简单的C函数,叫做add
:
int add(int a, int b) {
return a + b;
}
我需要得到这个给定函数的优化的可执行二进制代码,而没有二进制的任何其他副作用。然后通过JIT系统动态加载和修改它以包含模板。我尝试过尝试使用objdump,但这并不能真正用于获取实际的二进制文件,因为对象文件不是实际的可执行文件。
我需要将函数的移动部分链接在一起,以便在运行时将它们的二进制文件包含在一起,并使PROT_EXEC能够将所有这些部分作为单个函数一起执行,并作为函数指针调用。我需要这样做的原因是因为我有一个字节指令编码类型,我希望将其动态地转换为JIT函数(类似于JIT将RegExp编译为验证器函数)。如果有其他可行的解决方案我应该考虑,请描述它们。
我想使用这种方法的主要原因是因为我可以看到godbolt显示了函数的二进制文件是自包含的,所以希望我可以做一些类似的事情,将二进制文件包含在我自己的项目中。
谢谢你的帮助。
注意:C函数是完全自包含的,不引用其他函数
最简单的方法是使用IDA
。您可以将代码(最好带有符号)编译成ELF文件/EXE文件,并在IDA中打开生成的文件。您可以在函数窗口中看到您的函数,然后移动到十六进制窗口复制您的函数的十六进制转储。
注意:这里有很多事情可能会出错,例如,你必须用-PIC
标志编译你的代码,这样它就不会使用绝对地址。
还建议至少了解基本的汇编。
这个链接可能会很有趣:https://github.com/Neetx/Shellcode-Extractor