分析国内某类游戏资源
2011-11-04 10:56
330 查看
之前做了好多分析的准备,由于是具体的游戏,所以这里省略很多图片和敏感信息,只是作为一个知识积累,学习过程,把自己的心得放在这里。
这是一类游戏资源的分析方法,因为他们打包方式都比较相同,希望以后分析的时候能够更加准确。
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?
DetourRestoreAfterWith();
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)decode, hook_decode);
// DetourDetach(&(PVOID&)decode, hook_decode);
DetourTransactionCommit();
进行相关函数的HOOK,这个HOOK的过程代码如下:
view
plainprint?
#define DECODE 0x0044CB90 //目标函数的地址,通过ollydbg查到READFILE函数地址
typedefint (*Func_decode)(void *addr ,unsignedlong size);//hook函数格式一定要跟READFILE一样的参数以及返回值
Func_decode decode = (Func_decode)DECODE;
//自己做的函数,里面调用了目标函数
int hook_decode(void *addr,unsignedlong size)
{
//通过目标函数前面的push的数据可以分析到目标函数的参数
int mysize = size;
void *myaddr = addr;
//这里调用了目标函数
__asm
{
mov ebx,mysize
push ebx
mov ecx,myaddr
push ecx
mov ecx,0x0012EA38//this指针的值(这可以通过ollydbg查到)这个是实现类成员函数关键,不然会出现程序崩溃,上面汇编代码基本与ollydbg查看到的一致。
call decode
}
//目标函数执行完后,将它产生的明文保存到文件中
FILE* fp;
fopen_s(&fp, "xxx_result.txt", "wb+");
fwrite(addr, sizeof(char), size, fp);
fclose(fp);
//一些恢复工作(主要是ESP);不是必需的,但没有的话目标进程可能会出错
__asm
{
leave
retn 0x8//一般是4*参数个数,如果堆栈不平衡,容易导致程序崩溃
}
return 0;
}
最后进行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
这是一类游戏资源的分析方法,因为他们打包方式都比较相同,希望以后分析的时候能够更加准确。
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?
DetourRestoreAfterWith();
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)decode, hook_decode);
// DetourDetach(&(PVOID&)decode, hook_decode);
DetourTransactionCommit();
进行相关函数的HOOK,这个HOOK的过程代码如下:
view
plainprint?
#define DECODE 0x0044CB90 //目标函数的地址,通过ollydbg查到READFILE函数地址
typedefint (*Func_decode)(void *addr ,unsignedlong size);//hook函数格式一定要跟READFILE一样的参数以及返回值
Func_decode decode = (Func_decode)DECODE;
//自己做的函数,里面调用了目标函数
int hook_decode(void *addr,unsignedlong size)
{
//通过目标函数前面的push的数据可以分析到目标函数的参数
int mysize = size;
void *myaddr = addr;
//这里调用了目标函数
__asm
{
mov ebx,mysize
push ebx
mov ecx,myaddr
push ecx
mov ecx,0x0012EA38//this指针的值(这可以通过ollydbg查到)这个是实现类成员函数关键,不然会出现程序崩溃,上面汇编代码基本与ollydbg查看到的一致。
call decode
}
//目标函数执行完后,将它产生的明文保存到文件中
FILE* fp;
fopen_s(&fp, "xxx_result.txt", "wb+");
fwrite(addr, sizeof(char), size, fp);
fclose(fp);
//一些恢复工作(主要是ESP);不是必需的,但没有的话目标进程可能会出错
__asm
{
leave
retn 0x8//一般是4*参数个数,如果堆栈不平衡,容易导致程序崩溃
}
return 0;
}
最后进行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
相关文章推荐
- 游戏汉化教程2-资源分析
- HTML5+JS 《五子飞》游戏实现(二)路线分析和资源准备
- 手机游戏资源 特效 显存分析工具
- Adreno Profiler分析任意安卓游戏特效+抓取资源
- Adreno Profiler分析任意安卓游戏特效+抓取资源
- 看了GAL游戏资源文件黑盒分析,想起以前做的一个提取器,发来大家共享一下
- Adreno Profiler 分析任意安卓游戏特效、抓取资源
- 一个最简单GAL游戏资源文件黑盒分析(二)
- 一个最简单GAL游戏资源文件黑盒分析(二)
- Adreno Profiler分析任意安卓游戏特效+抓取资源
- 国内社交游戏现状分析
- Android 游戏引擎libgdx 资源加载进度百分比显示案例分析
- Adreno Profiler分析任意安卓游戏特效+抓取资源
- 一个最简单GAL游戏资源文件黑盒分析(一)
- Adreno Profiler分析任意安卓游戏特效+抓取资源
- Adreno Profiler分析任意安卓游戏特效+抓取资源
- Adreno Profiler分析任意安卓游戏特效+抓取资源
- Adreno Profiler分析任意安卓游戏特效+抓取资源
- 一个最简单GAL游戏资源文件黑盒分析(一)
- Adreno Profiler分析任意安卓游戏特效+抓取资源