是否可以完全重置 IDA Pro 中函数的缓存图形布局?
FWIW:
我设法通过取消定义整个函数来恢复原始图形,然后从底部开始一次重新创建一个操作码。在每一步,我都确保切换到图形视图 - 在某些时候,IDA 绘制了一个完全是胡言乱语的图形。然后我右键单击并选择“布局图”选项,中提琴 - 一旦整个函数被重新定义,函数的完整图形就会恢复正常。
我仍然不知道究竟是什么导致了这种行为:-/
我遇到了同样的问题,除了比你描述的更糟,因为现在在图表上无处可见位于其中一个损坏的前组中的代码。尝试直接转到该代码的地址会使我退出图形视图,而尝试从那里切换回来会告诉我“只有属于函数的指令才能以图形模式显示”,尽管这些指令确实属于功能。
我尝试了一些类似于@RobitZee 的方法,只是我没有对每个操作码都这样做,因为它是一个巨大的函数。起初它似乎有效,但最终破碎的节点神秘地重新出现。
我下载了pyidbutil,看能不能手动删除graph数据,结果发现只能读取数据库,不能修改。但是,我仍然能够使用它来帮助我解决问题。
我所做的是运行带有-d标志的pyidbutil ,这给了我一大堆数据的大转储。然后,我在该图中找到了组的文本(以十六进制格式),它们都一起列出,在它们正上方有一个更大的数据块,似乎包含它们。我打开了一个十六进制编辑器,搜索这些数据块(包含字符串的较小的和较大的)并用 00 替换它们。(请记住,它们之间还有一些其他数据,如果覆盖会损坏数据库。)然后我保存了数据库,当然要保留备份。
在我将所有数据归零后,IDA 能够很好地加载数据库。它给我的唯一警告(除了我总是收到的一个无关的警告)是无效的 CRC32 校验和,但它让我可以选择忽略它。这似乎完全重置了图形,删除了所有组节点(包括出现故障的节点)并将丢失的代码放回图形中。
最后,我立即关闭、保存并重新加载了数据库。这是为了用 IDA 加载的内容的正确序列化来替换我的 hacky 但功能性编辑,这可能修复了 CRC32,等等。数据库,包括现在未损坏的图表,保存没有问题。
请记住,此修复程序几乎肯定不受支持,我不能保证它会为您正常工作。

