论坛放出地址搜索器,有些会员问如何在不开游戏的情况下找出我们所需的地址,以前因为懒得分析,所以也没有寻根问题,于是去写了一下.原来竟如何简单.
下面是我分析的思路.希望给初级的写挂着一点帮助.
工具的准备:
16进制分析工具,大名鼎鼎WinHex,可以在下面地址下载到
http://www.ghoffice.com/bbs/read.php?tid-54655.html
1.用WinHex打开elementclient.exe,可以看到下面的结果
观察了一下,自然看不懂.
2.特征码,学过汇编的朋友会知道,每一条汇编指令都对应着相应的CPU指令,我们叫他机器码
以打坐为例,下断找打坐的CALL,这个大都应该都会了吧.以下是49版的打坐与停止打坐CALL
分析一下
0045960E 8A4424 04 mov al, byte ptr [esp+4]
00459612 84C0 test al, al
00459614 74 0A je short 00459620
00459616 E8 45611800 call 005DF760 //CALL指令,下次更新就会改变.
0045961B B0 01 mov al, 1
0045961D C2 0400 retn 4
00459620 E8 7B611800 call 005DF7A0 //CALL指令,下次更新就会改变.
00459625 B0 01 mov al, 1
00459627 C2 0400 retn 4
0045962A 90 nop
0045962B 90 nop
0045962C 90 nop
0045962D 90 nop
0045962E 90 nop
0045962F 90 nop
00459630 A1 40DA9800 mov eax, dword ptr [98DA40]
那我们怎么来确定要选用哪条指令的机器码呢?
00459616 E8 45611800 call 005DF760 这两样CALL是会改变的,也是我们要找的,所以不可能将它作为特征码来寻找.
0045961B B0 01 mov al, 1 //这条句语雷同的很多
0045961D C2 0400 retn 4 这两条雷同性太多.又太短.
于是我们选择下面的几行.
00459625 B0 01 mov al, 1
00459627 C2 0400 retn 4
0045962A 90 nop
0045962B 90 nop
0045962C 90 nop
0045962D 90 nop
0045962E 90 nop
0045962F 90 nop
00459630 A1 40DA9800 mov eax, dword ptr [98DA40]
假设这一段在每次更新时,都不会改变,好,将机器码按顺序取出.如下
B0 01 C2 0400 90 90 90 90 90 90 A1 40DA9800 最后一个地址省去,因为下次会改变.
3.寻找这段机器码在elementclient.exe的位置.WinHex工具栏---搜索----查找16进制数值,填入我们要找的值
会搜到如下图:
于是我们也知道了EXE里存放的机器指令,都对应着一条条的汇编指令.呵呵,也就是我们编译后的能让CPU执行的指令.^_^
4.下面就是我们如何取出CALL地址了.
00459616 E8 45611800 call 005DF760
E8=CALL
45611800 =005DF760
这是机器识别的,为什么45611800 =005DF760 ??
对,看这条指令的在winHex的偏移.
如前面的图,我们可以知道B0 01 C2 0400 90 90 90 90 90 90 A1 是在
$59625这个地址,实际地址我们得从EXE文件的起始地址开始算.为什么每个EXE的起始地址为$400000,所以elementclient.exe+$59625=$400000+$59625=$459625 而这个地址就是
00459625 B0 01 mov al, 1 的起始地址.
那么00459620 E8 7B611800 call 005DF7A0 这里的005DF7A0 是如何得到的呢?
算一下差值:005DF7A0 - 459625 =18617B 这个值,不就是
E8 7B611800 中的值吗?
原来,E8 7B611800这条指令所变成汇编语句的CALL地址,是该地址在EXE的偏移值+7B611800而得到,那说明7B611800本就是一个偏移值,回忆了一下上学时老师曾经讲过,所有的函数,一经编译,都不会存在函数名,一切都只是地址.那么我们就可以清楚的知道,原来这个7B611800就是一个函数,函数的入口地址就是本条指令的地址加上这个偏移值而得.哈哈.你也可以理解成这个函数其实在内存中就是放在这条指令偏移7B611800的地址.CALL 005DF7A0 这个地址,就是由此而来.
基本上,分析到这里,我们就可以写出代码来实现读取CALL地址的函数了.
总结一下,其实不开游戏找CALL地址比较容易.第一,下断找到CALL地址,然后分析哪此指令是不会常变,而且最好是唯一的.
再则写代码开始搜过文件.
delphi的源码,本论坛就有.我就不贴了.
我把我做的搜索器贴出来,大家可以下载,不过我没有找所有的特征码.
如果大家有兴趣,可以自己把我这个半成品完成的更多一点.

