我有这个想要编辑的二进制文件,但是在加载它之后,所有的字符串都是某种乱码。反正有格式化吗?
1 回答
为什么你看到“胡言乱语”:
字符串可能被混淆了。 很有可能,在程序中使用每个字符串之前,运行反混淆例程以将内存中的字符串转换回有意义的内容。这是用于防止静态分析工具(例如 GNU“字符串”实用程序或 IDA Pro)正确分析二进制文件的常用技术。这个答案的其余部分假设这对你的二进制文件是正确的。
如何去混淆字符串(动态方法):
如果您能够运行二进制文件,则可以让它为您处理反混淆。您需要做的就是在调试器中运行二进制文件并在对其进行反混淆后分析内存。
一些对其字符串进行模糊处理的二进制文件在使用后永远不会重新混淆它们,因此您可能想首先尝试的一个有趣的捷径是在调试器中运行二进制文件并在它退出之前中断执行。如果字符串仍然经过去混淆处理,您可以对相应部分进行内存转储以保存去混淆处理的字符串。(这不一定会为您去混淆所有的字符串;您只会得到沿着二进制执行路径去混淆的字符串)
如果前面的方法对您不起作用,请尝试在混淆字符串的第一个字节上设置硬件写入断点,然后运行二进制文件。如果断点跳闸,请逐步执行说明以允许对字符串的其余部分进行去混淆处理。如果反混淆总是从一个常见的例程中发生,您可以在该例程的末尾附近放置一个断点,并可能编写您的调试器以在每次执行通过该例程时打印去混淆的字符串。
一旦你有了一个去混淆字符串的列表,你可以将它们直接打补丁到 IDA 数据库中(下面讨论),或者你可以'
在数据库中每个字符串的地址处留下可重复的注释(使用密钥),这样去混淆的字符串将显示为每条引用它的指令的注释。
对于小型二进制文件,您可以不用手动进行注释,但值得阅读 IDA 脚本,以便您可以自动执行此过程。 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 的语法。如前所述,我强烈推荐IDA Pro Book来了解如何编写 IDA 脚本。一旦掌握了基础知识,就可以使用 IDA 的内置帮助索引和IDAPython 文档作为其他参考。
在运行修补代码的脚本之前,请务必保存您的数据库!IDA 中没有“撤消”功能,因此一个小的编码错误可能会破坏您的整个数据库。
祝你好运!