首页
社区
课程
招聘
[已解决]war3:如何调用game.dll的内部函数
发表于: 2018-1-14 19:13 14028

[已解决]war3:如何调用game.dll的内部函数

2018-1-14 19:13
14028

写了一个触发,然后根据搜集的资料逆向找到了内部CALL代码,触发如下:

 

 

然后找到加经验的逆向代码(根据瘸腿大象的教程):

0018DD9C 00100013 单位

0018DDA0 000003E8 经验值

0018DDA4 00000001 是否显示升级动画

0018DDA8 0A69CF08 ASCII "AddHeroXP"  game.dll+2C38D0(CALL的地址)
 

其他代码也都找全了,包括"GetLocalPlayer"、"CreateGroup"、"GroupEnumUnitsSelected"、"FirstOfGroup"以及"AddHeroXP"

在CE中编写了脚本,能正常加经验升级,显示升级动画,但是瘸腿大象说要调用内部函数,必须要在游戏本身的线程调用,不能用外部程序调用

而我想用其他语言编写一个类似修改器的功能,点击修改器的按钮,就能加经验升级

 

我尝试先在game.dll末尾空白的地方写入加经验代码,然后记录下头的地址,比如:

6F704BD0 E8 2B7EBCFF CALL 6F2CCA00

6F704BD5 8905 10564900 MOV DWORD PTR DS:[0x495610], EAX ; d3d8.65B20CD0

......

......

这段代码我想应该没错吧,接下来我尝试注入器测试CALL:

call 6F704BD0

就弹出错误信息

附带上整段代码:

6F704BD0    E8 2B7EBCFF     CALL 6F2CCA00
6F704BD5    8905 10564900   MOV DWORD PTR DS:[0x495610], EAX
6F704BDB    E8 C047BBFF     CALL 6F2B93A0
6F704BE0    8905 14564900   MOV DWORD PTR DS:[0x495614], EAX
6F704BE6    6A 00           PUSH 0x0
6F704BE8    A1 10564900     MOV EAX, DWORD PTR DS:[0x495610]
6F704BED    50              PUSH EAX
6F704BEE    A1 14564900     MOV EAX, DWORD PTR DS:[0x495614]
6F704BF3    50              PUSH EAX
6F704BF4    E8 D75FBBFF     CALL 6F2BABD0
6F704BF9    A1 14564900     MOV EAX, DWORD PTR DS:[0x495614]
6F704BFE    50              PUSH EAX
6F704BFF    E8 1C62BBFF     CALL 6F2BAE20
6F704C04    8905 18564900   MOV DWORD PTR DS:[0x495618], EAX
6F704C0A    6A 01           PUSH 0x1
6F704C0C    68 E8030000     PUSH 0x3E8
6F704C11    A1 18564900     MOV EAX, DWORD PTR DS:[0x495618]
6F704C16    50              PUSH EAX
6F704C17    E8 B4ECBBFF     CALL 6F2C38D0
6F704C1C    83C4 1C         ADD ESP, 0x1C
6F704C1F    C3              RETN
贵论坛一定有人研究过war3的,有什么办法能用其他外部程序实现给选定单位加经验吗?在此,谢谢大家的帮忙!


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
2
会改写那个游戏本身的线程的EIP不?填写需要的参数,然后采用改写EIP的方式强制调用线程就行!
2018-1-16 17:28
0
雪    币: 0
活跃值: (987)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
czcqq 会改写那个游戏本身的线程的EIP不?填写需要的参数,然后采用改写EIP的方式强制调用线程就行!
谢谢回复,jmp  call  都能改EIP吧,但是如何选择恰当的线程EIP,不太会!
2018-1-16 17:44
0
雪    币: 70
活跃值: (71)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
有些Jass函数只能主线程调用,最好让主线程执行实现功能的汇编代码.
在主线程随便找一个循环调用的作弊hook点(比如1.24e绘制英雄路线时的hook点game.dll+0x362BF1)hook,在hook函数中根据判断是否需要跳转到自定义汇编代码,判断条件可以是某一游戏不使用的基址或自己申请一段内存的值.
伪代码大概如下:

__asm
{
    pushad
    pushfd
    
   mov eax,0x12345678      //通过地址0x12345678的值判断是否需要执行作弊代码, 0不执行 1需要执行 2正在执行
   cmp [eax],1     
   jne End

   mov [eax],2
   //作弊代码    
   mov [eax],0

End:
   popfd
   popad

   //执行Hook点原始代码
   
   //跳回hook点
   jmp HookRet
}

作弊插件将War3.exe进程0x12345678地址写入1就可以执行了.
2018-1-16 20:02
0
雪    币: 0
活跃值: (987)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
洪荒之力 有些Jass函数只能主线程调用,最好让主线程执行实现功能的汇编代码.在主线程随便找一个循环调用的作弊hook点(比如1.24e绘制英雄路线时的hook点game.dll+0x362BF1)hook,在 ...
谢谢“洪荒之力”的回复,war3联网下比如平台游戏环境下,修改主线程的代码并执行,会不会导致掉线了?我主要是用来判断选取单位是否为本地玩家单位,别人的war3下并没修改主线程代码?

还有一点疑问,war3的循环执行接口,是如何利用CE找到的呢?我之前是按照教程找的一个循环检测游戏时间的接口?