下面是我分析的思路.希望给初级的写挂着一点帮助.
工具的准备:
16进制分析工具,大名鼎鼎WinHex,可以在下面地址下载到
http://www.ghoffice.com/bbs/read.php?tid-54655.html
1.用WinHex打开elementclient.exe,可以看到下面的结果
观察了一下,自然看不懂.
2.特征码,学过汇编的朋友会知道,每一条汇编指令都对应着相应的CPU指令,我们叫他机器码
以打坐为例,下断找打坐的CALL,这个大都应该都会了吧.以下是49版的打坐与停止打坐CALL
分析一下
0045960E 8A4424 04 mov al, byte ptr [esp+4]
00459612 84C0 test al, al
00459614 74 0A je short 00459620
00459616 E8 45611800 call 005DF760 //CALL指令,下次更新就会改变.
0045961B B0 01 mov al, 1
0045961D C2 0400 retn 4
00459620 E8 7B611800 call 005DF7A0 //CALL指令,下次更新就会改变.
00459625 B0 01 mov al, 1
00459627 C2 0400 retn 4
0045962A 90 nop
0045962B 90 nop
0045962C 90 nop
0045962D 90 nop
0045962E 90 nop
0045962F 90 nop
00459630 A1 40DA9800 mov eax, dword ptr [98DA40]
那我们怎么来确定要选用哪条指令的机器码呢?
00459616 E8 45611800 call 005DF760 这两样CALL是会改变的,也是我们要找的,所以不可能将它作为特征码来寻找.
0045961B B0 01 mov al, 1 //这条句语雷同的很多
0045961D C2 0400 retn 4 这两条雷同性太多.又太短.
于是我们选择下面的几行.
00459625 B0 01 mov al, 1
00459627 C2 0400 retn 4
0045962A 90 nop
0045962B 90 nop
0045962C 90 nop
0045962D 90 nop
0045962E 90 nop
0045962F 90 nop
00459630 A1 40DA9800 mov eax, dword ptr [98DA40]
假设这一段在每次更新时,都不会改变,好,将机器码按顺序取出.如下
B0 01 C2 0400 90 90 90 90 90 90 A1 40DA9800 最后一个地址省去,因为下次会改变.
3.寻找这段机器码在elementclient.exe的位置.WinHex工具栏---搜索----查找16进制数值,填入我们要找的值
会搜到如下图:
于是我们也知道了EXE里存放的机器指令,都对应着一条条的汇编指令.呵呵,也就是我们编译后的能让CPU执行的指令.^_^
4.下面就是我们如何取出CALL地址了.
00459616 E8 45611800 call 005DF760
E8=CALL
45611800 =005DF760
这是机器识别的,为什么45611800 =005DF760 ??
对,看这条指令的在winHex的偏移.
如前面的图,我们可以知道B0 01 C2 0400 90 90 90 90 90 90 A1 是在
$59625这个地址,实际地址我们得从EXE文件的起始地址开始算.为什么每个EXE的起始地址为$400000,所以elementclient.exe+$59625=$400000+$59625=$459625 而这个地址就是
00459625 B0 01 mov al, 1 的起始地址.
那么00459620 E8 7B611800 call 005DF7A0 这里的005DF7A0 是如何得到的呢?
算一下差值:005DF7A0 - 459625 =18617B 这个值,不就是
E8 7B611800 中的值吗?
原来,E8 7B611800这条指令所变成汇编语句的CALL地址,是该地址在EXE的偏移值+7B611800而得到,那说明7B611800本就是一个偏移值,回忆了一下上学时老师曾经讲过,所有的函数,一经编译,都不会存在函数名,一切都只是地址.那么我们就可以清楚的知道,原来这个7B611800就是一个函数,函数的入口地址就是本条指令的地址加上这个偏移值而得.哈哈.你也可以理解成这个函数其实在内存中就是放在这条指令偏移7B611800的地址.CALL 005DF7A0 这个地址,就是由此而来.
基本上,分析到这里,我们就可以写出代码来实现读取CALL地址的函数了.
总结一下,其实不开游戏找CALL地址比较容易.第一,下断找到CALL地址,然后分析哪此指令是不会常变,而且最好是唯一的.
再则写代码开始搜过文件.
delphi的源码,本论坛就有.我就不贴了.
我把我做的搜索器贴出来,大家可以下载,不过我没有找所有的特征码.
如果大家有兴趣,可以自己把我这个半成品完成的更多一点.

附件:
基址搜索器.rar (必须允许开新窗口) (173 K) 下载次数:79
浙公网安备 33010602011771号