delphi注入CALL不传参数成功
大家好!有人在研究热血江湖游戏吗?这游戏拿来练习破解和学习制作外挂是很不错的。这段时间我都在学习中。有个问题请朋友们帮忙看看,我已经找到游戏的选怪call,代码如下:
mov edi,
mov eax,dword ptr ds:
cmp eax,0xFFFF
je 0052CB15
mov ecx,dword ptr ds:
test ecx,ecx
je 0052CB15
mov edx,dword ptr ds:
mov eax,dword ptr ds:
push 0x0
push 0x0
push 0x450
call eax
上面的代码中,第一个是对象列表基址,这个星期四更新后的最新基址, push 第一个参数0表示取消选中,1表示选中
我用delphi制作选怪按钮测试,测试代码如下
procedure xuanCall();stdcall;
begin
asm
mov edi,$2D36514
mov edi,
mov eax,dword ptr ds:
mov ecx,dword ptr ds:
mov edx,dword ptr ds:
mov eax,dword ptr ds:
push 0
push 0
push 1104
call eax
mov eax,5563
mov dword ptr ds:,eax
mov ecx,dword ptr ds:
mov edx,dword ptr ds:
mov eax,dword ptr ds:
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编号?在这里如何定义。
如能得到朋友们的指点,感激不尽!
把选怪的call改成字节数组十六进制机器码,然后内存写入。这样怪编号就直接改数组的内容 苏紫方璇 发表于 2018-1-8 11:48
把选怪的call改成字节数组十六进制机器码,然后内存写入。这样怪编号就直接改数组的内容
是改成这样定义吗?
Tm = packed record
woofid:DWORD;;
end;
Ptm =^Tm;
写入内存是将这个5563改成十六进制机器码?写入的指针是哪个呢?和游戏里面的编号基址有关系吗?我是新手,能给我具体说说吗?谢谢 原来学过delphi但已经忘光了,我意思是把你那段注入的shellcode改成十六进制机器码,例如(c语言格式)BYTE a[]="\x01\x02\x03",然后要改的话就改动数组里面的就行了,写入内存直接把这个数组写进去就可以了 //选择怪物根据对象数组下标
BOOL CRoleObj::SelObj(DWORD dwIndexForAllObj)
{
__try
{
__asm{
//取当前选中选中对象下标
mov edi, dword ptr ds :
mov eax, dword ptr ds :
cmp eax, 0xFFFF
jz NextLable
//取函数地址
mov ecx, dword ptr ds :
mov edx, dword ptr ds :
mov eax, dword ptr ds :
push 0
push 0 //取消选中状态
push 0x450
call eax
NextLable :
//置当前选中对象下标
mov eax, dwIndexForAllObj
mov dword ptr ds : , eax
//取函数地址
mov ecx, dword ptr ds :
mov edx, dword ptr ds :
mov eax, dword ptr ds :
push 0
push 1 //显示选中状态
push 0x450
call eax
}
}
__except (1)
{
DbgPrintf("CRoleObj::SelObj(DWORD dwIndexForAllObj)");
}
return TRUE;
}
好久没玩这个游戏了 翻了下代码 Aperodry 发表于 2018-1-8 12:39
//选择怪物根据对象数组下标
BOOL CRoleObj::SelObj(DWORD dwIndexForAllObj)
{
叼,看来以前折腾过{:1_918:} Aperodry 发表于 2018-1-8 12:39
//选择怪物根据对象数组下标
BOOL CRoleObj::SelObj(DWORD dwIndexForAllObj)
{
谢谢你的回答。你这是C++语言编译的代码吗?我的意思是在delphi中如何调用有参数的stdcall到目标游戏中,只要能传参数就解决问题了。我今天下午尝试用键盘钩子调用dll动态链接库,但不成功,也不会出错,只是按键盘没反应。 今天我改为用dll注入,尝试用键盘钩子调用函数,却不能成功!
能成功注入dll到游戏,按事先设置的HOME键能呼出窗口,点击调用函数时总跳出Access violation at address o817D6EE in module'DllGame', Read of address 00000418.
应该是热血江湖这游戏有反钩子注入导致的吧,有反调试。有人研究这游戏吗?可以一起学习! 谢谢大家的热心帮助,今天重新用前面的方法,不用dll注入,改了一下代码,终于解决传参数问题了。
页:
[1]