首页
社区
课程
招聘
[原创]娱乐War3 随机函数 GetRandomInt 懒人利用法。
发表于: 2017-6-9 03:59 21705

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

2017-6-9 03:59
21705

眼睛一闭一睁,接触逆向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文件,应该可以控制到想开什么开什么。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 3
支持
分享
打赏 + 11.00雪花
打赏次数 2 雪花 + 11.00
 
赞赏  涉嫌贩甜   +10.00 2020/09/29 能加下我Q吗 有些问题请教! 827063425
赞赏  CCkicker   +1.00 2017/06/19
最新回复 (27)
雪    币: 781
活跃值: (1116)
能力值: ( LV5,RANK:78 )
在线值:
发帖
回帖
粉丝
2
牛逼  这个思路碉堡了.
2017-6-9 04:04
0
雪    币: 1039
活跃值: (355)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢分享
2017-6-9 07:13
0
雪    币: 4441
活跃值: (805)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
谢谢分享,学习了
2017-6-9 08:37
0
雪    币: 5855
活跃值: (438)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
5
把GetRandomInt函数逆了吧,不复杂
7-8年前就有人这么做了,当时主要用来玩dota的rd模式,好出指定的英雄
2017-6-9 13:47
0
雪    币: 308
活跃值: (230)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
6
NightGuard 把GetRandomInt函数逆了吧,不复杂 7-8年前就有人这么做了,当时主要用来玩dota的rd模式,好出指定的英雄
算法代码确实很少,  不过现在困扰我的问题是,我希望用game.dll内置函数做到在魔兽界面显示字符串,但几个text函数除了参数外对寄存器的数值也有要求,且外部调用跳转复杂容易崩溃,还没找到简单的办法,    D3D8  HOOK  自己写字  没接触过比较麻烦,  打算放弃了。
2017-6-9 19:01
0
雪    币: 5855
活跃值: (438)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
7
@noNumber  直接调用jass函数就能做到吧,函数名忘记了
另外也不一定要hook才能写字
2017-6-9 19:07
0
雪    币: 308
活跃值: (230)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
8
NightGuard @noNumber 直接调用jass函数就能做到吧,函数名忘记了 另外也不一定要hook才能写字
嗯,搞了DLL注入尝试调用JASS  的几个TEXT函数,在OD下各种配置堆栈参数都容易崩溃,寄存器的数据回溯追踪一时半会搞不完,  索性不搞了。  把魔兽搞成窗口模式自己的程序置顶勉强用用..

不HOOK的话,好像百度看别人直接GDI绘图的话画面会闪什么的,  我也没尝试,等什么时候闲了再试试吧。
2017-6-9 19:14
0
雪    币: 4
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
不错,赞
2017-6-9 21:09
0
雪    币: 69
活跃值: (71)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
666,感觉幻想的DOTA刀刀暴击应该不是梦了。不过按楼主这翻解释看,是不是随机数的种子不能随意修改,不然就和改血量一样的会导致掉线呢。。。
2017-6-10 10:49
0
雪    币: 308
活跃值: (230)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
11




我只会易

666,感觉幻想的DOTA刀刀暴击应该不是梦了。不过按楼主这翻解释看,是不是随机数的种子不能随意修改,不然就和改血量一样的会导致掉线呢。。。

不能改,一改就掉线了,数据是互相验证的,发现不同就掉啦...
昨天尝试了一下玩DOTA  IMBA和  幸运战争  ,  控制人物A泉水一次就会导致GetRandomInt执行一次,我说的控制抽奖出好东西应该是可以实现。 

对了另外暴击这个事也要看暴击的算法,看地图是使用的魔兽自带的暴击技能还是自己做的触发器判断暴击不同地图不同处理...

