2

我正在编写一个程序,它在内存中对自身进行加密/解密,然后将 .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)编译时进行编辑,我可以在开始时获取我的所有函数,然后是其余的静态函数。但是,这仍然是错误的方法。

4

1 回答 1

4

二进制文件中函数的“错误”顺序来自编译器的优化工作。经常(或经常一起)使用的函数彼此靠近,因此调用它们不会产生页面错误。

您可以使用标志关闭部分优化-fno-toplevel-reorder。您还可以使用该属性section将仅功能的子集排序在一起(例如加密它们),或者您可以编写自己的链接器脚本

另请参阅此问题

于 2013-01-13T12:26:30.693 回答