龙人在线
about me

Arron

抛砖只为引玉(QQ长期隐身在线)
不能富贵难成大器皆因懒,
胸无大志庸庸碌碌只为闲。

这里是我平时收集的和写的一些东西,希望和大家一起共同进步!

无聊看看电影 边听音乐边看 有空多交流
Google_search
Google
hot
latest
photos
还你真实的开幕式!震撼美图[转]【连载】 央行今日发行600万张面额10元奥运纪念钞(组图) 巧遇日本妹妹海滩拍片片 诱不可挡超级丰胸大美人
links
龙人在线 >> 天龙八部 >> 查找角色的相关信息分析一 【天龙】

查找角色的相关信息分析一 【天龙】

来源:来自网络 作者:不详 日期:2009-11-26 热度:
外挂分析笔记之一:
查找角色的相关信息,并写出测试代码

游戏:天龙八部
版本:0.35.0691
主要工具:OD+CE
开发环境:VS2005
作者:勿在浮沙筑高  转载文章请标明出处http://bbs.bpsend.com

要点:从人物的HP着手,找到人物的各种信息,分析出游戏定义的描述人物信息的关键结构,分析汇编代码还原成C++高级语言。

以我练的一个小号调试,下面开始:

1. 运行Game.exe,登陆,进入游戏。
2. 查看人物的HP,我目前的HP为7330。



3. 启动CE,并选择游戏对应的Game进程,然后“确定”。



4. 由于HP等信息基本不会是float等类型,一般为DWORD(int)等类型,也就是4字节大小,所以我们在CE里采用“精确收索”“4字节”类型的7330。(这里确定不要选中“16进制”,如果要使用“16进制”,那需要将十进制的7330转换成16进制数值)。设置好后,我们点击“首次收索”



看到上图中红色的那个“11”的数字,说明有11个地方都有7330这个数据,接下来我们打怪,让自己的HP变成另外一个值。这里我的新HP为7267。
5. 按照上面4的设置,我们再次收7267,这里要注意,这次不“首次收索”,而是采用“再次扫描”,也就是我们要在4的结果里面再找,看谁的值变成了7267(也就是当前我的HP的新值)。



这次就只剩下一个结果了(如果你还有多个结果,重复步骤5,直到剩下一个结果),这个结果就是保存我当前HP值的内存地址了。
6. 这时完全可以OD出马,不过这里CE也还可以继续使用(我这里接着以CE来讲解,进一步让你熟悉CE的用法)。双击这个唯一的地址,添加到CE下方的地址栏中。




7. 右键点击该地址,选择“查找写入该地址的代码”,如下:




此时会弹出一个窗体询问是否附加到进程,选“是”,出来一个新的空白窗体。




此时窗体里面没有代码,我们保持CE不动,回到游戏里面去打怪,让我们的HP再次改变。我打了一个怪,HP变成了7256。切回CE,窗体中出现了汇编代码,如下:


  

大家看到,这里是mov指令,由于我们前面的操作,可以知道就是该条指令修改了我们的HP的值,且注意这里使用了[]寻址方式。

