欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]娱乐War3 随机函数 GetRandomInt 懒人利用法。

[原创]娱乐War3 随机函数 GetRandomInt 懒人利用法。

眼睛一闭一睁,接触逆向6年过去了,技术一点没有长进,主要突出一个懒字。


不是什么高难技术,纯属分享。


起因最近被带动玩一款叫做“宠物小精灵防御战” 的 war3地图, 每个玩家“抓”精灵进行PK的游戏。 

那么这里问题就来了, 抓精灵是有概率的,这就很气,很皮,似乎很大程度结果都要向运气看齐,说到这里不由想起了十连跑(小精灵逃跑)的悲伤。


于是我就想,抓精灵的概率是否和本地时间有关?还是和游戏时间有关? 不过这么猜那就对不起自己码农的身份了。


使用解包工具打开魔兽地图,提取出 JASS 脚本文件, 观察定位看到抓精灵的概率 GetRandomInt(1,'d')>=50 / 随机1到100的数据 大于XX时怎么怎么,就是你了。

那么魔兽的 GetRandomInt 是怎么随机呢, 种子怎么生成,算法是什么样, 应该做一个HOOK吗,搞个DLL注入还是搞个远程调用,好像问题很多。


先从逆向说起, 通过百度得知 GetRandomInt 函数在 game.dll 文件内, 定位到后如下:


进入到关键算法,准备提取算法



突然看到 程序使用了一块固定数据 参与计算, 要把这段数据复制出来再搞来搞去编程什么的,太麻烦了。


目前已知的信息, GetRandomInt 参数为两个数字, 其中种子保存在固定位置,且每次执行GetRandomInt后,种子会相应的变化,


那么,写个新程序加载game.dll ,通过搜索特征码也好,硬编码也好定位函数地址,从war3.exe内存中读取种子数据并写入自己的模块内,直接本进程调用GetRandomInt即可知道

war3下次执行GetRandomInt时的结果,从而知道,什么时候能抓到精灵,什么时候抓不到。


开始编写程序,找到war3窗口,打开进程,得到模块地址,搜索到GetRandomInt地址, +$28 得到种子地址指针 , 同时自身加载 game.dll 并找到各地址。

然后每当需要时就读取远程内存并计算下一次随机数。

贴个简单的关键代码

/////////////////////////////////////////////////////////////////////////////

    ReadProcessMemory(hWarPro,Pointer(pzhongzi),@dqbytes[0],8,size);     //远程种子数据地址

    asm

    pushad

      mov eax,my_zhongzi                //本进程中的种子地址

      mov ebx,Cardinal(dqbytes[0])      //远程war3读取到的种子前4字节

      mov [eax],ebx                     //写入到本进程

      mov ebx,Cardinal(dqbytes[4])      //远程war3读取到的种子后4字节

      mov [eax+4],ebx                   //写入到本进程

      push $64                          //参数100

      push $1                           //参数1

      call my_fun                       //本进程内 GetRandomInt 地址

      mov c,eax                         //得到结果

      add esp,8

      popad    

    end;

    lbl2.Caption:=IntToStr(c);

/////////////////////////////////////////////////////////////////////////


同步调试后,每次运算结果与war3相同。 立刻上线对战平台测试,什么稀有神兽想抓就抓,爽,艹翻一切。




每次GetRandomInt的数字越小,说明越容易抓到,稀有的50以下, 半神兽15以下, 神兽5以下, 每个玩家抓精灵时都会调用GetRandomInt,观察好数字决定自己抓精灵的时机就可以了,

我感觉我在这个游戏无敌了。


对了,去年还有个病毒利用魔兽jass漏洞,只要玩了后门地图就会在启动文件夹建立一个批处理文件, 批处理下载一个程序运行并感染用户的所有war3地图实现传播,太厉害了。


后记: GetRandomInt 应该可以利用得更多, 比如 Dota Imba 每个玩家开场获得一个宝箱,宝箱开出的东西是随机的,开到好东西决定了一个好的开局甚至碾压, 如果分析一下对应地图的jass文件,应该可以控制到想开什么开什么。

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功