逆向工程加密方法

逆向工程 密码学
2021-06-25 17:11:18

几天后,我开始对一个小游戏进行逆向工程。该游戏包含一些数据文件,其中存储了 3d 文件。我想编写一个小软件,我可以在其中添加自己的 3d 模型,以改进(自定义)该游戏。

幸运的是游戏是在调试模式下编译的,所以我可以清楚地看到所有方法名称、c++类等,所以我清楚地知道代码中特定地方发生了什么。由于我是逆向工程的新手(但不是开发新手),我已经弄清楚了很多代码库并重新实现了许多与“游戏的数据管理”相关的东西。

我看到,在反汇编的代码中,有一个解密文件的类。使用两种方法。初始化解密器并读取字符。由于我不擅长“逆向工程”和加密算法(我什至不知道使用的加密是已知算法还是自己的算法),我希望你们能帮我弄清楚到底发生了什么方法,所以我可以在 C++ 中重新实现它。

我将包括 asm 部分和伪 c 代码(由我的反编译器生成)。请注意,这些方法是类的一部分。所以我会给你一些关于我到目前为止所想出的额外信息。我希望你们能帮助我。

Decryptor init 方法:(edi + 0x100 + offset) 似乎是一个大小为 128 字节的 char 数组,但我无法弄清楚其余部分(它似乎与 char 数组一起使用,但就像提到的那样,我没有那么多RE的经验)

ASM 代码:http : //pastebin.com/LiM10Cr5

伪 C:http : //pastebin.com/1ewfxAh1

解密器解密下一个字符方法:

(edi + 0x200) 似乎是一个字符(字节),其中存储下一个字符或类似的东西。

ASM 代码:https : //pastebin.com/aWp8LYua

伪 C:https : //pastebin.com/u4w5yGYS

如果你需要更多的信息,就像上面提到的,应用程序是在调试模式下完全编译的,所以它就像一个梦想......我有所有标签,所有 vtables,所有信息......

我还有一个 read 方法,这两种方法都会被调用,但我想我已经正确地对该方法进行了逆向工程(我希望如此)......

谢谢 :)

1个回答

加密绝对不是一个“好”的。检查您的nextDecrypt函数中发生了什么

nextDecrypt 函数

有一个变量ebx+0x200被加载到edx. 此变量增加 1,然后写回ebx+0x200,并且此变量还用于在返回该字节之前xor用某个字节(低字节ecx,即cl进行编辑所以我们有一个非常简单的算法,它xor每个字节都 s,每次xor都增加 ed的值

有一些特殊的外壳;xor值避免了值0; 如果值为0xff,则将其设置为1而不是递增。此外,返回的值被否定,并且您的反编译器在此处出错;!运营商应该是一个~为那是什么not汇编指令。(你应该使用反编译的 C 作为第一眼的另一个原因,但总是查看汇编代码以了解真正发生的事情)。

初始化

初始化函数似乎有点复杂,直到你意识到do..while循环中有 8 个相同的块可能是编译器展开的内部循环。它似乎在 处稍微移动字节[edx+0x100],并在 处创建索引映射[ecx]它做的最后一件事似乎初始化xor从价值nextDecrypt0x7f但是第一部分似乎有些不对劲;您的代码可以访问,arg_4但只有一个arg_0. arg_4似乎会影响字节混洗器的步骤。

这就是静态分析代码的意义所在;逆向者此时应该做的是在调试器中运行该事物,并单步执行这两个函数,检查数据缓冲区如何变化,以验证这些假设。例如,我会验证“将 xor 值初始化为 0x7f”假设不能单独从您的代码中检查,但在调试器中,您可以检查地址是否确实相同。此外,了解这些论点在现实世界中的价值是什么,以及它们来自哪里也会很有趣。

概括

所以,总结一下:这似乎是作者发明的一种“加密”机制,而不是标准机制;这并不复杂;并且您需要对软件进行一些动态分析,以了解其功能的正确细节。

附加说明

在这种情况下,提供尽可能多的信息是有意义的,例如,您要破解的游戏的名称。例如,在 IDA 中加载二进制文件比纯文本源代码更容易分析,人们实际上可能能够运行代码并对其进行一些假设测试。