在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
论坛放出地址搜索器,有些会员问如何在不开游戏的情况下找出我们所需的地址,以前因为懒得分析,所以也没有寻根问题,于是去写了一下.原来竟如何简单.
下面是我分析的思路.希望给初级的写挂着一点帮助. 工具的准备: 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 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论