我正在编写一个程序,它在内存中对自身进行加密/解密,然后将 .text 内存区域写入可执行文件的副本,这样我每次都可以更改加密密钥。
这主要是为了挑战,因为我对 C 不是很好,而且我也在组装中合并零件。
我的系统是 x86_64 Linux 但我正在使用 -m32 进行编译
我也在使用 -nostartfiles(使用 gcc),这样我就可以编写自己的 _start 函数。这个函数是用汇编编写的,它解密/加密 .text 部分的其余部分。我的问题是外部函数的编译顺序错误,因此当我在加密后尝试转储内存时,它会调用一个加密函数,因此它不起作用。
这是函数的当前顺序:
- 一些来自 -static
- 我的函数顺序正确(汇编函数,然后是主 C 文件中的函数)
- 更多来自 -static
这不起作用,因为程序集从主 C 文件“向下”加密,还加密了程序集函数所需的一些静态函数。
这是我希望函数的顺序:
- 所有 -static 函数和来自 #include <> 的任何内容
- .S 程序集文件中的函数(整个 .S 按顺序排列)
- .c 主文件中的函数(整个 .c 按顺序排列)
- .c 主文件的任何非标准包含(即不是 stdio.h 等,来自 #include "" 的内容)
除了手动修改 ELF 文件之外,有什么方法可以让我重新排序这些函数,这样我需要的函数就不会被加密,而我想要加密的函数可以很容易地加密?
在使用 musl(替代 libc)编译时进行编辑,我可以在开始时获取我的所有函数,然后是其余的静态函数。但是,这仍然是错误的方法。