是否可以完全重置 IDA Pro 中函数的缓存图形布局?

逆向工程 艾达 拆卸 控制流图
2021-06-25 00:13:01

我正在使用 IDA Pro 7.0 反转旧嵌入式目标的二进制转储。

现在我以某种方式设法引入了一个“伪图节点”,我对上帝的爱无法让它消失。

反汇编看起来是这样的: 注意地址 EA75-EA78

图形布局如下所示: 在此处输入图片说明

“Limit A to ZERO”节点是之前折叠的一组节点的遗物,当我取消定义函数时,这些节点可能已折叠。

我无法展开它 - 如果我将它与其他节点分组并执行折叠/展开/取消组合序列,它也不会消失。

执行“布局图”命令无效,并且在未定义/重新创建函数时仍然存在。

关于如何完全重置函数的图形布局的任何建议?

2个回答

FWIW:

我设法通过取消定义整个函数来恢复原始图形,然后从底部开始一次重新创建一个操作码。在每一步,我都确保切换到图形视图 - 在某些时候,IDA 绘制了一个完全是胡言乱语的图形。然后我右键单击并选择“布局图”选项,中提琴 - 一旦整个函数被重新定义,函数的完整图形就会恢复正常。

我仍然不知道究竟是什么导致了这种行为:-/

我遇到了同样的问题,除了比你描述的更糟,因为现在在图表上无处可见位于其中一个损坏的前组中的代码。尝试直接转到该代码的地址会使我退出图形视图,而尝试从那里切换回来会告诉我“只有属于函数的指令才能以图形模式显示”,尽管这些指令确实属于功能。

我尝试了一些类似于@RobitZee 的方法,只是我没有对每个操作码都这样做,因为它是一个巨大的函数。起初它似乎有效,但最终破碎的节点神秘地重新出现。

我下载了pyidbutil,看能不能手动删除graph数据,结果发现只能读取数据库,不能修改。但是,我仍然能够使用它来帮助我解决问题。

我所做的是运行带有-d标志的pyidbutil ,这给了我一大堆数据的大转储。然后,我在该图中找到了组的文本(以十六进制格式),它们都一起列出,在它们正上方有一个更大的数据块,似乎包含它们。我打开了一个十六进制编辑器,搜索这些数据块(包含字符串的较小的和较大的)并用 00 替换它们。(请记住,它们之间还有一些其他数据,如果覆盖会损坏数据库。)然后我保存了数据库,当然要保留备份。

在我将所有数据归零后,IDA 能够很好地加载数据库。它给我的唯一警告(除了我总是收到的一个无关的警告)是无效的 CRC32 校验和,但它让我可以选择忽略它。这似乎完全重置了图形,删除了所有组节点(包括出现故障的节点)并将丢失的代码放回图形中。

最后,我立即关闭、保存并重新加载了数据库。这是为了用 IDA 加载的内容的正确序列化来替换我的 hacky 但功能性编辑,这可能修复了 CRC32,等等。数据库,包括现在未损坏的图表,保存没有问题。

请记住,此修复程序几乎肯定不受支持,我不能保证它会为您正常工作。