小弟我写了一个钩子的类,用bc6编译和调用的时候遇到点有关问题,用bc2010编译变成了局部钩子,大家帮忙看上,多谢
我写了一个钩子的类,用bc6编译和调用的时候遇到点问题,用bc2010编译变成了局部钩子,大家帮忙看下,谢谢!
这是在头文件声明的THOOK类
这是在头文件声明的THOOK类
class THOOK
{
FARPROC fp;
FARPROC newfp;
HMODULE hModule;
BYTE OldCode[5];
BYTE NewCode[5];
DWORD OldFnID;
DWORD NewFnID;
public:
int flag;
bool bHook;
THOOK *next;
THOOK();
void HookOn();
void HookOff();
bool init(char *dllname,char *prname,FARPROC MyP);
~THOOK();
};
THOOK::THOOK()
{
flag=-1;
bHook=false;
for(int i=0;i<5;i++)
{
OldCode[i]=0xe9;
NewCode[i]=0;
}
fp=NULL;
newfp=NULL;
hModule=NULL;
OldFnID=0;
NewFnID=0;
next=NULL;
}
THOOK::~THOOK()
{
flag=-1;
if(bHook) HookOff();
delete(OldCode);
delete(NewCode);
fp=NULL;
newfp=NULL;
hModule=NULL;
//用BC6编译时如果调用出错在这里或是构造函数里任意地方添加空行再编译,调用就会成功
//这也就是我的第一个问题,用BC2010编译就不会出现调用错误;
OldFnID=0;
NewFnID=0;
if(next)
{
delete(next);
next=NULL;
}
}
bool THOOK::init(char *dllname,char *prname,FARPROC MyP)
{
hModule=GetModuleHandle(dllname);
fp=GetProcAddress(hModule,prname);
if(fp==NULL) return false;
Move(fp,OldCode,5);
newfp=MyP;
NewCode[0]=0Xe9;
DWORD *addr;
addr=(DWORD *)(NewCode+1);
*addr=DWORD(newfp)-DWORD(fp)-5;
NewFnID=GetCurrentProcessId();
OldFnID=NewFnID;
HookOn();
return true;
}
void THOOK::HookOn()
{
OldFnID=NewFnID;
HANDLE hProc=OpenProcess(PROCESS_ALL_ACCESS,0,OldFnID);
VirtualProtectEx(hProc,fp,5,PAGE_READWRITE,&OldFnID);
WriteProcessMemory(hProc,fp,NewCode,5,0);
VirtualProtectEx(hProc,fp,5,OldFnID,&OldFnID);
bHook=true;
}
void THOOK::HookOff()
{
OldFnID=NewFnID;
HANDLE hProc=OpenProcess(PROCESS_ALL_ACCESS,0,OldFnID);