【问题标题】:Rename ptrace funct something else? How?将 ptrace 函数重命名为别的?如何?
【发布时间】:2011-04-14 10:11:41
【问题描述】:

在代码中,我会使用

#include <sys/types.h>

#include <sys/ptrace.h>

ptrace(PT_DENY_ATTACH, 0, 0, 0);

拒绝附加到进程。我想知道是否有办法将“ptrace()”重命名为不太明显的名称。我尝试将 ptrace.h 复制到我自己的头文件中并将 int ptrace 更改为其他内容,但这只是失败并出现未定义的符号错误。而且我找不到对该函数的任何其他引用:\

在此先感谢您提供的任何信息。

【问题讨论】:

  • 为什么要重命名?
  • 因为如果我使用它作为防止二进制破解的一部分,很容易将其修补出来,或者在 gdb 中为 ptrace 设置断点。如果它不称为 ptrace 或任何明显的东西,则更难找到。
  • 更正,而不是阻止,只是让它变得尽可能困难。 :)
  • 请注意,您在 C 文件中执行的任何宏魔术都不会改变运行时内存中的方法仍由 ptrace 符号引用的事实,因此不会阻止在运行时注入代码的攻击。
  • ptrace(PT_DENY_ATTACH, ...) 无论如何都帮不了你,因为有一个被盗版软件广泛使用的内核扩展来绕过它。

标签: objective-c c function ptrace


【解决方案1】:

ptrace 是一个系统调用。即使您在 C 代码中重命名了该函数,仍必须进行实际的 ptrace 调用,因此它会在例如 strace 输出中可见(带有所有参数)。

使用宏技巧只会使其不太明显(您需要两个 greps 而不是一个才能在代码库中找到它)。所以我真的不明白这一点。 (宏技巧不会改变编译后的代码。)

您可以尝试使用syscall 自己运行实际的系统调用,但这需要做很多工作,并且到目前为止仍不会向strace 隐藏任何内容。这会让在 gdb 中破解变得有点困难。

所以 IMO:你试图做的事情不值得。

【讨论】:

  • 在 Mac OS X 上没有 strace 这样的东西,尽管你可以使用 dtrace 来做我期望的类似事情。
【解决方案2】:

在标题中使用#define 创建一个新宏:

#define MyTrace(a,b,c,d) ptrace(a,b,c,d)

【讨论】:

  • 感谢您的回答。执行上述操作后,在 gdb 中执行“break ptrace”是否仍然有效?
  • 会的。 #define 是一个预处理器指令,因此在编译二进制文件之前,预处理器会将所有对 MyTrace 的调用替换为对 ptrace 的调用。就像我之前的每个人都说的那样,这个符号仍然会以 ptrace 的形式出现。
  • 有没有办法在 ptrace() 设置断点命中一个虚拟函数而不是实际函数?例如在 pt_deny_attach ptrace 调用之前放置另一个 ptrace 调用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 2018-01-25
  • 2019-05-27
  • 2012-04-05
相关资源
最近更新 更多