首页
社区
课程
招聘
[求助]call的参数
发表于: 2016-3-1 15:43 3946

[求助]call的参数

2016-3-1 15:43
3946

Hook 0060DA84 请教如何获得该过程有几个参数


请教各位大神,求指点,谢谢!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 115
活跃值: (23)
能力值: (RANK:20 )
在线值:
发帖
回帖
粉丝
2
第一句应该是个if结构,ebp+8是局部变量,和c进行比较
不等于跳到22的地方,至于call的参数,第一个应该是null
0070b344是个全局变量吧
2016-3-1 16:00
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我修改了 0060DA84 跳转到自己的函数

  asm

    push ebp
    mov ebp,esp
    push ecx
    mov ecx,$00000009
   
    push [ebp + $C]
    push [ebp + $8]
    call ProcessUserMessageX;  //我call到自己的过程,获取到的变量不正确而且call了之后,没有做任何改变,原函数也会报错,不知道是为啥

    mov eax,FOldFunc3
    add eax,9   这里我跳转了9 原来我修改了前面的 5个字节 但是他前五个字节的命令是一起的,然后我就全写上去,然后跳转到9 在执行 不知道对不对
    jmp eax
  end;

请大神在帮我看一看,谢谢指点
2016-3-1 16:20
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
昨天研究了一夜,才发现原来这个函数是类成员函数
然后这个函数的原形是
procedure TUserEngine.ProcessUserMessage(PlayObject: TPlayObject; DefMsg: pTDefaultMessage; Buff: PChar);
然后我重新开始HOOK
procedure AAX(PlayObject: TPlayObject; DefMsg: pTDefaultMessage; buff:PChar );
var
pzz : TPlayObject;
dzz : pTDefaultMessage;
bzz : pchar;
begin
asm
push ebp       // 原地址的内容
mov ebp,esp  // 原地址的内容

    mov eax, dword ptr [ebp +$10]
    mov bzz,eax
    mov eax, dword ptr [ebp +$C]
    mov dzz,eax
    mov eax,dword ptr [ebp +$8]
    mov pzz,eax
    pushad
    pushfd
end
rev(pzz,dzz,bzz); //调用自己的函数
asm
    popfd
    popad

push ecx  // 原地址的内容
mov ecx,$00000009  // 原地址的内容
    mov eax,FOldFunc2 //原函数的地址
    add eax,9
    jmp eax
end;
end;

function rev(PlayObject: TPlayObject; DefMsg: pTDefaultMessage; buff:PChar):integer;  stdcall;
begin
Result := 0;
end;

我现在这样写 在 rev 中 可以正确的 获得 playObject 和 DefMsg 两个参数 但是第三个参数 buff 获取就异常

在回传给原函数的 三个参数中 前两个也是正常的 但是 buff 就有错误
引起报错,其他两个参数却没有问题

希望有高人指点迷津。。
2016-3-2 14:38
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
又经过一天整天的研究.
发现两个可以HOOK 的方式但是还是异常
创了一个类
Txxx = class
private
public
procedure ProcessUserMessAge(PlayObject: TPlayObject; DefMsg: pTDefaultMessage; Buff: PChar);
procedure  Hook( PlayObject: TPlayObject; DefMsg: pTDefaultMessage; Buff: PChar );
procedure hook2();
end;

如果 将 0060DA84 jmp 到 Hook2的话
procedure Txxx.hook2();
begin
asm
push ebp
mov ebp,esp
push ecx
mov ecx,$00000009
mov eax,FOldFunc2
jmp eax
end;
end;
可以完全正常的调用到原来的函数 但是在中间想用
[EBP + $10]
[EBP + $C]  
[EBP + $8]  
操作参数的话, 获取第三个参数 PCAHR的时候乱码.而且获取后,回调到到原函数的参数也会乱码.

--------------------------------------------------------------------------------------------------------

如果 将 0060DA84 jmp 到 Hook的话
procedure Txxx.Hook( PlayObject: TPlayObject; DefMsg: pTDefaultMessage; Buff: PChar );
begin
  // 这里可以测试 三个参数 获得到的内容全都是正确的
Self.ProcessUserMessAge(PlayObject,DefMsg,buff); //我是想利用这里回调原来的函数
end;
procedure Txxx.ProcessUserMessAge(PlayObject: TPlayObject; DefMsg: pTDefaultMessage; Buff: PChar);
begin
asm
push ebp
mov ebp,esp
push ecx
mov ecx,$00000009
mov eax,FOldFunc2
jmp eax
end;
end;

直接 这样调用的话  在 hook 前面调试 三个参数全都是正确的 但是调用到 Txxx.ProcessUserMessAge 第三个参数 pchar 就会乱码,

怎么测试 参数三总是会异常,.找不到是什么原因引起第三个参数错误, 麻烦各位好心人帮我看看吧.
2016-3-3 01:00
0
游客
登录 | 注册 方可回帖
返回