吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4761|回复: 8
收起左侧

[其他转载] delphi注入CALL不传参数成功

[复制链接]
相识满天下 发表于 2018-1-8 11:27
大家好!有人在研究热血江湖游戏吗?这游戏拿来练习破解和学习制作外挂是很不错的。这段时间我都在学习中。
有个问题请朋友们帮忙看看,我已经找到游戏的选怪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编号?在这里如何定义。
如能得到朋友们的指点,感激不尽!


发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

苏紫方璇 发表于 2018-1-8 11:48
把选怪的call改成字节数组十六进制机器码,然后内存写入。这样怪编号就直接改数组的内容
 楼主| 相识满天下 发表于 2018-1-8 11:58
苏紫方璇 发表于 2018-1-8 11:48
把选怪的call改成字节数组十六进制机器码,然后内存写入。这样怪编号就直接改数组的内容

是改成这样定义吗?
Tm = packed record
woofid:DWORD;;
end;
Ptm =^Tm;
写入内存是将这个5563改成十六进制机器码?写入的指针是哪个呢?和游戏里面的编号基址有关系吗?我是新手,能给我具体说说吗?谢谢
苏紫方璇 发表于 2018-1-8 12:17
原来学过delphi但已经忘光了,我意思是把你那段注入的shellcode改成十六进制机器码,例如(c语言格式)BYTE a[]="\x01\x02\x03",然后要改的话就改动数组里面的就行了,写入内存直接把这个数组写进去就可以了
Aperodry 发表于 2018-1-8 12:39

//选择怪物根据对象数组下标
BOOL CRoleObj::SelObj(DWORD dwIndexForAllObj)
{
__try
{

    __asm{
            //取当前选中选中对象下标
            mov edi, dword ptr ds : [Base_Role_Obj]
            mov eax, dword ptr ds : [edi + 0x19E4]
            cmp eax, 0xFFFF
            jz NextLable
            //取函数地址
            mov ecx, dword ptr ds : [eax * 4 + Base_AllObjList]
            mov edx, dword ptr ds : [ecx]
            mov eax, dword ptr ds : [edx + 0x4]
            push 0
            push 0  //取消选中状态
            push 0x450
            call eax
            NextLable :
            //置当前选中对象下标
            mov eax, dwIndexForAllObj
            mov dword ptr ds : [edi + 0x19E4], eax
            //取函数地址
            mov ecx, dword ptr ds : [eax * 4 + Base_AllObjList]
            mov edx, dword ptr ds : [ecx]
            mov eax, dword ptr ds : [edx + 0x4]
            push 0
            push 1  //显示选中状态
            push 0x450
            call eax
    }
}
__except (1)
{
    DbgPrintf("CRoleObj::SelObj(DWORD dwIndexForAllObj)");
}
return TRUE;

}



好久没玩这个游戏了 翻了下代码
9152pojie 发表于 2018-1-8 12:43
Aperodry 发表于 2018-1-8 12:39
[md]//选择怪物根据对象数组下标
BOOL CRoleObj::SelObj(DWORD dwIndexForAllObj)
{

叼,看来以前折腾过
 楼主| 相识满天下 发表于 2018-1-9 19:14
Aperodry 发表于 2018-1-8 12:39
[md]//选择怪物根据对象数组下标
BOOL CRoleObj::SelObj(DWORD dwIndexForAllObj)
{

谢谢你的回答。你这是C++语言编译的代码吗?我的意思是在delphi中如何调用有参数的stdcall到目标游戏中,只要能传参数就解决问题了。我今天下午尝试用键盘钩子调用dll动态链接库,但不成功,也不会出错,只是按键盘没反应。
 楼主| 相识满天下 发表于 2018-1-10 19:23
今天我改为用dll注入,尝试用键盘钩子调用函数,却不能成功!
能成功注入dll到游戏,按事先设置的HOME键能呼出窗口,点击调用函数时总跳出Access violation at address o817D6EE in module'DllGame', Read of address 00000418.
应该是热血江湖这游戏有反钩子注入导致的吧,有反调试。有人研究这游戏吗?可以一起学习!
 楼主| 相识满天下 发表于 2018-1-12 12:19
谢谢大家的热心帮助,今天重新用前面的方法,不用dll注入,改了一下代码,终于解决传参数问题了。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 10:55

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表