8. 接下来就使用OD来分析(可以继续使用CE,不过到这里我觉得OD比较合适了)。
9. 运行OD,附加到进程Game.exe。这里由于CE已经附加,所以可能OD附加进程会失败,重新启动游戏就可以了。虽然人物信息的地址是动态会变化的,但是上面7中记录下来的代码的地址0x004E6875是不会变的,我们知道它就可以了。
10. 重新启动游戏,OD附加后,来到代码地址0x004E6875处:
mov dword ptr [eax+6D4], ecx
在这里F2下断,尝试打怪,变化我们的HP,这时OD及时断下,说明成功。这次先不用管,直接F9让程序跑起来。这里mov dword ptr [eax+6D4], ecx的目的操作数相当于是dword ptr [eax+6D4],这里汇编的[]寻址方式是基础,不做讲解。所以我们知道了HP的地址为eax+0x6D4,显然0x6D4是个偏移量,所以接下来我们就要分析eax是怎么得来的。往上看,贴出附近一段的代码:(为了便于我们查看,我去掉了部分字符串)
004E6810 55 push ebp
004E6811 8BEC mov ebp, esp
004E6813 56 push esi
004E6814 8BF1 mov esi, ecx // 1-3 esi = ecx
004E6816 8B4E 08 mov ecx, dword ptr [esi+8]
004E6819 8B01 mov eax, dword ptr [ecx]
004E681B 57 push edi
004E681C FF90 14010000 call dword ptr [eax+114]
004E6822 83F8 02 cmp eax, 2
004E6825 8B3D 58285D00 mov edi, dword ptr [5D2858]
004E682B 75 19 jnz short 004E6846
004E682D 68 1B060000 push 61B
004E6832 68 9CD45E00 push 005ED49C
004E6837 68 FCD45E00 push 005ED4FC
004E683C 68 D4D45E00 push 005ED4D4
004E6841 FFD7 call edi
004E6843 83C4 10 add esp, 10
004E6846 8B4E 08 mov ecx, dword ptr [esi+8]
004E6849 8B11 mov edx, dword ptr [ecx]
004E684B FF92 14010000 call dword ptr [edx+114]
004E6851 83F8 01 cmp eax, 1
004E6854 75 19 jnz short 004E686F
004E6856 68 1C060000 push 61C
004E685B 68 9CD45E00 push 005ED49C
004E6860 68 B4D55E00 push 005ED5B4
004E6865 68 D4D45E00 push 005ED4D4
004E686A FFD7 call edi
004E686C 83C4 10 add esp, 10
004E686F 8B46 04 mov eax, dword ptr [esi+4] // 1-2 eax = [esi+4]
004E6872 8B4D 08 mov ecx, dword ptr [ebp+8]
004E6875 8988 D4060000 mov dword ptr [eax+6D4], ecx // 1-1 断在这里,我们需要找eax

分析上面的代码,我们断在1-1处,要找eax,往上看1-2,我们得知eax=[esi+4],所以我们就需要找esi,再向上找到1-3处,发现esi = ecx。所以我们在这步里最终要找ecx。这里显然ecx是父函数传递进来的,熟悉面向对象和汇编的朋友可能已经想到了,在类的成员函数的调用过程中,基本都是使用ecx来传递this指针。所以我们需要去到该函数的父函数,去分析ecx是如何得来了。

11. 在该函数下断,然后打怪,使HP变化,OD断下,然后ctrl+f9(可能需要f8,不过我这版本是直接到了父函数),来到父函数。我们看到如下的调用代码:
0047B56A E8 A1B20600 call 004E6810
这里我们只关心对ecx的操作,贴出该call上面的代码段:
0047B4F0 55 push ebp
0047B4F1 8BEC mov ebp, esp
0047B4F3 51 push ecx
0047B4F4 A1 60856200 mov eax, dword ptr [628560]
0047B4F9 3B05 7C856200 cmp eax, dword ptr [62857C]
0047B4FF 53 push ebx
0047B500 56 push esi
0047B501 0F85 3E070000 jnz 0047BC45
0047B507 8B75 08 mov esi, dword ptr [ebp+8]
0047B50A 8B0D 8C726200 mov ecx, dword ptr [62728C] // ecx确定
0047B510 8B46 08 mov eax, dword ptr [esi+8]
0047B513 8B11 mov edx, dword ptr [ecx]
0047B515 50 push eax
0047B516 FF52 44 call dword ptr [edx+44]
0047B519 8BD8 mov ebx, eax //2-3 ebx = eax
0047B51B 85DB test ebx, ebx
0047B51D 895D FC mov dword ptr [ebp-4], ebx
0047B520 0F84 1F070000 je 0047BC45
0047B526 F646 0C 01 test byte ptr [esi+C], 1
0047B52A 57 push edi
0047B52B 8BBB 54010000 mov edi, dword ptr [ebx+154] // 2-2 edi = [ebx + 154]
0047B531 74 2B je short 0047B55E
0047B533 8B46 18 mov eax, dword ptr [esi+18]
0047B536 50 push eax
0047B537 8BCF mov ecx, edi
0047B539 E8 F2960600 call 004E4C30
0047B53E 8B0D 8C726200 mov ecx, dword ptr [62728C]
0047B544 3B59 64 cmp ebx, dword ptr [ecx+64]
0047B547 75 15 jnz short 0047B55E
0047B549 8B47 04 mov eax, dword ptr [edi+4]
0047B54C 8B0D B8856200 mov ecx, dword ptr [6285B8]
0047B552 8B40 5C mov eax, dword ptr [eax+5C]
0047B555 8B11 mov edx, dword ptr [ecx]
0047B557 50 push eax
0047B558 FF92 B4000000 call dword ptr [edx+B4]
0047B55E F646 0C 02 test byte ptr [esi+C], 2
0047B562 74 0B je short 0047B56F
0047B564 8B4E 20 mov ecx, dword ptr [esi+20]
0047B567 51 push ecx
0047B568 8BCF mov ecx, edi // 2-1 ecx = edi
0047B56A E8 A1B20600 call 004E6810

