YJX_rxjh_20_3.2.2

走路CALL 及 相关分析

  (a)、分析走路状态开关

  (b)、测试走路CALL

  (c)、确定功能CALL及参数

ZC: 本课中,找CALL的过程 比较曲折,精神/经验/手法 值得学习

ZC: 所有的参数 都去看看 指向的是什么数据,没准就能看到点什么...就像本课里面的鼠标坐标...

ZC: 【01:50】坐标中h的值为C3B43558  【02:50】坐标中h的值为C3B3F7F1

  ZC: 坐标里面的h的值是变化的,这个 h 指什么?是指距离水平面的高度吗?

 

【00:25】游戏 又更新了

【01:35】来到 上一节课的CALL地址,设置断点,断下来之后 堆栈窗口回溯 上一级CALL才是我们要研究的  【05:55】观察一下 堆栈的参数

【02:30】先写一个测试代码测试一下

  【02:50】两次(ZC: 或者多次?)断下,ECX的值没有发生变化,于是 暂时先使用这个值。【03:03】从堆栈中取出 参数值,取的时候要快一点(ZC: 防止 游戏长时间没响应而出现断线等意外情况)

  【04:05】代码注入器 来测试代码

    【04:15】传参方式一: 逐个push + 设置ECX + CALL???

    【04:45】传参方式二: 按照游戏中的方式,push 2 + 分配堆栈空间(SUB ESP)然后反别设置x/h/y的值 + 设置ECX + CALL???

    【05:20】这里的指令“MOV EDX,ESP”是多余的,可能是起的一个 花指令/加密 的作用,干扰我们的分析(ZC: 这里扯淡了吧,明明EDX在下面设置堆栈参数时 是用到的)

    【06:58】∵ 这个时候,ESI的值没有变化,∴ 可以直接这样看“dd esi+1f78”

      ZC: 此时OD是没有断下的情况,为何这里的ESI会没有变化?这样看,可靠吗?

    【07:25】ESI+0x1F78、ESI+0x1F7C、ESI+0x1F80 【07:55】断下来,它们 变成了 目的坐标

    【08:50】修改 测试代码的参数

    【13:20】代码正常的执行了,OD中显示的寄存器的值也变化了

    【14:25】修改测试代码,将 坐标值 写入对象属性  【15:23】人物还是没有走动(ZC: ∵ 现在的坐标 就是目的坐标啊...)

 

【15:55】既然这个CALL,人物不能走动的话,就换一种方法,换一个地方

  【16:05】我们在按下鼠标的同时 就是走路,走路的话 就会对目的地址进行写入,而对目的地址进行写入的地方 肯定也就是 走路CALL的内部。所以说我们再找一下其它的CALL

  【16:43】对 ESI+0x1F78 内存,下写入断点,以 找其它的走路相关CALL  【17:15】dd 065FEC8C+1F78,∵现在ESI的值已经变化了 ∴不能再"dd ESI+1F78"了

  【18:17】断在某处,移到这个CALL的头部  【20:35】CALL头部下断点,立(即)断(就下来了)  ==> pass

 

  【20:52】再次对 目的地址x坐标对应的内存处下内存写入断点  【21:05】CTRL+F9(执行到返回)  【21:19】上层调用的地方 下断点,没有立断,点击鼠标 断下来了

    【21:45】此时 ESI的值  【22:02】ESI的值 是坐标结构的首地址

    【23:05】这些值 需要清0。此时 EBX的值 等于 上面分析的 目标地址坐标

        ZC: 此时 ESI[0x06600168]开始的3个DWORD值: 0xC308D93F, 0xC3B3CE8E, 0x4502191F,浮点数为: -136.8486, -359.6137, 2081.570

    【23:33】ZC: EBX[0x065FEC8C]开始的3个DWORD值: C3166DC1, C3B3BBD2, 450375C4,浮点数为: -150.4287, -359.4673, 2103.360

  【24:00】先不急着找 参数ESI的来源,先测试一下 (∵ 这个CALL 看起来很像 寻路CALL,∴ 值得一试,测试下来如果不是的话 立马放弃 省的浪费精力去做多余的分析工作)

    【24:15】首先 要把这几个值赋值为0 (ZC: 这里 我是没看出来 为何要先做赋值清0的工作...有必要吗?)

    【28:28】把 esi的值 设为 esp(栈顶) (ZC: 这样游戏肯定会出错退出的吧...为何不干脆设置为06600168...??)

    【29:05】可以注入(ZC: 游戏居然没有报错退出...),但是没有走路  【29:12】此时看堆栈窗口 ESP,这里 坐标是0,也有可能是和坐标有关系

      ZC: 这里 我想到2个测试的方式:
      ZC:  (1)、将06600168开始的3个DWORD 设置成我们的坐标值,然后 ESI就传 06600168
      ZC:  (2)、代码注入,也就是远程线程,可以在 远程函数中弄3个局部变量(连续的3个DWORD)(这里可以用C++的方式来声明局部变量 也可以 用汇编的设置ESP的方式来构造3个DWORD局部变量),将它们的值设置成坐标值,然后 ESI指向第一个局部变量的地址

    【29:30】将压栈的参数 从ESP换成ESI,游戏报错退出了(ZC: 这里应该是访问了不可访问的内存了,∵在远程函数中 ESI的值不确定...)

  【29:36】我们这个CALL也记一下,看来这个(CALL)也是错的,等一下接着找 (ZC: 我觉得 这个CALL 还是蛮像的)

