首页
社区
课程
招聘
关于一个网络游戏调试中的问题(在线等待)
发表于: 2006-7-15 14:48 6480

关于一个网络游戏调试中的问题(在线等待)

2006-7-15 14:48
6480
有一网络游戏中的生命值是动态地址存储的,偶想把它改为静态好让偶的辅助软件可查觉游戏运行过程中的生命值变化。

用OD锁定生命值所在的内存地址后中断,代码如下:

....
.....
0043B6BD      CC            INT3
0043B6BE      CC            INT3
0043B6BF      CC            INT3
0043B6C0   .  0FB781 6A0300>MOVZX EAX,WORD PTR DS:[ECX+36A]
0043B6C7   .  C3            RETN
0043B6C8      CC            INT3
0043B6C9      CC            INT3
0043B6CA      CC            INT3
0043B6CB      CC            INT3
0043B6CC      CC            INT3
0043B6CD      CC            INT3
0043B6CE      CC            INT3
0043B6CF      CC            INT3
0043B6D0   .  66:8B4424 04  MOV AX,WORD PTR SS:[ESP+4]
0043B6D5   .  56            PUSH ESI
0043B6D6   .  8BF1          MOV ESI,ECX
0043B6D8   .  8B16          MOV EDX,DWORD PTR DS:[ESI]
0043B6DA      66:8986 6A030>MOV WORD PTR DS:[ESI+36A],AX             ;  断在此处,生命值地址为 ESI+36A
0043B6E1   .  FF92 E8000000 CALL DWORD PTR DS:[EDX+E8]               ;  Call 0043B6C0
0043B6E7   .  66:3986 6A030>CMP WORD PTR DS:[ESI+36A],AX
0043B6EE   .  76 11         JBE SHORT client.0043B701
0043B6F0   .  8B06          MOV EAX,DWORD PTR DS:[ESI]
0043B6F2   .  8BCE          MOV ECX,ESI
0043B6F4   .  FF90 E8000000 CALL DWORD PTR DS:[EAX+E8]
0043B6FA   .  66:8986 6A030>MOV WORD PTR DS:[ESI+36A],AX
0043B701   >  5E            POP ESI
0043B702   .  C2 0400       RETN 4
0043B705      CC            INT3
0043B706      CC            INT3
0043B707      CC            INT3
....
...

PE段区信息如下:

名称       偏移      大小      偏移      大小      标志
.text    00001000  0011D51C  00001000  0011E000  60000020
.rdata   0011F000  00032AC2  0011F000  00033000  40000040
.data    00152000  0011DE58  00152000  00010000  C0000040
.rsrc    00270000  00001D58  00162000  00002000  40000040

我在0051E520处加了一断代码用于取得ESI的值,代码如下:

0051E503   .^\E9 4CD1FCFF   JMP client.004EB654
0051E508      B9            DB B9
0051E509      10BE6600      DD client.0066BE10
0051E50D      E9            DB E9
0051E50E      A2            DB A2
0051E50F      C0            DB C0
0051E510      FC            DB FC
0051E511      FF            DB FF
0051E512   .  B9 11BE6600   MOV ECX,client.0066BE11
0051E517   .^ E9 24D2FCFF   JMP client.004EB740
0051E51C      00            DB 00
0051E51D      00            DB 00
0051E51E      00            DB 00
0051E51F      00            DB 00
0051E520   >  66:8986 6A030>MOV WORD PTR DS:[ESI+36A],AX             ;  先恢复被破坏的原代码
0051E527   .  8935 00335500 MOV DWORD PTR DS:[553300],ESI            ;  把 ESI 的值存放在 553300 (我本想放在 51E536 的,由于无写权限会出错,所以才放到553300)
0051E52D   .^ E9 AFD1F1FF   JMP client.0043B6E1                      ;  跳回     
0051E532      00            DB 00
0051E533      00            DB 00
0051E534      00            DB 00
0051E535      00            DB 00
0051E536      00            DB 00
0051E537      00            DB 00

并修改 0043B6DA      66:8986 6A030>MOV WORD PTR DS:[ESI+36A],AX
为     0043B6DA   . /E9 412E0E00   JMP 0051E520

程序运行是没错了,可是我用OD查看 553300 处的数值时却发现它在不断的变化,这是怎么回事呢?请各位大大们帮看看,我那儿错了?

还有怎么才能找到一个可供我存放数据的地址(如上边的553300)?
如编程修改PE段区的访问权限应该怎么做?用什么API?

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (19)
雪    币: 190
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我的做法:
mov dword ptr ds:[553300],esi
MOV WORD PTR DS:[ESI+36A],AX
JMP client.0043B6E1
或者
push eax
mov eax,[esi+36a]
mov [553300],eax
pop eax
MOV WORD PTR DS:[ESI+36A],AX
JMP client.0043B6E1
2006-7-15 15:53
0
雪    币: 200
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
第二个比我的想法好,这样不用再在自己的程序进行一次加法运算了,不过几乎没解决我上边提出的问题,我先去试试
2006-7-15 17:19
0
雪    币: 200
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
553300 处的值还是在变化,是不是那个地址是不可写入的呀?
2006-7-15 17:26
0
雪    币: 204
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
553300 处的值还是在变化

