最近在研究一款网络游戏的喊话CALL,记录如下
找call非常容易
喊话CALL :
特征码:83 C4 10 8D 44 24 14 50 56 8B CD
-- cpu --
006F6A9F |. 8D4424 14 LEA EAX,DWORD PTR SS:[ESP+14]
006F6AA3 |. 50 PUSH EAX ; /Arg2
006F6AA4 |. 56 PUSH ESI ; |Arg1
006F6AA5 |. 8BCD MOV ECX,EBP ; |
006F6AA7 |. E8 64FAFFFF CALL Moon.006F6510 ; \Moon.006F6510
0018EDE0 00000001 ... |Arg1 = 00000001
0018EDE4 0018EDFC . \Arg2 = 0018EDFC ASCII "123456"
-- register --
EAX 0018EDFC ASCII "123456"
ECX 1FA1A7C4
ESI 00000001
mov ecx,1FA1A7C4 ;ecx平衡值
push 0018EDFC ;喊话内容内存地址
push 00000001 ;喊话类型
call 006F6510
或者:
push 04FE0000 ;喊话内容内存地址
mov ecx,158C469C;ecx平衡值
call 006f69b0
这里找ecx平衡值就比较麻烦了,各种方法都找不到【ce、od组合查找】(可能水平还不够就是找不到,求大神指点)
找不到这个平横值,那就郁闷了。。。。
最后想到一个比较笨的方法,就是仿照CE搜索内存数据,依据如下:
在“喊话”过程中发现,虽然平衡值地址[1FA1A7C4] 是一个变值,但是,其对应的数据内容是不变的,所以就是根据数值内容去搜索游戏进程的内存数据,多次试验发现会
搜索到三个地址: 数组:3{7224874,7304364,474235804} ,把其前两条过滤掉,其实用ce搜索的话只能搜索到第三条;
所以这样就可以完美解决喊话了。
哈哈!方法虽然很笨,但很适用,算是一种写call的方法吧,分享给需要的同学。
另把结果贴一下:
一开始写的时候,用的自带模块申请内存,不好使,总是乱码,并且申请的内存是WG的内存而不是游戏的远程内存,
换超级模块的也是不成功,最后内存申请换成“清风”模块的就好了。如果不用模块就得自己引入DLL了,麻烦。。。。
执行结果是这样的:
总结:
变换思考,值不变,地址变化,不好搜索基址,就得另辟蹊径了。