【30:57】接着往上找CALL

  【31:26】用 CTRL+F9 的方式找上层CALL,又回到本CALL里面了...

  【31:43】再次 CTRL+F9,【31:51】这次来到新的CALL里面,但是 不断的被断下来...  【32:15】此时,看一下栈顶(dd esp),它也是一个 目的地坐标结构首地址。这个从哪里看出来的呢?从ESI的值(ZC: 现在是断在这里,本来最后一个压栈的就是ESI,栈顶的值 就应该是等于esi的 ! !)  【32:57】取消断点,F9  【33:12】这里的EBX的值 和 刚才是相同的  【33:23】又找到一个新的目的地的地址  【33:36】发现 [065FEC8C+1F78] 和 [065FEC8C+14DC] 这两个地方都指向 目的地地址(即 06600168)  【34:28】而且这个值(065FEC8C) 没有变化 可以直接拿来使用(ZC: really?可不可靠啊...也不说将游戏/os重启一下 验证一下看看这个值到底会不会变化...)

     【36:05】“LEA DWORD PTR DS:[EBX+14DC]”中的 “EBX+14DC”又是从哪里来的,下一个内存写入断点,鼠标点击游戏使之走路,断下

      【37:23】他 直接跳到最前面的指令了(ZC: 这里 我感觉 他这样做的目的 不是分析指令,而是 省的鼠标滚轮往上滚 直接往上跳 尽快的来到函数头部 查看“EBP-24”的来源)

      【37:53】FLD,FSUB,FLD,FSUB ==> 浮点的相关运算

      【38:03】有一个取“EBP-24”地址的LEA操作,下断,极有可能是在下面的CALL中进行写入操作,现在 “EBP-24”==> 0012CD18指向的值为C301C3D4,C303D854,450612EA(-129.7650, -359.6901, 2145.182),ESI==>06600168指向的值为-108.2429, -359.7722, 2149.759  【39:00】看出来 06600168指向的是源地址,0012CD18指向的是目的地址

      【39:20】测试 该CALL是否是 走路CALL,留到 下一节课测试...

      【41:35】再往前找一下,看看“EBP-24”的来源  【41:55】这有又有一处使用的地方,不知是否这里已经对“EBP-24”指向的值 写入了目的坐标... ==> 这里也已经写入了,那么 这个CALL 也可能是 走路CALL,其中两个地址的参数 猜想应该是 目的地地址 和 源地址

      【43:05】这里一个 对“EBP-24”直接写入的操作,这里断不下来...

      【44:03】我们要找的是 对“EBP-24”进行操作的LEA指令

      【44:45】一直往上找,找到这里(之前分析过的地方),好像又找回来了... 这是在一个循环的机构里面

        【45:33】他看了一下笔记,说这个CALL 我们没有找到过。这样的CALL非常的多

      【47:06】这个大CALL 一下断点 就被断下了... ==> 没有什么办法了 ==> pass

      【47:35】CALL 00459B00 也是立断 ==> 也不是我们要找的CALL ==> pass,它可能是一个判断之类的  【48:02】下断之后马上就断下来 ==> 肯定不是(ZC: 我们要找的CALL)

【48:22】这里 内存写入断点,游戏点击鼠标 使之走路,断下 (ZC: 貌似 和【36:05】一样的做法)

  【49:22】再来看一下这里的ESI

  【49:57】看一下这里这个CALL的参数情况

  【51:05】又找到一个 新CALL,下断,看看目的地址 是否已经写入了 【51:35】此时“EBX-24”指向的数据是乱码 说明在这里的时候 还未获取目的地址 【52:02】数据显示的有误 重新跟一下

    【52:42】此时 “EBX-24”指向的数据 并非是 坐标 【52:51】执行了CALL之后 才变成坐标。也就是说 这个函数的功能是:坐标转换

    【53:28】看一下 常量指向的数据,是2个变换的数值。可以看到 这2个值 一直在变化,鼠标动 它们就变化。【54:30】说明是 鼠标所在的坐标,一个屏幕分辨率。也就是说 我们鼠标点击的时候 它就会把鼠标的坐标(x,y) 转换成相应的(x,h,y) 然后存放到“EBX-24”指向的内存中

    【55:02】又∵函数头部下断 立马就会断下来(ZC: 这个函数会不会就是鼠标消息[移动/点击]处理的函数?),说明这个 它不是一个(ZC: 走路)CALL,只能说明 走路CALL 是后面这几个 而不是前面这(一个),也就是说在 指令004506A3的后面 ∵在这里它才获得(目的地)地址。【55:30】极有可能是这一段代码 是我们的走路CALL 。

  【56:30】鼠标坐标 屏幕坐标 屏幕分辨率  【56:56】这个函数就是将 屏幕坐标转换成 游戏里面的3D的坐标 存放在“EBX-24”指向的内存中

1、

2、

 

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