检测写入字符串

时间:2012-02-16 09:02:54

标签: c string memory

我有没有办法在不使用mprotect(我不能使用)的情况下检测/启动 - 写入字符串?

目前我只能在下面的读取中检测到写入,但为时已晚(以下读取可能来自完全不同的lib)。

注意:由于优化程序在进程内存中移动字符串,因此使用带有观察点的gdb失败。

编辑:有问题的变量是一个类成员(char *),它包含一些元数据作为字符串的前缀。字符串是需要不可变的部分,前缀必须是可写的。我在类静态哈希中有几百万个这样的对象,它们可以从我们代码中的任何地方访问。

2 个答案:

答案 0 :(得分:1)

你可以尝试将所有写入内存的代码包装在预处理器宏中,这些代码检查你正在使用的地址,但由于大多数人喜欢使用裸骨指针(而不是封装东西的库调用),它可能会要付出很多努力。

唯一的另一个选项是mprotect(2)或GDB,它们都使用CPU的特殊部分来监视地址总线以访问相关内存。

由于你也不能使用它,最后一个选择是在纸上打印代码并坐在安静的角落里几天阅读它。这通常会奏效,但大多数人都会避免这种努力(因为它看起来不像“真正的”工作; - )。

答案 1 :(得分:0)

我不确定gdb中是否有类似于dbx中的“trace”的命令,但是在dbx中我记得使用一个名为“trace”的命令,它可以用来跟踪代码中的各个变量,它会暗示你什么时候变量值在执行过程中会发生变化。