通过分析,我们看到2-1 ecx = edi,2-2 edi = [ebx+0x154],2-3 ebx = eax,所以我们就需要找到eax的来源。这里是eax,我们就要注意了,eax一般都做为函数的返回值,看2-3上面紧接着的就是一个call调用,所以我们有理由相信,eax是该call的返回值。

我们在
0047B516 FF52 44 call dword ptr [edx+44]
0047B519 8BD8 mov ebx, eax //2-3 ebx = eax
的开头下断,F8步过,发现eax确实被改变,所以我们的推测是正确的,eax是该call的返回值。也就是说,这里的这个call,就是为了计算出eax,给后面的代码使用。看来现在我们需要分析分析这个call了。

12。在call这句下断,OD断下后F7进入,分析代码。
该call里面又调用了其他call,计算量比较大,单步跟中不太现实,所以我们改变策略。
13.我们在
0047B519 8BD8 mov ebx, eax //2-3 ebx = eax
这句下断,观察此时eax的值为0x0714E0D0,然后用CE收索该值,我这里得到6个结果,不多,挨个地址下内存写入断点(这里一般是第一个),打怪,使我们的HP变化。
这里就遇到问题了:居然一个也未断到,这是为什么呢??
我来告诉你,天龙你们是换地图人物属性的地址才会改变,所以我们在第一个地址下断,然后换地图,OD成功断下,代码:
00402A50 55 push ebp
00402A51 8BEC mov ebp, esp
00402A53 6A FF push -1
00402A55 68 74465B00 push 005B4674
00402A5A 64:A1 00000000 mov eax, dword ptr fs:[0]
00402A60 50 push eax
00402A61 64:8925 0000000>mov dword ptr fs:[0], esp
00402A68 81EC 8C0B0000 sub esp, 0B8C
00402A6E A1 D06E6200 mov eax, dword ptr [626ED0]
00402A73 53 push ebx
00402A74 33C5 xor eax, ebp
00402A76 56 push esi
00402A77 8945 F0 mov dword ptr [ebp-10], eax
00402A7A A1 8C726200 mov eax, dword ptr [62728C] // 3-3 eax = [62728C]
00402A7F 57 push edi
00402A80 8BF9 mov edi, ecx
00402A82 8B48 64 mov ecx, dword ptr [eax+64] // 3-2 ecx=[eax+0x64]
00402A85 894F 0C mov dword ptr [edi+C], ecx // 3-1 这里ecx

注意上面红色的3句,是否已经找到了我们需要的?????

14.总结
根据前面的分析,我们要找的HP的地址为:
[[[[0x62728C] + 0x64] + 0x154] + 0x4] + 0x6D4

其他MP,经验等等都可以通过该方式来找,剩下的就是分析人物信息所使用的数据结构,这个就是时间的问题,应该不需要讲。

到此任务基本完成,接下来是使用vs2005写代码来显示人物的相关信息,分析都搞定了,编程就是我们拿手的,主要代码及运行效果如下(其中未显示的是我没添加对应代码):


Tags: 天龙 八部
广告位招租,广告代号:gg468
search
站内
advertise
Copyright © www.jx19.Com All rights reserved.