可能这个地址在游戏的动态数据区内,你看看能不能直接在代码段找个空位置.一般在代码段所在内存块最后有较多的空闲区.可试试.(你的补丁,数据都可放在这个区域).
2006-7-15 18:44
0
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
553300 这里属于.data 段是程序自己的数据区, 不应该摆这里, 可以动态分配一块空间.
2006-7-15 19:36
0
雪    币: 200
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我试了,OD提示无写入权限
2006-7-15 19:52
0
雪    币: 200
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
最初由 xiaofeng 发布
553300 这里属于.data 段是程序自己的数据区, 不应该摆这里, 可以动态分配一块空间.


smc 怎么动态分配空间,SMC后又如何能把需要的数据写到自己程序分配的空间?
2006-7-15 20:20
0
雪    币: 436
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
这么深啊!!听人家说网游戏 修改起来很难的!!
因为存在验证和其他方面的问题!
2006-7-15 21:17
0
雪    币: 200
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
最初由 花尽尘香 发布
这么深啊!!听人家说网游戏 修改起来很难的!!
因为存在验证和其他方面的问题!


这与验证无关,我只是想判断游戏中一些数值的变化并执行一些我希望的过程,不知道谁能帮帮我呀。我想我出错的地方应该就是那个 MOV [553300],ESI 了,可是我如不放在553300那么我又能放在哪儿呢?
没老师指导很不好学的,我也想学PE结构呀,看了好多PE结构资料,也找了好多PE文件载入内存的过程资料,但怎么也理解不了,上网请教,得到的大多数回答都是“多去学习别人的写的教程”、“多查查贴子”、“去多学学基础吧”,可是高手们的基础都是我们这些菜鸟们难以理解的,问 却又是上边的回答,头痛。难到真的是师傅要留一手吗?
2006-7-15 22:07
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
这个问题不是存放地址的不对。
而是应为这个是一个循环。
代码虽然一样但是循环的条件不一样。
只有达到特定的循环条件之后才能确定HP的地址。
梦幻西游也是这样的。
真郁闷。不知道怎么找这个特殊的标记。
2006-7-16 14:12
0
雪    币: 200
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
最初由 cfanwolf 发布
这个问题不是存放地址的不对。
而是应为这个是一个循环。
代码虽然一样但是循环的条件不一样。
只有达到特定的循环条件之后才能确定HP的地址。
梦幻西游也是这样的。
........


哦,也许是这样了。
如是这样的话,那么它应该是一个call吧,试试向上找找,看看能不能找到激活这个call的条件。
2006-7-16 17:39
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
我的这个程序它的循环有很多中,跟踪起来非常困难,而且你也不知道它达到什么条件的时候获取的是HP的地址,
我希望有高手可以帮忙想一个简单有效实用的 跟踪方法。
2006-7-17 09:37
0
雪    币: 200
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
  我的call 和你的差不多,所有调用它的地方都是以指针的方式进行的,我也晕头了....
2006-7-17 17:09
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
如果金山找不到内存地址。用什么可以寻找出比如血,魔的地址呢
2006-7-18 16:05
0
雪    币: 203
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
那就只有bp recv慢慢看了
2006-7-18 22:47
0
雪    币: 204
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
用FPE, Cheat Engine试下
2006-7-18 23:36
0
雪    币: 200
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
最初由 hnhhzy 发布
那就只有bp recv慢慢看了


也只能这样了
大工程
2006-7-19 09:54
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
偶是个门外汉,对网游的修改一窍不通.
不过对于单机版游戏的修改来看,应该有人物代码存在.
比如:单机游戏中,主角代码为01(或其他),跟随人物一代码为02,跟随人物代码为03,......等等.
然后在计算HP时,取得当前人物代码,再通过计算取得属性数据内存地址,再进行对应属性数值的处理.
也就是说,同一段代码,可以处理所有游戏人物的属性数据.
所以,还要在上面的函数调用前寻找计算人物属性数据内存地址的代码.关键是找到人物代码的存放地址.
猜测中:由于网游中每个玩家都有控制权,所以会为每个玩家分配人物代码(不知是注册时静态分配还是登陆时动态分配?),由于游戏中玩家周围随时都有战斗发生,为了动态显示各个玩家或怪的血量,这段代码就要不停地处于运行中.
从编程角度讲,就是这个游戏事件引擎在不断循环.
可以试着反汇编执行程序,找到这个游戏事件引擎,然后找出事件代码,用条件断点下断,再跟踪人物属性处理流程,研究透整个人物属性处理流程后,再修改就容易多了.
2006-7-19 16:04
0
雪    币: 200
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
最初由 keditgame 发布
偶是个门外汉,对网游的修改一窍不通.
不过对于单机版游戏的修改来看,应该有人物代码存在.
比如:单机游戏中,主角代码为01(或其他),跟随人物一代码为02,跟随人物代码为03,......等等.
然后在计算HP时,取得当前人物代码,再通过计算取得属性数据内存地址,再进行对应属性数值的处理.
也就是说,同一段代码,可以处理所有游戏人物的属性数据.
........


谢谢指导,晚上试试
2006-7-19 18:04
0
游客
登录 | 注册 方可回帖
返回
//