我正在使用 IDA 7 调试一个正在运行的应用程序,该应用程序必须是另一个应用程序的子应用程序,这意味着我无法从 IDA(使用调试器->运行)启动它。相反,我必须正常运行应用程序,然后在应用程序已经运行后将 IDA 的调试器附加到应用程序。但是,当我安装调试器时,应用程序已经在内存中创建了一些重要的字符串。这些字符串不是我可以在静态 exe 二进制文件中通过任何简单的十六进制搜索找到的东西,它们似乎只在应用程序运行后出现在内存中,所以我假设它们是从某个地方解压缩的。所以我试图确定哪些代码负责创建这些字符串,以便我可以追踪这些字符串的来源。每次我运行应用程序时,字符串位于不同的内存地址。由于我无法在创建这些字符串之前调试程序,因此我无法在创建这些字符串时上前查看它们,我只能在为时已晚之后才能看到它们。有没有办法从已经在内存中的变量点创建的字符串向后工作,然后从那里向后工作以确定是什么代码创建了它?
如何在实时调试器会话中确定是什么代码创建了字符串?
逆向工程
艾达
拆卸
调试
字符串
x86-64
2021-06-24 20:41:36
1个回答
我不太了解 IDA 调试器,但我可以告诉它如何在 GDB 中完成。
首先,我建议禁用 ASLR ( echo 0 | sudo tee /proc/sys/kernel/randomize_va_space) 以防止地址空间随机化。如果您要查找的字符串每次都在同一位置,那么只需在该位置设置观察点即可完成这项工作。
如果情况并非如此,我认为实现您的目标的唯一简单方法就是从一开始就调试您的应用程序。在 GDB 中,您可以set detach-on-fork off在执行程序之前使用option 执行此操作,该程序执行以下操作:
这两个过程都将在 GDB 的控制下进行。一个进程(子进程或父进程,取决于follow-fork-mode 的值)像往常一样被调试,而另一个被挂起。
因此,如果follow-fork-mode设置为parent,GDB 将只执行父进程,而子进程将被冻结,直到您在另一个 GDB 实例中运行它(例如,您也可以使用 IDA 调试器附加到新创建的进程)。
我正在发布您在使用 GDB 时可能会觉得有用的链接,正如我上面所描述的:
其它你可能感兴趣的问题