[原创]正反合璧,挖掘war3资源地址详细过程 您所在的位置:网站首页 魔兽112版本基址 [原创]正反合璧,挖掘war3资源地址详细过程

[原创]正反合璧,挖掘war3资源地址详细过程

2023-12-15 11:14| 来源: 网络整理| 查看: 265

    这个话题原来我只能求助了,百度搜索等等。发现了很多有兴趣的同学也在搜索,无奈却找不到……。有找到的大侠却又惜字如金,不肯吐露分毫。嘿嘿,本着共享知识,共同进步的原则,我将研究的成果共享给大家吧!

    我用CE查找war3 1.27的金币的时候,也是想着按照CE教程里的原理直接查找。首先按精确值查找,开局都是500金币,然后采10点金币,再Next Scan,结果……没有结果了!

        看来这里的数值不一定就是画面显示的数值。突然想到以前查生化危机时,它的血值是显示的10倍!这么看来魔兽也很有可能搞点小动作!于是按未知初始值方式,每采一次金币,就按增加值的方式搜索,终于把它定格下来了。居然真的是10*显示的金币值。(这中间探索的过程就不贴图了,若知道它是10倍关系,直接按精确值搜索立即就出来了!嘿嘿)CE里面搜索出来的动态地址如下:

 

     

         然后,再按照基础教程方式(find out what writes to this address)可以找到一级指针!

         再继续,搜索一级指针。这里会搜索出一堆指针地址:

 

       按照一般的思路,肯定是选择简单的进行搜索了!嘿嘿,我也是这么想的!那么就完蛋了!按照 mov eax, [ecx+40]的地址进行搜索也是很多同学不知道怎么会陷入到无尽循环之中的原因了。按照这种步骤进行常规搜索,在搜索出一堆地址之后,又会出现指向前面一模一样的指针……子又生孙,孙又生子,找不到尽头了!

        我开始也被困在此处了,后来想到上面的那个特殊指针地址。既然此路不通,只能看看那个特殊地址了!但是这个ecx的值不确定啊!!!怎么办?

    用CE中的”小OD“打开这个地址,向上一扫描,发现好多这样的[eax+ecx*8+04]:

        没办法了,CE中的小OD的调试功能确实没有大OD强,用大OD来帮忙吧,哈哈。关掉CE,用OD附加到war3进程,

然后CTRL+G到达这处令人郁闷的地址。

        发现这个位置应该是在一个函数体内。先看看周围环境吧,上下瞧瞧。结果在上面入口处看到了好东西:

        难道这就是传说中的基址?哈哈。然后向下再看看与此硬编码相关的操作:

  

        看到没有?这样就正向推导出来了指针的计算方法了(CE的查找方式是反向推导,从数据入手), 这里直接是从硬编码的基地址入手。得出结论:

         金币的基址为5D340A8,那么它指向的地址为 [[5DE340A8]+0C]+8*ECX+4]+78。

         这里的ECX我猜测应该是一个常数,类似于金币的ID。验证很简单:在5D2873B0处下断,当其指向的地址,设为x。x+78==当前的金币值时,查看ECX的值,就得到了最终的金币指针计算方法。但是,这里直接下断时,游戏会不断地断下来,没办法验证。怎么办呢?

        一直按F9重复不是办法,也没办法测试数据了。先跳到此CALL之外吧,第一次写入金币值的地址处,上面就是指针计算的CALL,看看有什么办法不:

        此处的图片地址与上面有些差别,因为经历了多次重新载入。但方法是非常有效的。

   

       然后再进入计算指针的CALL, F7进入:

         最终,根据得到的ECX值,代入到指针的计算公式中,得到了金币的指针计算方法:

          [[5DE340A8]+0C]+8*ECX+4]+78 = [[5DE340A8]+0C]+8*2+4]+78=[[5DE340A8]+0C]+14]+78

          同理,可以得到木头的ID号为3。到木头的基址加指针计算方法:[[5DE340A8]+0C]+1C]+78

         此处,ECX的取值非常多,如上2为金币3为木材,还有其它多种,肯定每种取值代表不同的资源或单位属性等等。

    本来以为这样就完了,没想到魔兽搞得还挺怪异,表现为:

         1、换个种族居然就搜索不到数据了!经测试发现:精灵族与兽族使用的为同一基址:5DE340A8,人族与不死族使用的为另一个相同基址:5FEC40A8。计算公式都一样,代入基址即可。

         2、对于不同的地图,这里的基址都是不一样的。猜测资源信息应该是与地图绑定的,记得魔兽里有一个地图编辑器,不过没怎么用过。所以对于想直接通过找基址直接定位金币的同学,这方法可能行不通。有一个万能的办法:以调试API方式来处理,可以直接获取到所有不同地图中的基址。

         结论:很多事情不要一路走到黑,有很多灵活变通的方式一样可以得到结果!

 附记:

     呵呵,对于上面的两点疑惑,终于研究出结果了:以上方法得到的基址的确是唯一的地址,但是是什么导致每次重新加载地址不一样呢?

     答案在于DLL的重定位!每次Game.dll在重新载入时的模块地址不一样,这导致其中的“硬编码”的基址也随之发生了改变。只需要找到基址相对于Game.dll的偏移地址即可,如图

     

    综上,纠正一下。war3的资源基址计算方法为:

    金币: [[Game.dll基址+0xBE40A8]+0C]+8*2+4]+78

    木材: [[Game.dll基址+0xBE40A8]+0C]+8*3+4]+78

    测试上述结果,所有地图的所有种族均一致!(版本针对1.27a)

    最后,感谢指出我错误的同学。严谨求实,也让上面的两点疑惑烟消云散!

[培训]《安卓高级研修班(网课)》月薪三万计划



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有