分析国内某类游戏资源

来源:互联网 发布:苗族舞蹈服装淘宝 编辑:程序博客网 时间:2024/06/03 06:43

之前做了好多分析的准备,由于是具体的游戏,所以这里省略很多图片和敏感信息,只是作为一个知识积累,学习过程,把自己的心得放在这里。

这是一类游戏资源的分析方法,因为他们打包方式都比较相同,希望以后分析的时候能够更加准确。

1.静态文件分析

拿到游戏客户端,首现观察文件内容,除了exe,dll,等程序文件,只有cfg的配置文件,通过十六进制编辑器WinHex查看文件内容,发现xxx.cfg是相关客户端的一些配置信息,但是xxxPatch.cfg是非明文的配置信息,猜测有可能经过加密处理。

看到文件开头为PK,突然想到之前分析ZIP文件头时遇到就是这个标志。自己生成一个内容为空的ZIP文件,可以发现首部信息也是PK,这样就能确定,xxxPatch.cfg经过了压缩。

然后修改xxxPatch.cfg为xxxPatch.zip然后使用WinRar尝试打开,可以发现具体的文件名为xxxPatch.dat,大小为744,CRC32的校验值为0,而且是经过加密的。通过静态文件分析只能得到这些内容,只能依靠动态调试去找其他的信息了。当然我这样比较菜的通过静态文件只能看出如上内容,大牛莫笑。


2.利用OllyDbg进行动态跟踪

首现修改OD对异常处理的设置,忽略所有异常,避免分析的时候在系统领空等出现的问题,对OD的分析造成中断。

查看当前应用程序使用了哪些系统API函数,可以在反汇编区域,右键点击随意语句通过查找--->当前模块中的名称(标签)。

之后直接输入常用读取文件类型的API,例如:fopen,OpenFile,CFile类,fstream类。如果当前模块中有调用这些系统函数,在OD中可以显示出来。


如果存在查找的函数,在当前函数上右键,选择查找输入函数参考。

可以看到在当前模块中,有那些语句调用了fopen(),之后在这些函数上全部打上int 3断点。

然后回到OD的反汇编界面上,使用F9运行应用程序,可以发现遇到断点后,OD会自动停在断点处。而此时也可以通过堆栈窗口看到两个比较“敏感”的数据。

跟踪到call fopen的时候,可以发现堆栈窗口出现了之前确定的关键数据,xxxPatch.cfg,可以知道这个函数及其上下调用函数都是对cfg这个压缩加密文件进行处理的。之后使用Ctrl+F9从当前函数中运行出来,回到上级调用者的函数部分,找到其首地址,0x004AA360,然后使用IDA Pro进行辅助分析。



3.分析阶段

通过IDA的HexRays插件可以反编译这部分代码。能通过高级语言去识别具体的函数调用过程。然后结合OD的分析,基本可以将称这部分的大致流程分析出来。



定位到最底层调用的CZipArchive::ReadFile,可以通过OD看到,传入堆栈的参数。


unsigned int __thiscall CZipArchive::ReadFile(CZipArchive*this, void *pBuf, unsigned int uSize)

结合IDA逆向出来的参数列表,可以知道uSize为0x2e8换算成十进制也就是744,跟之前WinRar打开时信息一模一样,可以证明,这里确实是要解析加密文件。pBuf这个指针就是分配的内容空间的地址0x02db0020(这个内存地址每次分配的不同),最后一个就是ecx的this指针。

进入这个函数,最终调用的是this->m_pCompressor->vfptr->Decompress(this->m_pCompressor,pBuf, uSize);这个函数。

此时OD监控的内存地址为0x02c30020,执行过这个call之后,会发现,内存中的数据从0变成了明文。而这部分数据,也既是xxxPatch.cfg的真实内容。


截至现在明文数据只是出现在内存中,继续往下分析,Decompress内的算法过于复杂,使用高级语言模拟还是比较耗时费力的。这里就想到使用HOOK技术,在解密后,直接将内存中的数据保存出来。




4.HOOK分析

解密方法大致分为三种:

A.     算法还原,即通过阅读其汇编代码来归纳出高级语言可以描述的解密方法,多用于简单的解密算法。结合之前的分析,这个不适合使用算法还原进行解密。

B.     黑盒调用,即在游戏的空间中直接调用解密函数,可采用dll注入。这个对于某些已经封装的DLL,在知道具体函数参数列表的时候,可以使用LoadLirary进行加载,然后予以调用,而xxx是exe中的函数,也没有导出表予以其他程序使用。

