在编写防止文件拷贝时 ,发现如果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;
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课