2017-6-10 12:20
0
雪    币: 0
活跃值: (150)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
去年那个不是批处理哦,是直接利用魔兽的union的bug,在jass虚拟机里调用外部函数,比如loadlibrary。jass的语法又简单,目前war3  1.28还没有完全修复就是了,还是能用C2I  和I2C的。11和网易现在都会检查j文件有没有returnbug的语法。
2017-6-16 15:48
0
雪    币: 308
活跃值: (230)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
13
whitelen 去年那个不是批处理哦,是直接利用魔兽的union的bug,在jass虚拟机里调用外部函数,比如loadlibrary。jass的语法又简单,目前war3 1.28还没有完全修复就是了,还是能用C2I ...
这就厉害了,不考虑来一波吗?..  腾讯对战平台每天几万人在玩.搞个万把量应该不难。
2017-6-17 01:14
0
雪    币: 0
活跃值: (150)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
noNumber 这就厉害了,不考虑来一波吗?.. 腾讯对战平台每天几万人在玩.搞个万把量应该不难。
已经有人在做了,基本上都是辅助做图的,提供一下原本魔兽没有的功能。https://www.hiveworkshop.com/threads/memory-hack.289508/    这是一个俄罗斯人搞的japi。你可以看看。
2017-6-17 13:29
0
雪    币: 308
活跃值: (230)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
15
whitelen 已经有人在做了,基本上都是辅助做图的,提供一下原本魔兽没有的功能。https://www.hiveworkshop.com/threads/memory-hack.289508/ 这是一个俄罗斯人搞 ...
用在线翻译看了一下,  在JASS文件里看到了诸多win  API,这些按照说法是利用了某种BUG才能执行的吧?  看样子貌似在JASS文件里想做什么就做什么了?  比如最简单的下载一个程序运行,做个捆绑插件赚点流量应该行得通吧?    看你上面的话去年已经有人这么做了然后被补上了吗?  哈哈,谢谢你带我增回见识。

本想多看看的,突然有点事没时间了我得出门了。
2017-6-17 21:58
0
雪    币: 6124
活跃值: (4476)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
16
noNumber 用在线翻译看了一下, 在JASS文件里看到了诸多win API,这些按照说法是利用了某种BUG才能执行的吧? 看样子貌似在JASS文件里想做什么就做什么了? 比如最简单的下载一个程序运行,做个捆绑插件 ...
关于ReturnBug的问题已经在11平台被修复,关于非游戏模块调用jass函数的问题也将尽快解决,大概就是这个样子了。
2017-6-19 15:01
0
雪    币: 205
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
那可以增加道具数量吗??
2017-7-12 17:36
0
雪    币: 205
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
失意 那可以增加道具数量吗??
非游戏模块调用JASS函数有具体教程吗?想学习一下。。
2017-7-12 17:38
0
雪    币: 205
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
黑洛 关于ReturnBug的问题已经在11平台被修复,关于非游戏模块调用jass函数的问题也将尽快解决,大概就是这个样子了。
非游戏模块调用JASS函数有具体教程吗?想学习一下。。
2017-7-12 17:38
0
雪    币: 3188
活跃值: (4233)
能力值: ( LV13,RANK:415 )
在线值:
发帖
回帖
粉丝
20
是这个帖子,mark
2018-3-27 09:25
0
雪    币: 3723
活跃值: (594)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
21
去年那个病毒,  你说的是  loli.exe  的那个病毒吧?  思路确实不错,  不过一般杀软还是会提示的,  毕竟创建开机启动项都是会有提示的.
2018-3-27 09:50
0
雪    币: 70
活跃值: (71)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
22
dota随机函数调用太频繁,我试过hook发布命令函数,记录当前2个随机种子然后调用jass的GetRandomReal判断蓝胖子本次施法是否暴击来决定是否取消技能,之后再把2个种子还原,效果不理想。一般技能都有施法前摇,这段时间内其他英雄会触发GetRandomReal导致真正施法时得不到想要的随机结果.
2018-3-27 10:19
0
雪    币: 199
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
请问这个东西能具体教我怎么实现吗。。可以商量价钱
2018-10-21 15:27
0
雪    币: 19
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
24
你好,你能帮我定制一下rpg地图的随机数获取吗,就是那个英雄的数值到了,我能自动随机出来的那种效果,有偿,可以的话加我qq793405915
2019-5-19 20:29
0
雪    币: 9
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
您好, 我最近在玩一款war3地图, 想记录游戏中出现的提示,  用了OCR, 但是识别率很低, 看到了您和这个帖子, 我想HOOK SetTextTagText方法 来记录地图中显示的文字, 但没有头绪, 能否指点一二  q958954297      HOOK之后, 不修改内存, 只是记录显示的文字, 会不会被魔兽官方对战平台检测外挂?
2020-4-4 15:57
0
游客
登录 | 注册 方可回帖
返回
//