好友
阅读权限 10
听众
最后登录 1970-1-1
大家好!有人在研究热血江湖游戏吗?这游戏拿来练习破解 和学习制作外挂是很不错的。这段时间我都在学习中。
有个问题请朋友们帮忙看看,我已经找到游戏的选怪call,代码如下:
mov edi,[0x2D36514]
mov eax,dword ptr ds:[edi+0x1A3C]
cmp eax,0xFFFF
je 0052CB15
mov ecx,dword ptr ds:[eax*4+0x2D36518]
test ecx,ecx
je 0052CB15
mov edx,dword ptr ds:[ecx]
mov eax,dword ptr ds:[edx+0x4]
push 0x0
push 0x0
push 0x450
call eax
上面的代码中,第一个[0x2D36514]是对象列表基址,这个星期四更新后的最新基址, push 第一个参数0表示取消选中,1表示选中
我用delphi制作选怪按钮测试,测试代码如下
procedure xuanCall();stdcall;
begin
asm
mov edi,$2D36514
mov edi,[edi]
mov eax,dword ptr ds:[edi+$1A3C]
mov ecx,dword ptr ds:[eax*4+$2D36518]
mov edx,dword ptr ds:[ecx]
mov eax,dword ptr ds:[edx+$4]
push 0
push 0
push 1104
call eax
mov eax,5563
mov dword ptr ds:[edi+$1A3C],eax
mov ecx,dword ptr ds:[eax*4+$2D36518]
mov edx,dword ptr ds:[ecx]
mov eax,dword ptr ds:[edx+$4]
push 0
push 1
push 1104
call eax
end;
end;
这样的测试是成功的!
mov eax,$15a9 这句就是把怪物的编号放进eax,也就是选中这个怪物!
但是,我要在这个stdcall中传入参数却遇到困难。例如我通过遍历周围怪物,选中离自己最近的怪物,然后将这个怪物的编号传给
这个stdcall,查了网上的一些方法,都不成功。有些网上介绍说要先将这个参数先写人在程序申请的内存空间中,然后在访问。
例如自己先定义
type
Tm = packed record
woofid:integer;
end;
Ptm =^Tm;
然后在这个call中加入参数
改成
procedure xuanCall(p:ptm);stdcall;
var
count:integer;
begin
count:=p^.woofid;
....
后面的
mov eax,count
这样的方法对不对呢?
在调用的时候,没有参数我用下面这句就能选中怪,
WriteProcessMemory(hProcess,Calladdr,@xuanCall,MAX_PATH,gojiByte);
现在要把参数放进入,要再加一个句类似这样的语句吗?
例如怪物编号的基址是$00C07d84,从这个基址能读出怪物的编号是5563.我改怎样传参数呢?是传入基址$00C07d84,还是传入5563编号?在这里如何定义。
如能得到朋友们的指点,感激不尽!
发帖前要善用【论坛搜索 】 功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。