YJX_rxjh_17_3.1.1

3.1.1  喊话功能

ZC: 本节课的找CALL过程 比较曲折,值得回味/学习/总结/参考...

ZC: SuperARC说话,能用此方法吗?

 

  【01:25】找一个突破点:【01:55】输入框 输入文字(这里输入的是"1111111111111111111111111") --> CE搜索喊话内容的地址,【02:33】扫描类型 选"文本" (其实选"字节数组"也能够扫出来,"字节数组"的话 它输入的就是16进制的数字了),【02:50】CE输入的字符串只要是与游戏里面输入的字符串相同或是它的的子集就可以了 --> 【03:05】如果我们CE搜索不到的话,还可以尝试 指定CE搜索Unicode字符串。我们测试的时候输入数字,也就没有了大小写的分别了 --> CE找到 好几处地址 --> 【03:40】游戏中输入"2222222222222222222222222" --> 【03:45】CE输入"2222222",再次扫描 --> "aaaaaaaaaaaaaa"/"aaaaaaa" 再次扫描 --> 就剩两个地址(一个基址 & 一个非基址)

    【04:25】CE中 选中 某一行,双击 列"类型"对应的信息 --> 将"长度"设置大一点

    【04:55】CE里面修改 找到的两个地址对应的 字符串值 ==> 发现 绿色基址 对应的是 喊话内容

      【05:20】游戏中 按下回车键(也就是喊话),发现喊话的内容是 那个非基址对应的字符串内容... 也就是 这里才是真正存放喊话内容的地方

      【05:47】他猜测 这个绿色基址 是VC和文本框关联的一个变量,∴它才会是基址

      【06:10】在CE中修改 非基址对应的字符串内容,此时 游戏中喊话内容输入框里面没有任何喊话的内容  直接按回车键,它也能喊出 非基址对应的字符串内容

  【07:05】游戏中 按下回车键的时候,什么地方读取了 非基址对应的字符串的内容,(CE “查找读取该地址的代码”) 就在 喊话CALL的附近了

  【07:38】CE --> 设置 --> 标签"代码查找" --> 我们尽量使用"使用调试寄存器(硬件断点)"。【07:45】这里我们使用 "外部寄存器"来试一下:

    

    【08:00】CE使用 "外部寄存器" 会降低游戏的速度,还有可能是游戏崩溃。但是 我们还是试一下,这样找到的地址会多一些,【08:08】CE“查找读取该地址的代码”

      【08:20】游戏中 按下回车键,CE中多了 3条指令

    【09:08】CE再用 "使用调试寄存器(硬件断点)" 找一下 --> 【09:20】CE“查找访问该地址的代码” --> 游戏中 按下回车键 【09:31】此时 只多出了一条汇编指令,鼠标移动之后 立马又多出了 4条汇编指令,在角色头顶出现文字时 有多出了3条指令(ZC: 这里到底和鼠标移动有没有关系 仅看视频中的现象无法确认)

      【09:35】他 说同样还是这几个地址(ZC: 我怎么看到的是不一样啊...)

    【10:23】这一句指令比较重要(ZC: 是∵看到了 指令lea了么?),它是一个 偏移+基址 的形式出现的(ZC: 貌似他关心的点 并不是 lea...)(ZC: 光从这里的指令看来,毫无基址的迹象,只有分析了上面的几条指令后,才看到基址...)

    【10:55】CE的分析工作 基本做完(ZC: 他只关心 0x0055bd?? 和 0x005ae1b0 的指令,其他直接忽略了)

  【11:52】不断 猜测->证实 的过程

  【12:00】指令0x005ae1b0处 下断,游戏中按下 空喊话内容的回车键。空喊话内容的回车键 就能断下来的话,理论上来说 喊话CALL应该还在断点的下侧

    【12:30】具体是哪个CALL,我们可以截获一下 封包的一个CALL

    【12:45】加一个断点 "bp WSASend"

    【12:55】游戏中输入字符串 回车,先在WSASend处断下,后在0x005ae1b0处断下,说明 喊话CALL在 0x005ae1b0的前面(ZC: 这个就不太好弄了,下面视频中的方式就不是这个方式。我想到一个费力的方式:WSASend断下后 堆栈回溯,肉眼观察回溯到0x005ae1b0的相同函数中 然后在分析。)

      【13:25】于是就选择 我们摘抄下来的最前面的一个指令处0x0055bd8f

      【14:05】这里一个 0x13C (ZC: 前面有提到 0x13C吗?0x005ae1b0处?确实是那里)

      【15:05】0x0055bd8f 断下来之后,一直F8 看看哪里会∵WSASend而断下来  【15:18】来到WSASend断点处之后 按减号"-" 退回来

        【16:20】ZC: 这一段 好长啊,分析起来 要人命的...

        【17:35】用代码测试器来测试 (ZC: 主要是验证 这里是不是喊话CALL,以及 看看我们猜测的参数[个数&内容]是否正确)

          【18:55】代码测试试成功的 没有错误,但是 不能喊话(ZC: 如果是我的话,估计这里就pass掉了,以为找错地方了 直接跳过...),要能够喊话 需要怎么办呢,【19:05】需要用CE在我们搜索到的地址处设置喊话的文本(ZC: 用代码来设置应该也是可以的)  【19:12】此时 再注入代码 游戏里面还是没有喊出话来... 然而此时 在游戏中直接按回车键 是可以喊出话来的,说明我们这里有可能就找错了  【19:43】这里的ebx可能是变动的【19:49】参数写错了 0x3ed-->03eb 【20:02】再次CE设置喊话内容,测试喊话CALL【20:12】游戏里面还是喊不出来  【21:30】测试代码 改成 直接 CALL绝对地址,再来最后测试一下,不行的话 它要放弃了。测试不成功 放弃这个CALL了...

  【22:08】攻这个地址 0x0055bd9d,和刚才差不多 pass

  【22:22】攻这个地址 0x0055bdfa,还是 和刚才差不多 

  【23:10】有回到 地址0x005ae1b0 ...

    【24:08】函数头部下断,马上就断下来(ZC: 是我 我这里就放弃了...),他也放弃了,尝试换一种方法...

  【24:38】又攻这个地址 0x0055bd8f.

    【24:57】跟进入 刚才我们认为是喊话CALL的函数。在这个函数里面跟的时候 要注意 堆栈 和 寄存器的变化情况 关注字符串的出现(ZC: 但是他忘了用CE设置 喊话内容了吧?)  【25:33】参数 0x0D 就是十进制13 也就是 回车的ASCII表对应的值,这种CALL都值得跟进去看一下

    【26:30】重来,WSASend下断,游戏中 输入内容 回车,断下。取消断点,堆栈窗口 回溯一下,堆栈窗口 往下翻了好久都翻不出来 明显做了加密处理 --> 这里处理的方式是 按下 OD快捷键CTRL+F9(执行到返回),用这种方式来回溯 直到返回到进程Client.exe的领空。【27:20】逐级回溯 分析  【28:00】测试这里的断下来的状态。在堆栈窗口找到了我们发送的数据

      【28:50】EDX指向一个结构(ZC: 这都能看出来??)

      【29:52】找上级CALL,来到本CALL的头部,设断点 使之断下,堆栈窗口 能够回溯 说明 它没做加密之类的处理

      【31:00】0x3ED(十进制1005) 有经验的话 这个值一般是指 对象ID,对象ID一般是从1001开始 (ZC: 我擦?)

      【31:39】断一下这个CALL,看看是什么情况,ECX的值未变化

        【31:55】可以看到 和我们代码注入器里面写的ECX的值一样,【32:00】用代码注入器 测试一下这个CALL  【32:23】喊话 功能测试还是不成功,再往上一层寻找

        【32:50】来到CALL头部 (找CALL过程: 不断猜测-->代码验证),这里设断点后 立马就断下来了 (ZC: 又得放弃了...)

          【33:20】退回来(退而求其次),不到函数的头部去,来到刚刚的CALL处 CTRL+F9(执行到返回) 这样也能找到上一级的CALL(ZC: 或者 堆栈窗口回溯)。【33:33】又来到 之前分析 放弃过的地方,再返回一层 看一下 来到【33:50】这里

          【34:10】有时候 我们找它的下层CALL不行的话,就试着找它的上层CALL

          【34:20】分析这个CALL的参数

            【35:51】再次 代码注入 测试 【36:20】成功了 (ZC: 也就是 我们终于找对了地方,具体的细节还要再分析)

          【37:00】这个断点,测试一下 这个CALL 对于"呐喊"之类的 参数是什么情况(有没有什么不同的地方)

          【37:45】代码注入器 改参数测试

         【38:28】复制 这段代码的“特征码”

          【38:35】ZC: 他 随手一拖,眼睛多看了一眼,就看到了一个 喊话内容字符串基址?我擦? 貌似他是看到了 OD给予的提示信息 然后他验证了一下他的猜想

           【38:47】喊话内容字符串基址  【38:50】这个基址 我们在CE里面已经找到过 它并不是用于发送信息给服务器的字符串基址

 

  【39:35】小结一下

    尽量往上层找CALL,上层CALL 实现了全部的功能 下层的CALL只实现了部分的功能

   【40:45】今天找到的CALL 应该是属于按键模拟类的(CALL),其实它是一个回车键的消息处理。∵我发现它没有一个单独的喊话的CALL,它的喊话的功能是 写在一个CASE里面的

1、

2、

 

posted @ 2016-05-14 14:42  DebugSkill  阅读(207)  评论(0编辑  收藏  举报