IDA Pro字符串功能

时间:2012-11-21 14:35:27

标签: ida

我有这个我希望编辑的二进制文件,但加载后,所有字符串都是某种乱码符号。无论如何要格式化吗?

1 个答案:

答案 0 :(得分:5)

为什么你会看到"乱语":

字符串很可能是混淆的。在程序中使用每个字符串之前,可能会运行一个反混淆程序,将内存中的字符串转换回有意义的字符串。这是用于防止静态分析工具(例如GNU"字符串"实用程序或IDA Pro)正确分析二进制文件的常用技术。这个答案的其余部分假设你的二进制文件也是如此。

如何对字符串进行反混淆处理(动态方法):

如果您能够运行二进制文件,则可以让它为您进行反混淆处理。您需要做的就是在调试器中运行二进制文件,并在对内存进行反模糊处理后对内存进行分析。

混淆其字符串的几个二进制文件在使用后不会再对它们进行重新混淆,因此您可能首先要尝试的一个有趣的快捷方式是在调试器中运行二进制文件并在它退出之前中断执行。如果字符串仍然是去模糊的,您可以执行相应部分的内存转储以保存反混淆的字符串。 (这不一定会为您排除所有字符串的混淆;您只会获得沿二进制执行路径进行反混淆的字符串)

如果上一个方法不适合您,请尝试在混淆字符串的第一个字节上设置硬件写断点,然后运行二进制文件。如果断点跳闸,请逐步执行指令以允许对其余字符串进行反混淆处理。如果反混淆总是从一个公共例程发生,你可以在该例程的末尾附近放置一个断点,并可能编写调试器的脚本,以便在每次执行该例程时打印去混淆的字符串。

一旦获得了经过反混淆的字符串列表,您可以将它们直接修补到IDA数据库中(如下所述),或者您可以在每个字符串的地址处留下可重复的注释(使用'键)。数据库中的字符串,这样反混淆的字符串将显示为引用它的每条指令的注释。

对于小型二进制文件,您可以手动执行注释,但是阅读脚本IDA是值得的,这样您就可以自动执行此过程。 The IDA Pro Book包含了很好的参考资料。

如何对字符串进行反混淆(静态方法):

如果您无法运行二进制文件,或者动态方法没有为您解复用所有字符串,那么您可以自行对其进行反混淆。

如果您查看IDA Pro中任何混淆的字符串的交叉引用(使用x键查看它们),您可能会被带到反混淆程序。如果例程不是太复杂 - 而且它们通常不是 - 你应该能够编写一个脚本来模拟去模糊程序。这将允许您使用IDA数据库中的反混淆字符串替换混淆的字符串。

(作为澄清一点,IDA数据库完全独立于二进制文件本身。你对数据库做的任何事情都不会影响实际的二进制文件,你对二进制文件做的任何事情都不会影响数据库)

您编写IDA脚本的选项是IDC(IDA的原始内置脚本语言)和IDAPython。我强烈建议使用IDAPython,因为它更容易使用,而且功能更强大。我不确定您是否可以在IDA Free 5.0上安装IDAPython,但它应该与所有模糊的IDA Pro版本捆绑在一起。

概述脚本IDA将超出此答案的范围,但这是一个让您入门的示例。如果您正在使用IDA Free,我会在IDC中写它。让我们说你的去混淆例程只是将每个连续的字节与0x1F异或,直到空字节被解码。然后,以下循环可能最终成为您的IDC脚本的一部分:

// *EXAMPLE*
auto addr = 0x00401000; // The address of your string

while(1){
    auto b = Byte(addr) ^ 0x1F;
    PatchByte(addr, b);
    if (b == '\0'){
        break;
    }
    addr = addr + 1;
}

可以从File > IDC Command...File > Script file...运行脚本。

正如您可能猜到的那样,Byte返回存储在给定地址的字节,PatchByte将一个字节写入地址。 IDAPython中的内置函数与它们的IDC对应物共享相同的名称,因此IDAPython版本几乎完全相同,没有类似C语法的语法。如前所述,我强烈建议The IDA Pro Book进行IDA脚本的演练。一旦掌握了基础知识,就可以使用IDA的内置帮助索引和The IDAPython documentation作为其他参考资料。

在运行修补代码的脚本之前始终保存数据库!没有"撤消" IDA中的功能,因此一个小的编码错误可能会丢弃整个数据库。

祝你好运!