首页
社区
课程
招聘
[求助]用DELPHI钩住接口,我郁闷得不知道怎么弄,请高人指点
发表于: 2010-9-20 17:29 4867

[求助]用DELPHI钩住接口,我郁闷得不知道怎么弄,请高人指点

2010-9-20 17:29
4867
想在暴风影音放电影时在上面写字,思路是先HOOK它的里面的CreateSurface,结果怎么HOOK也出错,后来用自己写的一个简单的DIRECTX的程序来调,发现如果我自己的HOOK函数如果不Const,Out这些东西还可以进去,但在真正调用原函数时会出错,要是加了进都进不去就出错,请看代码:
//这个函数定义时如果不加关键字:const 和out可以进去,
//但调用原函数时会出错,如果加了就进不去就会出错即:
//function MyCreateSurfaceEx(lpDDSurfaceDesc: TDDSurfaceDesc2;
//               lplpDDSurface: IDirectDrawSurface7;
//                                 pUnkOuter: IUnknown): HResult; stdcall;

function MyCreateSurfaceEx(const lpDDSurfaceDesc: TDDSurfaceDesc2;
                                 out lplpDDSurface: IDirectDrawSurface7;
                                 pUnkOuter: IUnknown): HResult; stdcall;
type
  TNewCreateSurfaceEx=function(const lpDDSurfaceDesc: TDDSurfaceDesc2;
                                      out lplpDDSurface: IDirectDrawSurface7;
                                      pUnkOuter: IUnknown): HResult; stdcall;
begin
  asm
     pushad
     pushfd
  end;
  showmessage('MyCreateSurfaceEx Enter');
  asm
     popad
     popfd
  end;
  Result:=TNewCreateSurfaceEx(OldCreateSurfaceEx)(lpDDSurfaceDesc,lplpDDSurface,pUnkOuter
  showmessage('MyCreateSurfaceEx Exit');
end;

//
function MyDirectDrawCreateEx(lpGUID: PGUID; out lplpDD: IDirectDraw7;
                              const iid: TGUID; pUnkOuter: IUnknown): HResult; stdcall;
type
  TNewDirectDrawCreateEx=function(lpGUID: PGUID; out lplpDD: IDirectDraw7;
                                  const iid: TGUID; pUnkOuter: IUnknown): HResult; stdcall;
begin
  //showmessage('MyDirectDrawCreateEx');
   Hook[2].UnHook;
   MylpDD:=THookIDirectDraw7.Create(lpGUID,iid,pUnkOuter);
   Result := TNewDirectDrawCreateEx(Hook[2].BaseAddr)(lpGUID, lplpDD, iid, pUnkOuter);
   Hook[2].Hook;
   if Result<>DD_OK then  Exit;

    HookVirtualTable(Pointer(lplpDD),6,@MyCreateSurfaceEx,OldCreateSurfaceEx);
    //showmessage('lplpDD:='+inttostr(dword(lplpDD)));
end;

procedure HookVirtualTable(lpDD:Pointer;Index:Byte;NewFunc:Pointer;var OldFunc:Dword);
begin
   OldFunc:=PWord(Dword(lpDD^)+Index*4)^;
   PDword(Dword(lpDD^)+Index*4)^:=Dword(NewFunc);
end;

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这是OD里刚进入MyCreateSurfaceEx的截图,还请熟悉DELPHI朋友帮忙给看看,另外一个问题是:怎么在pushad指令前多出这么多函数来,是不是因为Const和Out的原故?黄色那个调用出错
错误信息:


OD截图:

进出错的函数,出错时EAX为0,不知道这个函数是干嘛的,我的MyCreateSurfaceEx没有啊。
上传的附件:
2010-9-20 17:49
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
在线等待,希望有大侠帮忙看看
2010-9-21 08:47
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
郁闷,谁来帮忙啊
2010-9-21 12:52
0
雪    币: 379
活跃值: (152)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
5
i先用工具看看这个函数是不是在导入表,无没有,采取inline,有采取Iat hook
2010-9-21 20:09
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
用了Inline HOOk也出错,我晕倒
2010-9-25 17:27
0
游客
登录 | 注册 方可回帖
返回
//