为什么你会看到“乱码”:
字符串可能被混淆了。在程序中使用每个字符串之前,很有可能会运行反混淆例程将内存中的字符串转换回有意义的字符串。这是用于防止静态分析工具(例如 GNU“字符串”实用程序或 IDA Pro)正确分析二进制文件的常用技术。这个答案的其余部分假设这对你的二进制文件是正确的。
如何去混淆字符串(动态方法):
如果您能够运行二进制文件,您可以让它为您处理反混淆。您需要做的就是在调试器中运行二进制文件,并在去混淆后分析内存。
一些对其字符串进行模糊处理的二进制文件在使用后不会重新对其进行模糊处理,因此您可能想首先尝试的一个有趣的捷径是在调试器中运行二进制文件并在它退出之前中断执行。如果字符串仍然经过去混淆处理,您可以对相应部分进行内存转储以保存去混淆处理的字符串。 (这不一定会为您去混淆所有的字符串;您只会得到沿着二进制执行路径去混淆的字符串)
如果之前的方法对您不起作用,请尝试在混淆字符串的第一个字节上设置硬件写入断点,然后运行二进制文件。如果断点跳闸,请逐步执行说明以允许对字符串的其余部分进行去混淆处理。如果反混淆总是发生在一个公共例程中,您可以在该例程的末尾附近放置一个断点,并可能编写您的调试器以在每次执行通过该例程时打印去混淆的字符串。
一旦你有一个去混淆字符串的列表,你可以将它们直接修补到 IDA 数据库中(下面讨论),或者你可以在每个字符串的地址中留下可重复的 cmets(使用' 键)数据库,这样去混淆的字符串将显示为每条引用它的指令的注释。
对于小型二进制文件,您可以不用手动进行注释,但值得阅读 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 中没有“撤消”功能,因此一个小的编码错误可能会破坏您的整个数据库。
祝你好运!