【问题标题】:Can I intercept global pointer initialization in C?我可以在 C 中拦截全局指针初始化吗?
【发布时间】:2014-04-06 22:21:06
【问题描述】:

假设我有一个像这样的小程序:

int i = 0;
int *pi = &i;
int **ppi = π

int main(int argc, char *argv[]) {
  return i + *pi + **ppi;
}

在程序加载/设置期间设置pippi 时,有没有办法拦截它们的初始化?我想挂钩它们的初始化,以便我可以重写指针值并插入一些我自己的位,如果可能的话,在 main() 运行之前。所有这些都应该是透明和自动化的。

我查看了 LD 审计界面 (link),但它只提供函数回调。

【问题讨论】:

  • 在某些环境中,全局变量是作为程序字节的一部分分配的,并且已经在加载映像中初始化。
  • 你真正想做什么? (这可能有助于提供答案。)
  • @dvnrrs:编辑了问题:我想在它们被初始化时捕捉到,这样我就可以在指针值中添加一些自定义位。
  • main开头这样做有什么问题?
  • 如果你使用gcc,那么你可以。签出this

标签: c pointers initialization


【解决方案1】:

这是一个实现细节,不是语言的一部分。可能有办法做到这一点,但你将不再用 C 语言编写。

你为什么要这样做?如果你需要在main() 之前做点什么,为什么不直接转换成这样:

int main(int argc, char *argv[]) {
    // Do stuff
}

类似于:

int old_main(int argc, char *argv[]) {
    // Do stuff
}

int main(int argc, char *argv[]) {
    // Do earlier stuff
    return old_main(argc, argv);
}

为什么还要拦截初始化程序呢?只需让值被初始化,然后将它们更改为您想要的。

每当您尝试绕过该语言而不是使用它时,您都是在寻找错误和不可预测的行为。

【讨论】:

  • 我很乐意在初始化后更改指针。挑战在于找到所有的全局指针,它们指向什么,并相应地改变它们。我认为在到达main() 的过程中,指针已被初始化,这将是捕获它们全部的最简单和最通用的方法。
  • 如果“查找”是指“按名称查找”,则称为运行时自省,C 没有。变量名仅在编译时存在。如果您还不知道它们在哪里,以后就找不到它们了。
  • 没有名字。在上面的示例中,我声明了两个指针,并且在某些时候初始化为指向某个分配的对象。我正在寻找一种方法来拦截(或在 main() 之前的某个其他点更改)这些指针值被设置,以便一旦 main() 运行加载 pippi 的人看到修改后的指针。跨度>
  • 所以就按照我的建议去做吧...在真正的main() 中更改它们,然后在old_main() 中执行您在其中所做的任何事情。
  • 假设我知道所有以链接和可执行二进制文件结尾的全局变量,而我很可能不知道。
【解决方案2】:

所有c程序都会被GCC等编译器编译链接。 每个编译器都可能为您提供这些功能,例如函数调用挂钩等。

据我所知,函数调用分析可以使用这些功能。懂中文的可以看看这个document的详细介绍。

但我没有找到挂钩全局变量的方法。这些变量可以由编译器在链接数据区步骤中初始化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 2021-04-12
    • 1970-01-01
    • 2021-10-27
    • 2020-12-31
    • 1970-01-01
    相关资源
    最近更新 更多