C.     HOOK解密函数,即在dll或者静态代码段中截获游戏对该函数的调用,可采用detours库。

对于算法还原,还要追究其算法思想,可能也只针对算法简单的,这个可以作为学习对象,但不是必须的。

黑盒调用,多用于解密算法比较复杂的情况,要分析出函数的参数与返回值,要构造KEY与BASE空间。

在这里,主要采用第三种,借用DETOURS库函数来实现HOOK。



下载Detours2.1库,此库为微软免费提供给开发者,能够对API,还有制定函数地址的函数进行HOOK,屏蔽了很多底层的操作,所以这里选Detours进行HOOK。 

之后还需要进行编译,因为HOOK程序需要使用到其中的静态库。

A.安装VS2005/VS2008,当然MicrosoftPlatform SDK也是一起安装好的。

B.使用VS的命令行编译方式:D:\Windows\System32\cmd.exe /k ""D:\Visual Studio 2008Professional\VC\vcvarsall.bat"" x86

C.通过命令进入Detours的目录,使用nmake这个命令就能看到编译器开始工作。


5.编写代码,进行解析

编写DLL,然后通过Detours的setdll.exe进行dll注入,所以要建立dll工程。

之后就是使用Detours提供的hook接口。之前的Blog也发过如何使用Detours。

view plainprint?
  1. DetourRestoreAfterWith();  
  2. DetourTransactionBegin();  
  3. DetourUpdateThread(GetCurrentThread());  
  4. DetourAttach(&(PVOID&)decode, hook_decode);  
  5. // DetourDetach(&(PVOID&)decode, hook_decode);  
  6. DetourTransactionCommit();  

进行相关函数的HOOK,这个HOOK的过程代码如下:

view plainprint?
  1. #define DECODE 0x0044CB90           //目标函数的地址,通过ollydbg查到READFILE函数地址  
  2. typedefint (*Func_decode)(void *addr ,unsignedlong size);//hook函数格式一定要跟READFILE一样的参数以及返回值  
  3. Func_decode decode = (Func_decode)DECODE;  
  4.   
  5. //自己做的函数,里面调用了目标函数  
  6. int hook_decode(void *addr,unsignedlong size)  
  7. {  
  8.     //通过目标函数前面的push的数据可以分析到目标函数的参数  
  9.     int mysize = size;  
  10.     void *myaddr = addr;  
  11.     //这里调用了目标函数  
  12.     __asm  
  13.     {     
  14.         mov ebx,mysize  
  15.         push ebx  
  16.         mov ecx,myaddr  
  17.         push ecx  
  18.         mov ecx,0x0012EA38//this指针的值(这可以通过ollydbg查到)这个是实现类成员函数关键,不然会出现程序崩溃,上面汇编代码基本与ollydbg查看到的一致。  
  19.         call decode  
  20.     }  
  21.     //目标函数执行完后,将它产生的明文保存到文件中  
  22.     FILE* fp;  
  23.     fopen_s(&fp, "xxx_result.txt""wb+");  
  24.     fwrite(addr, sizeof(char), size, fp);  
  25.     fclose(fp);  
  26.     //一些恢复工作(主要是ESP);不是必需的,但没有的话目标进程可能会出错  
  27.     __asm  
  28.     {  
  29.         leave  
  30.         retn 0x8//一般是4*参数个数,如果堆栈不平衡,容易导致程序崩溃  
  31.     }  
  32.     return 0;  
  33. }  

最后进行Build,生成crack.dll,此时要把相关的 detours.dll,detoured.dll文件拷到C9目录下,这是DETOURS库要求,以免产生XX纠纷(题外话,这个地方一度让进度无法继续)。

使用Detours提供的setdll.exe是把dll(这边是已经生成好的crack.dll,如何生成在后面介绍)注入到想要破解的.exe里,因此是起关键作用,实现挂钩子。

运行一次xxx.exe,就会生成xxx_result.txt文件,里面保存的就是所要的明文。至此,破解过程已经结束。

还有就是,这次是在内存找到具体内容,然后通过HOOK方式进行解析,比较取巧。因为加密压缩文件里面只有一个文件,如果是多个文件夹和文件的逐层嵌套就要复杂一些。

这个也同步发到看雪论坛上面,毕竟很多东西都是从那里学习的:http://bbs.pediy.com/showthread.php?t=142319


转自 http://blog.csdn.net/fishyuule/article/details/6933606