辛苦大哥了!如此详细的回帖!
2018-1-16 22:02
0
雪    币: 70
活跃值: (71)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
小木鱼 谢谢“洪荒之力”的回复,war3联网下比如平台游戏环境下,修改主线程的代码并执行,会不会导致掉线了?我主要是用来判断选取单位是否为本地玩家单位,别人的war3下并没修改主线程代码? 还有一点疑问 ...
掉线有两种,数据不同步被主机踢掉和修改了游戏进程内存被平台检测到踢线.
你举的例子修改经验无论什么方法执行联网下肯定都会由于数据不同步掉线的.
判定自己选中单位是否为本地玩家单位不会引起数据不同步,但是游戏平台对调用jass  call可能会有堆栈的调用地址检测,非法地址的调用可能会被检测到踢线;修改代码的检测可以重载game.dll然后hook,或者挂起线程修改eip或者使用硬件断点触发异常执行等等,不同的平台检测手段不同.
判断本地玩家选中的单位是否为视野外单位使用IsUnitInvisible就可以,判断其他玩家是否因为选中了视野外单位作弊由于网络延迟的原因会有一定概率判断失误.
war3的循环执行函数可以通过函数功能去下断点尝试获取,比如获取单位坐标,获取玩家金币数量等函数肯定会经常被执行的.
游戏timer相关操作的jass函数肯定也会被高频执行的.
2018-1-16 22:59
0
雪    币: 0
活跃值: (987)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7

对于各类平台的检测手段,应该是很高深的话题,暂时我的水平达不到,应该是很难的吧,涉及到的知识也很高深?

 

“war3的循环执行函数可以通过函数功能去下断点尝试获取”,我之前逆向过war3,发现触发中函数的调用都经过 call ebx这条语句,并没有走向某个函数专门的代码段,请恕我愚笨,我的意思是每个函数调用的代码段不是独立的,不是函数1有函数1的代码段,函数2有函数2的代码,都是call ebx指向并调用函数,然而ebx来源于上面的call返回,返回的是函数的地址,比如game.2C38D0。

如果我想找到绘制英雄路线时的hook点game.dll+0x362BF1,要具体怎么操作了,我不理解“循环执行函数可以通过函数功能”下断并获取?不明晰找到对应的函数(这个函数是JASS函数还是访问CE中找到英雄路线坐标的汇编语句),说的不专业,希望您能明白我描述的。

 

6F6AD884    FFD3            CALL EBX                                 ; 各函数分支,如:"AddHeroXP"
6F6AD886    8B4D FC         MOV ECX, DWORD PTR SS:[EBP-0x4]
6F6AD889    8B51 20         MOV EDX, DWORD PTR DS:[ECX+0x20]
6F6AD88C    8B4D F8         MOV ECX, DWORD PTR SS:[EBP-0x8]
6F6AD88F    2991 8C000000   SUB DWORD PTR DS:[ECX+0x8C], EDX
6F6AD895    8DA5 6CFFFFFF   LEA ESP, DWORD PTR SS:[EBP-0x94]
6F6AD89B    5F              POP EDI
6F6AD89C    5E              POP ESI
6F6AD89D    5B              POP EBX                                  ; Game.6F2C38D0
6F6AD89E    8BE5            MOV ESP, EBP
6F6AD8A0    5D              POP EBP
6F6AD8A1    C2 0400         RETN 0x4

堆栈中出现参数
0018DD9C   00100013
0018DDA0   000003E8
0018DDA4   00000001
0018DDA8   0A69CF08  ASCII "AddHeroXP"

2018-1-17 20:51
0
雪    币: 19
活跃值: (102)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
嗯。
2018-1-18 19:48
0
雪    币: 0
活跃值: (987)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
洪荒之力 掉线有两种,数据不同步被主机踢掉和修改了游戏进程内存被平台检测到踢线. 你举的例子修改经验无论什么方法执行联网下肯定都会由于数据不同步掉线的. 判定自己选中单位是否为本地玩家单位不会引起数据不同步 ...
不好意思,@你一下,希望能回复我的疑问,太感谢了
https://bbs.pediy.com/thread-224071-1.htm#1513076
2018-1-19 10:06
0
雪    币: 1515
活跃值: (5972)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
10
木鱼,我记得当年我写dota外挂的时候就眼熟你这个id了,过了这么久了水平咋看起来没有进步啊。
2018-1-19 15:11
0
雪    币: 1515
活跃值: (5972)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
11
要找绘制点,你要想清楚游戏制作者的思路。
https://bbs.pediy.com/thread-187625.htm
看一下第三个小地图绘制吧
2018-1-19 15:15
0
雪    币: 0
活跃值: (987)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
谢谢大家的回复 祝愿大家过一个好新年
2018-1-19 19:17
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
请问怎么实现魔兽的物品添加和瞬移?
2018-5-1 21:21
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
小木鱼 谢谢大家的回复 祝愿大家过一个好新年
@小木鱼    请问这些地址要怎么编写ce脚本,我编写了几次都是崩溃?
2018-5-3 20:48
0
雪    币: 33
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
15
你们在官方平台能调试魔兽吗 用od断下来游戏就崩溃了
2020-6-30 18:34
0
游客
登录 | 注册 方可回帖
返回