重新排序gcc程序集中的函数

时间:2013-01-12 20:45:14

标签: gcc assembly

我正在编写一个程序,在内存中加密/解密自身,然后将.text内存区域写入可执行文件的副本,这样我每次都可以更改加密密钥。

这主要是为了挑战,因为我对C不太好,而且我也在装配中加入零件。

我的系统是x86_64 Linux,但我正在使用-m32

进行编译

我也在使用-nostartfiles(使用gcc),这样我就可以编写自己的_start函数了。此函数以汇编语言编写,并对.text部分的其余部分进行解密/加密。我的问题是外部函数正在以错误的顺序编译,这样当我尝试在加密后转储内存时,它会调用加密函数,因此无效。

这是函数的当前顺序:

  • some -static
  • 我的函数,它们的顺序正确(汇编函数,然后是主C文件中的函数)
  • 更多来自-static

这不起作用,因为程序集从主C文件“向下”加密,也加密了程序集函数所需的一些静态函数。

这是我希望函数的顺序:

  • all -static functions&来自#include<>
  • 的任何内容
  • 来自.S程序集文件的功能(整个.S按顺序)
  • 来自.c主文件的功能(整个.c顺序)
  • .c主文件的任何非标准包含(即不是stdio.h等,来自#include的内容“”)

有没有办法,除了手动修改ELF文件之外,让我重新排序这些功能,以便我需要的功能不加密,而我想加密的功能可以很容易?

在使用musl(替代libc)编译后,

编辑我可以在开始时获得所有函数,然后是其余的静态函数。然而,这仍然是错误的方式。

1 个答案:

答案 0 :(得分:3)

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

您可以使用标记-fno-toplevel-reorder关闭部分优化。您还可以使用属性section仅将一部分函数排序在一起(例如加密它们),或者您可以编写自己的linker scripts

另见this question