【文章标题】: 网络游戏QQ幻想初步分析
【文章作者】: dreaman
【作者邮箱】: dreaman_163@163.com
【作者主页】: http://dreaman.haolinju.net
【软件名称】: QQ幻想
【软件大小】: 500M以上
【下载地址】: 腾讯官方网站
【加壳方式】: 无壳
【保护方式】: 无
【编写语言】: VC
【使用工具】: idapro4.9+IdaHTML插件+Ollydbg1.1+OllyHTML插件
【操作平台】: windows
【软件介绍】: 由腾讯推出的一款网络游戏
【作者声明】: 主要目的是研究DHTML脚本插件配合idapro与ollydbg的作用,请勿乱用本文提供的技术,否则后果自负:)
--------------------------------------------------------------------------------
【详细过程】
  我现在要写的分析与论坛中常出现的破解不大一样,是另一类型的,主要在于理解目标程序的功能实现,这主要侧重于理解目
  标程序的结构与大概的动态流程,倒是不太在意某个细节算法是如何实现的。为了吸引大家的兴趣,特地找一个网络游戏分析
  分析,呵呵,只是简单分析一下。
  偶有一个朋友给我的QQ幻想帐号,所以就选这个游戏了,呵呵,但没想到一下就碰到个麻烦的,这个游戏每周四更新一次,也
  就是说如果一周还分析不完,就得从头来了,晕。
  第一次试手,不敢把目标定的过高,就试着寻找这个游戏的控制部分吧,先看看捡东西。
  
  (注:论坛上好象没看到分析网络游戏的文章,不知道是不是有什么忌讳,如果有的话,老大请声明一下或者把这个贴删除。)
  
  俗话说“磨刀不误砍柴工”,文人则说“工欲善其事,必先利其器”,所以我们开始之前,先把工具准备好,而且也要磨一
  下,我们要用的工具是idapro 4.9,这是把静态分析的宝刀,偶另外还准备了一把小刀IdaHTML插件,另一个工具是Ollydbg1.1
  ,这是动态调试分析的利剑,偶也为它配了一柄小剑OllyHTML插件,这宝刀与利剑乃当世神器,它们是不需要再磨的了,
  所以偶指磨刀之事,主要是偶配上的小刀与小剑,需要为它们写脚本与更改脚本,之前偶已经写过几个脚本了,IdaHTML的脚本
  是ClassGraph.htm,用于依据VTBL分析一个C++程序类簇与类继承关系的,OllyHTML的脚本是NewProc.htm与RunFlow.htm,前者
  是利用Ollydbg的Hit Trace功能通过比较两次Hit列表确定特定过程列表的,后者主要用于在前者得出的列表基础上通过动态执
  行绘制这些过程的时序流图,这几个脚本都在插件菜单Scripts里有链接。
  
  一、静态分析,获取可能(仅仅是可能,呵呵)的C++类、类簇以及继承关系图。
  
  这一步其实比较简单,就是
  1、用idapro打开QQFO.exe,先让idapro分析完成,需要几分钟的时间吧(idapro还是比较仔细的,呵呵
  ,所以慢了点儿);
  2、idapro分析完后先保存一下idb文件,免得后面程序搞死了还得重新分析一遍:(;
  3、现在点文件菜单=>IdaHTML Scripts,连接偶的站点取脚本列表(或者你可以先从网站另存好ClassGraph.htm,这里就用IdaHTML
  Load HTML菜单了,比较快一些),然后点“分析.rdata的VTBL构造类继承图”;
  4、在打开的界面中点"Analysis"按钮,这个过程也比较费时,所以请耐心等待,过程中IE窗口会不响应,不要理它,如果提示
  脚本运行缓慢时,是否要停止脚本运行时,不要停止,让脚本继续(分析结果保存的文件请不要删除,后面有用,呵呵)。
  
  二、动态调试,确定与目标相关的过程。
  
  开始之前先废句话,好象目前没见过谁用Ollydbg的Hit Trace功能,可能是因为HitTrace的记录对人工处理显得过于繁杂了,不
  过在脚本中处理这些信息就比较轻松了,我觉得Hit Trace功能是非常不错的用于查找特定过程的方法(当然用Run Trace然后作
  统计也可以找到只执行一次的过程,不过Run Trace好象比较慢,特别是程序存在许多循环调度的时候,比如消息循环与网络通信
  循环,另外,如果程序是新执行了过程,然而并不是只执行一次或很少的几次,从Run Trace的统计结果中也不太容易分析出这些
  过程来)。
  1、先运行游戏(因为游戏会退出自动更新完了再启动,所以只好用Attach来调试),登录进去;
  2、用Ollydbg附加到游戏进程上,按F9让游戏继续执行(不要等待,否则游戏会认为网络断开而重启);
  3、让CPU窗口显示QQFO.exe模块的指令,Ctrl+A分析代码;
  4、点插件菜单OllyHTML=>Scripts,还是连接偶的站点取脚本列表(还是可以先从网站另存好NewProc.htm与RunFlow.htm,这样就不用等待连接网站而直接用Load=>HTML菜单了),然后点“利用两次Hit列表比较来获取特定过程列表;

 


 
  5、在CPU窗口查找Od标出的第一个过程地址0040102C,将它输入到插件IE窗口的“首过程地址”处,点“Hit所有”;

  6、回到游戏中,尽可能的做除捡东西外的其它动作,以让游戏运行过大多数捡东西时公用的过程;
  7、在插件IE窗口点“取第一次”;
  8、回到游戏中,捡个东西(记得6中一定要打出东西来但是不捡);
  9、在插件IE窗口点“取第二次”,然后点“比较”,这时窗口上面列出第二次HIT第一次没HIT的过程(可以认为是与捡东西这个
  动作相关过程了);
  10、在插件IE窗口点“清除Hit”;
  11、有时候做一次Hit比较发现的过程可能比我们要找的相关过程数目多许多,这时需要对发现的过程作二次Hit比较或三次、四
  次比较,方法如下:
  a、插件窗口中列出的是前一次比较得到的过程列表;
  b、点“Hit列表”;
  c、回到游戏作除目标动做外的其它动作;
  d、点“取第一次”,回到游戏做目标动作,再到插件窗口点“取第二次”;
  e、先清空插件窗口的当前过程列表,再点“比较”,这时列出本次比较得到的过程列表;
  f、点“清除Hit”,如果本次得到的过程数较a中过程数少,从b开始重复上述操作,直到过程数不再减少,可认为最终列出的过程
  是严格与目标操作相关的过程(因为每次做那个动作都会执行这些过程,而不做那个动作的时候不会执行)。
  (这一步发现这小剑不够锋利,需要再磨炼磨炼了,那个重复直到过程数不再减少(b~f循环)明明是应该工具更智能一些的嘛!)
  
  三、动态调试,确定与目标相关过程的动态流图。
  
  这一步主要是继续对第二步发现的过程的探索,也就是理清与特定过程相关的那些过程是一个怎样的执行顺序。这次我们使用脚本
  RunFlow.htm。
  1、首先将第二步中得到的过程列表存为文本文件pick.txt,我取到的内容如下:
  00428FF2
  0042959B
  00429645
  0042A417
  00437AF4
  004380A3
  0043F5E6
  0043FA16
  2、首先运行游戏,然后运行Ollydbg.exe,并使用Attach调试游戏程序,按F9让程序继续运行;
  3、点插件菜单OllyHTML => Scripts,等链接到网站的脚本列表后,点“对给定地址列表下断动态跟踪绘制过程动态流图”;
  4、在打开的IE窗口中点“Start”按钮,选中1中准备好的文件pick.txt;
  5、切换到游戏,捡个物品(如果没有就打怪打出来再捡),在捡的时候会在游戏与Ollydbg间来回切换,这是脚本在记录执行的过程,最后游戏会继续运行(视过程列表涉及到的过程而定,有时可能会一直切换,此时在一段时间后直接进行6操作);
  6、在IE窗口点“Stop”按钮,稍后会发现绘制出的流图(如果5中是一直来回切换,点此按钮后请清除全部断点让游戏继续运行);
 
  7在IE窗口点“Save”指定一个文本文件保存生成的流图,稍后我们可以直接装入查看流图,现在可以退出游戏了。
   
  四、再次静态分析,得到近似的结果。
  
  现在将前面得到的结果结合idapro的功能作进一步分析,试图找到与捡拾相关的过程入口及游戏中相关的类及类簇(极可能是游戏的
  角色控制类)。
  
  1、再次打开idapro并打开qqfo.idb,然后点文件菜单=>IdaHTML Scripts,在链接到脚本列表后点“分析.rdata的VTBL构造类继承图”
  ;
  2、在IE窗口中点“LoadGraph”按钮,指定第一步生成的文本文件,这时会看到IE窗口左下角的列表中出现一些地址,双击某个地址
  即绘制对应此地址的VTBL类的一簇类的类继承图;
  3、对应第二步中得到的流图的,我们依次查看各个过程的被调用图(就是程序如何到达指定过程的),比如流图中的首过程是0043FA16,我们首先在idapro的反汇编视图的地址列表(就是显示在左边的地址处)上右键=>jump to address ...,输入过程地址,确定后跳到指定过程的反汇编码,
 
然后选中idapro给出的过程名sub_43FA16,再点工具栏上的工具,显示程序是如何到达指定过程的
  ;

  4、从生成的图上我们可以清楚的看到程序有两条路径到达指定过程,一个是从winmain相关的过程过来的,一个来自一个数据段的引用0050C7F0,我们看一下数据段的引用是什么样的(为了同时看多个地方过程的反汇编代码,我们这里新打开一个反汇编窗口):
  
  ,呵呵,有点巧,这里一行字符串一行过程地址,显然过程是与字符串相关的功能实现,估计是供脚本用的了:)另一条通路从winmain过来的,我就没有细看了,感觉那个可能发现不了什么(这可不确定);
  5、用4中方法依次看看流图上的各个地址,因为我们是想找到与之相关的C++类,所以我们期望有一条路径来自.rdata段的引用,可能是捡东西这个行为许多是纯数据的吧,在前面的过程我没发现有与.rdata相关的通路,直到最后的几个过程,终于发现了与.rdata相关的东东,比较巧,后面的几个都是与同一个.rdata的引用相关,这个引用的过程是0043F3EC;

  6、现在我们用文本编辑器(notepad也可以)打开第一步生成的文本文件,搜索一下前面的.rdata段引用的过程地址:0043F3EC,
  
  class:004F3AC8
  =>member:0043E45C
  =>member:0043F3EC
  =>member:004076FF
  
  发现它属于类004F3AC8,然后我们搜索004F3AC8,到.graph--------------后面的段落
  
  .graph--------------------------------------------------------
  004F3AC8
    004F38B4
    004F3880
  
  知道这个类出现在继承图004F3AC8
  ;
  7、现在可以回到IdaHTML窗口,双击列表中的004F3AC8,看一下这个类簇的继承图。
  
  
  没想到分析一个网络游戏还是比较复杂的,后面我就没有时间继续下去了,手头的工作比较忙:(
  不过从前面这个过程应该大致可以看到与捡东西有关的主要过程了(后来发现了那个字符串与过程地址的对应表,这说明通过字符串查找
  也可能找到与捡东西相关的过程,不过我主要是试验一下DHTML脚本配合idapro与ollydbg进行静态分析与动态调试,所以没有去研究字符
  串参考的问题),我们也得到了一个与之相关的类簇及继承关系图,只是这个类与捡东西的过程看起来比较远,可能并不是捡东西的功能
  实现(我一直认为是游戏的角色控制类,呵呵,不知道对不对)。
  另外,我没有什么破解经验,相关知识也比较有限,而且是第一次写破文(好象还算不上:),大家将就着看看,呵呵。
  
  
  
  
  
--------------------------------------------------------------------------------
【经验总结】
  还是按规矩写点总结吧(不过就别期望太高了,菜鸟也做不出什么好的总结)
  1、分析程序特定功能与破解一样,主要在找到相关的过程,对于游戏这样的实时性程序,不便于手动跟踪或使用Run Trace
  (游戏会认为失去网络连接而重启),消息断点等也不太适合,这时用多次比较Hit Trace的Hit列表来发现目标过程是一个
  不错的选择;
  2、DHTML+javascript所提供的丰富数据类型与对象模型有助于在静态分析与动态调试的自动化中引入较为复杂的算法,实
  现比较复杂的辅助功能(或者说可以实现比较复杂的手工过程的自动化,我估计在破解中分析目标程序算法的过程也能被部
  分自动化)。
  
--------------------------------------------------------------------------------

                                                       2006年04月16日 00:40:17