|
原版:http://www.0ginr.com/bbs/viewthr ... &extra=page%3D1
function RemoveFWHook(szDllPath:char;szFuncName:char):Boolean;
var
lpBase:THandle;
lpFunc ointer;
dwRVA WORD;
hFile:THandle;
dwSize:THandle;
hMapFile WORD;
//-----------------
lpBaseMap ointer;
//------------------
lpRealFunc ointer;
//--修改访问权限
dwOldProtect WORD;
bRes:Boolean;
begin
//动态加载DLL
lpBase:=LoadLibrary(PAnsiChar(szDllPath));
//取得函数模块地址
lpFunc:=GetProcAddress(lpBase,pchar(szFuncName));
//判断返回值
If lpFunc=nil then RemoveFWHook:=False;
//计算RVA虚拟地址
dwRVA:= DWORD(lpFunc)-DWORD(lpBase);
//创建文件
hFile:=CreateFile(pchar(szDllPath), GENERIC_READ, FILE_SHARE_READ, nil,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
//判断结构
if hFile = INVALID_HANDLE_VALUE then
begin
RemoveFWHook := False;
exit
end;
//返回文件长度
dwSize:=GetFileSize(hFile, 0);
//创建文件映射
hMapFile:=CreateFileMapping(hFile, 0, PAGE_READONLY Or SEC_IMAGE, 0, dwsize,0);
//映射当前地址空间
lpBaseMap:=MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, dwSize);
//指向当前函数的指针-这个不知道怎么翻译,高人解释下
lpRealFunc:= pointer(lpBaseMap)+DWORD(dwRVA);
//函数初始化
bRes:=True;
//修改访问权限
if(VirtualProtect(lpFunc, 10, PAGE_EXECUTE_READWRITE, @dwOldProtect)) then
begin
CopyMemory(lpFunc, lpRealFunc, 10);
end
else
begin
bRes:= False;
end;
//解除映射
UnmapViewOfFile (lpBaseMap);
//关闭句丙
CloseHandle (hMapFile);
CloseHandle (hFile);
RemoveFWHook:= bRes;
end;
//指向当前函数的指针-这个不知道怎么翻译,高人解释下
lpRealFunc:= pointer(lpBaseMap)+DWORD(dwRVA);
这个错误,不知道怎么修改! |
|