我正在编写一个程序,在内存中加密/解密自身,然后将.text内存区域写入可执行文件的副本,这样我每次都可以更改加密密钥。
这主要是为了挑战,因为我对C不太好,而且我也在装配中加入零件。
我的系统是x86_64 Linux,但我正在使用-m32
进行编译我也在使用-nostartfiles(使用gcc),这样我就可以编写自己的_start函数了。此函数以汇编语言编写,并对.text部分的其余部分进行解密/加密。我的问题是外部函数正在以错误的顺序编译,这样当我尝试在加密后转储内存时,它会调用加密函数,因此无效。
这是函数的当前顺序:
这不起作用,因为程序集从主C文件“向下”加密,也加密了程序集函数所需的一些静态函数。
这是我希望函数的顺序:
有没有办法,除了手动修改ELF文件之外,让我重新排序这些功能,以便我需要的功能不加密,而我想加密的功能可以很容易?
在使用musl(替代libc)编译后,编辑我可以在开始时获得所有函数,然后是其余的静态函数。然而,这仍然是错误的方式。
答案 0 :(得分:3)
二进制文件中“错误”的函数顺序来自编译器的优化工作。经常(或经常在一起)使用的函数彼此靠近,因此不会通过调用它们来生成页面错误。
您可以使用标记-fno-toplevel-reorder
关闭部分优化。您还可以使用属性section
仅将一部分函数排序在一起(例如加密它们),或者您可以编写自己的linker scripts。