gpt4 book ai didi

gcc - 在 gcc 程序集中重新排序函数

转载 作者:行者123 更新时间:2023-12-02 01:13:45 24 4
gpt4 key购买 nike

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

这主要是为了挑战,因为我不擅长 C,而且我也在组装中加入零件。

我的系统是 x86_64 Linux 但我使用 -m32 编译

我还使用 -nostartfiles(与 gcc)以便我可以编写自己的 _start 函数。这个函数是用汇编语言编写的,它会解密/加密 .text 部分的其余部分。我的问题是外部函数的编译顺序错误,因此当我在加密后尝试转储内存时,它会调用加密函数,因此无法正常工作。

这是函数的当前顺序:

  • 一些来自-static
  • 我的函数顺序正确(汇编函数,然后是主 C 文件中的函数)
  • 还有一些来自-static

这是行不通的,因为程序集从主 C 文件“向下”加密,还加密了一些汇编函数所需的静态函数。

这是我希望函数的顺序:

  • 所有静态函数和#include 中的任何内容 <>
  • .S 汇编文件中的函数(整个 .S 按顺序排列)
  • .c 主文件中的函数(整个 .c 按顺序排列)
  • .c 主文件的任何非标准包含(即不是 stdio.h 等,#include ""中的内容)

除了手动修改 ELF 文件之外,有什么方法可以让我重新排序这些函数,以便我需要的函数不被加密,而我想要加密的函数可以很容易地加密?

编辑 在使用 musl(替代 libc)编译后,我可以在开始时获得所有函数,然后是其余的静态函数。然而,这仍然是错误的方法。

最佳答案

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

您可以使用标志 -fno-toplevel-reorder 关闭部分优化。您还可以使用属性 section 仅对函数的一个子集进行排序(例如,对它们进行加密),或者您可以编写自己的 linker scripts .

另见 this question .

关于gcc - 在 gcc 程序集中重新排序函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14297782/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com