首页
社区
课程
招聘
[求助]RING3下INLINE hook 问题
发表于: 2010-1-5 21:58 4701

[求助]RING3下INLINE hook 问题

2010-1-5 21:58
4701
在编写防止文件拷贝时 ,发现如果inlinehook CopyFileExw时,发现如果在自己hook的 函数 中先恢复覆盖原来函数的指令,再调用原来的函数时,发现内存读错误,通过查资料,知道是线程同步引起的问题,但是本人想问一下,难道就没有解决的办法,请大牛帮帮!!!!!!!

主要代码如下:

//防止文件被拷贝
function My_CopyFileEx(lpExistingFileName:PWideChar;lpNewFileName :PWideChar;lpProgressRoutine:Pointer;lpData:Pointer;pbCancel:PBool;dwCopyFlags:Cardinal):LongBool;stdcall;
var
zrn :Cardinal;
begin
WriteProcessMemory(CpyHandle, CpyAddress, @OldCpy, 8, zrn); //這一句是恢复成原來函數的指令,
if true then
begin
出错就是这一句,一调用原函数,就使ie崩溃??????????????
TMy_CopyFileEx(CpyAddress)(lpExistingFileName,lpNewFileName,lpProgressRoutine,lpData ,pbCancel , dwCopyFlags);

end
else
begin
RESULT:=FALSE;
end;
WriteProcessMemory(CpyHandle, CpyAddress, @NewCpy, 8, zrn); //這一句是修改成新的函數的地址,
end;

//inlinehook过程
procedure HookCopy();
var
  DLLModule: THandle;
  nSize: Cardinal;
  Dat: DWORD;
  Tmp : array [0..3] of Byte;
begin
CpyHandle:=GetCurrentProcess;
DLLModule := LoadLibrary('kernel32.dll');
CpyAddress:=GetProcAddress(DLLModule,'CopyFileExW');
Dat:=DWORD(@My_CopyFileEx);
move(Dat,Tmp,4);
NewCpy[0] := $B8; // 汇编跳转指令(moe eax,xxxx)
NewCpy[1] := Tmp[0]; // 跳转到自身的函数
NewCpy[2] := Tmp[1];
NewCpy[3] := Tmp[2];
NewCpy[4] := Tmp[3];
NewCpy[5] := $FF; (jmp eax)
NewCpy[6] := $E0;
NewCpy[7] := 0;
if ReadProcessMemory(CpyHandle, CpyAddress, @OldCpy,  8, nSize) then      // 读取系统函数内存地址
if WriteProcessMemory(CpyHandle,CpyAddress, @NewCpy, 8, nSize) then
end;

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
恢复再调用,不要用这么搓的Hook方法嘛。而且你这个根本也防不住。。。
2010-1-5 22:03
0
雪    币: 379
活跃值: (152)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
3
我是恢复了原函数的前8条指令,再调用的,为什么还是不行???我也知道没啥作用,难道要在ring0下hook?请lz指教
2010-1-5 22:12
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
4
你检查下恢复时到底写成功没有,有没有指令碎屑,若是恢复正确就不至于崩溃
2010-1-5 22:55
0
雪    币: 379
活跃值: (152)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
5
没有指令碎片,但是通过跟踪指令发现是恢复原来函数的入口地址发生错误,为什么改不回去呢??
WriteProcessMemory(CpyHandle, CpyAddress, @OldCpy, 8, zrn); 这条为什么不行,请achillis 帮我看看
2010-1-6 10:34
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
6
Write之后GetLastError一下吧
2010-1-6 10:40
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
ring3可以debug或者od吧?
2010-1-6 10:42
0
雪    币: 379
活跃值: (152)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
8
感谢,已查出原因,
2010-1-6 11:08
0
游客
登录 | 注册 方可回帖
返回
//