如何在Windows应用程序中反向工程加密数据包?

5
我有一个Windows exe应用程序,曾经以明文方式发送数据包到服务器。这个应用程序(我们称其为客户端应用程序)肯定是封闭源代码的,但一些聪明的黑客通过十六进制编辑二进制文件,使其发送混淆的数据包。
现在,显然,这些数据包以一种可解密的方式进行了混淆(否则服务器将无法理解它),但我想做的是编写一个模拟器来模拟此二进制应用程序,向服务器发送相同的数据包,并能够解密响应(如果它被混淆)。
十六进制编辑的客户端需要一个额外的dll才能运行,而旧客户端则不需要。我假设十六进制编辑的客户端成功加载了该dll(我们称其为client.dll),该dll的功能是通过挂钩某些Windows API来重新路由从client.exe进程发送的所有数据包来实现混淆/解混淆。
如果有人能指导我如何开始研究所有这些工作,以及如何反向工程化混淆,那将非常感激。
我不知道要提供什么样的信息,但如果有任何缺失,请回复,我会发布更多细节,如果有人想要二进制文件,我很乐意提供。

任何感兴趣的人都可以进行二进制下载:

http://dl.getdropbox.com/u/46623/client.dll

http://dl.getdropbox.com/u/46623/newClient.exe

http://dl.getdropbox.com/u/46623/originalClient.exe

这些无法运行是因为需要资源文件 - 它们大约有3GB,所以太大了无法上传到任何地方。名称已更改以保护罪犯的身份 =),但这可能无法保护dll的名称...

2个回答

3
我假设编写此程序中添加数据包I/O加密的钩子的人已经挂钩了相关的Windows套接字API(WSASendsend等),或者挂钩了用于发送/接收数据的内部程序函数。
鉴于此,我建议您使用钩子检测程序(例如RkUnhooker)来查找实际上被挂钩的内容。一旦您知道哪些API被挂钩,您也应该知道这些钩子从哪里去了,然后您就必须手动反向工程挂钩函数。
至于学习如何做到这一点,我无法为您指定只有一个教程可以教您所有的东西,但我强烈建议您查看Tuts4You网站,它有大量的教程,可以满足您的所有需求。
如果可能,请上传编辑过的客户端和钩子DLL的副本,如果我有时间,我将为您编写复制加密和解密函数。

感谢提供帮助 - 如果您愿意,我可以上传二进制文件和DLL,但是如果没有支持的资源文件,您将无法运行它,这需要庞大的3GB(毕竟这是一个游戏客户端)。不,我不是在尝试作弊,只是在尝试模拟客户端。 - Chii
1
只需上传钩子模块的副本,我就能从中提取加密和解密算法。 - Irwin
1
现在看起来,它似乎安装了三个钩子。第一个钩子是kernel32.LoadLibraryExW钩子,它阻止加载“wpespy.dll”、“ragmedic.dll”、“netredirect.dll”和“rpe.dll”。另外两个是您常见的ws2_32.send和ws2_32.recv钩子。 - Irwin
你是怎么解决这个问题的?我(除了想让这个模拟器运行起来)也想学习这方面的知识,但我在Win32 API编程方面的经验太少了(我是一名Java开发人员)。 - Chii
关于那些dll名称——是的,它们都是程序,要么窥探数据包(这是被修改过的客户端希望防止的),而netredirect.dll是旧模拟器的一部分,它通过将所有流量从旧客户端重定向到自己来工作(然而,它现在当然已经不起作用了)。 - Chii

2
你需要钩取附加 DLL 导出的函数,并查看调用的函数和传递给它们的参数。由于你没有类型信息(例如 DLL 导出的函数签名),这并不容易。
这里查找有关 API 钩取的一些信息。你还需要一个好的调试器,可以尝试使用微软的Windbg
据我所见,你在这里唯一的选择是黑盒测试,即将已知输入提供给两个系统,并将响应相互比较以查找差异和相似之处。
               +--------------+
Input--------->| Original App |--------->Response1
               +--------------+
+------------+ Input--------->| Modded App |--------->Response2 +------------+
现在,一旦你弄清楚如何使用附加 DLL 中的函数,你就可以像原始应用程序一样自己使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接