Windows2000下Api函数的拦截分析

Windows2000下Api函数的拦截分析,第1张

Windows2000下Api函数的拦截分析,第2张

简介:

Api拦截并不是什么新技术,很多商业软件都在采用。拦截windows的Api函数只有两种方法。第一种方法是Jeffrey Richter先生的修改exe文件的模块输入部分。这种方法很安全,但是很复杂。而且,有些exe文件,没有dll的输入符号列表,可能无法拦截。第二种方法是常用的JMP XXX法。虽然很旧,但是很简单实用。

本文介绍了第二种方法在Win2k中的使用。第二种方法,在Win98/me下,因为有很多方法可以进入Ring0,比如LDT,IDT,Vxd等。,很容易动态修改内存中的代码,但是在Win2k下,这些方法都不能用,而且写WDM太复杂,表面上看起来很难实现,其实不然。Win2k为我们提供了强大的内存Api操作函数——VirtualProtectEx,WriteProcessMemory,ReadProcessMemory。有了它们,我们可以动态地修改内存中的代码。它的原型是:

l VirtualProtectex(
Handlehprocess,//要修改的内存的进程句柄
LPVOID lpAddress,//要修改的内存的起始地址
DWORD dwSize,//修改内存的字节数
DWORD flNewProtect,//修改的内存属性
PDWORD lpflOldProtect //修改前内存属性的地址
);
bool write process memory(
handle h process,//要写入的进程的句柄
LPVOID lpBaseAddress,//写入内存的起始地址
LPVOID lpBuffer,//写入数据的地址
DWORD nSize,//要写入的字节数
lpdword LP已写入的字节数//实际写入的分段数
);
bool readprocessmemory(
handle h process,//要读取的进程的句柄
lpvoid lpbase address,//读取内存的起始地址
LPVOID lpBuffer,//要读取的数据在
DWORD nSize中的地址,//要读取的字节数在
lpdword LP中读取的字节数//实际读取的分段数在
);

有关具体参数,请参见MSDN帮助。在Win2k下,由于Dll及其附属进程在同一个地址空,与Win9x/me中所有进程共享的地址空不同,所以需要通过hook函数远程注入进程。这里给出一个简单的钩子函数拦截MessageBoxA的例子:
Dll文件是:

HHOOK g _ hHook
h instance g _ hinst dll;
FARPROC pfmessagebox a;
int WINAPI my messageboxa(HWND HWND,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType);
BYTE OldMessageBoxACode[5],NewMessageBoxACode[5];
hm odule hm odule;
DWORD dwIdOld,dwIdNew
BOOL bHook = false;
void hook on();
void hook off();
BOOL init();
LRESULT WINAPI mous hook(int nCode,WPARAM wParam,LPARAM LPARAM);
BOOL API entry DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID LP reserved
){
switch(ul _ reason _ for _ call)
{
case DLL _ PROCESS _ ATTACH:
if(!init())
{
messagebox a(NULL," Init "," ERROR ",MB _ OK);
return(false);
}
case DLL _ THREAD _ ATTACH:
case DLL _ THREAD _ DETACH:
case DLL _ PROCESS _ DETACH:
if(b hook)un install hook();
break;
}
返回TRUELRESULT WinAPI hook的
}
hook函数
(int ncode,wparam wparam,lparam lparam)/空{
return(CallNextHookex(g _ hhook,ncode,wparam
}
Hook API 2 _ API Bool Install Hook()//输出Hook函数
{
g _ hinst dll = loadlibrary(" Hook API 2 .
g _ hHook = SetWindowsHookEx(WH _ GETMESSAGE,(HOOKPROC)Hook,g_hinstDll,0);
如果(!g _ hHook)
{
messagebox a(NULL,“设置错误”,“错误”,MB _ OK);
return(false);
}

返回(真);
}
Hook API 2 _ API Bool Uninstall Hook()//输出在钩子函数
{
return(unhook window shock(g _ hhook));
}

booinit()//初始化获取MessageBoxA的地址,生成Jmp XXX(MyMessageBoxA)的跳转指令
{
hm odule = loadlibrary(" user 32 . dll ");
pfmessagebox a = GetProcAddress(h module," messagebox a ");
if(pfMessageBoxA = = NULL)
返回false
_asm
{
lea edi,OldMessageBoxACode
mov esi,pfMessageBoxA
CLD
movsd
movsb
}
NewMessageBoxACode[0]= 0xe 9;//我的messagebox a
_ ASM
{
Leaeax,my MessageBoxa
Movebx,PF MessageBoxa
Subeax,EBX
Subeax,5
mov dword ptr[newmessagebox acode+1],eax
}
dwIdNew = getcurrent processid();//获取所属进程的ID
dwidond = dwind new;
hook on();//开始拦截
返回(true);
}
int winapi my messagebox a(hwnd hwnd,lpctstr lptext,lpctstr lpcaption,uintype)//先关闭拦截,然后调用被拦截的api函数
{
int n return = 0;
hook off();
nReturn=MessageBoxA(hWnd," Hook ",lpCaption,uType);
hook on();
return(n return);
}
void hook on()
{
HANDLE hProc;
dwIdOld = dwIdNew;
hProc = open PROCESS(PROCESS _ ALL _ ACCESS,0,dwIdOld);//获取所属进程的句柄
VirtualProtectex (hproc,pfmessageboxa,5,page _ readwrite,& dwidold);
//将所属进程中MessageBoxA的前5个字节的属性修改为可写
WriteProcessMemory (hproc,pf MessageBoxa,NewMessageBoxCode,5,0);
//将JMP所属进程中MessageBoxA的前5个字节改为mymessagebox a
VirtualProtectex(hproc,pf MessageBoxa,5,dwold,& dwold);
//将所属进程中MessageBoxA的前5个字节的属性修改为原来的属性
bHook = true;
}
void HookOff()//将自己进程中JMP MyMessageBoxA的代码改为JMP messagebox a
{
Handle H Proc;
dwIdOld = dwIdNew;
hProc = open PROCESS(PROCESS _ ALL _ ACCESS,0,dwIdOld);
VirtualProtectEx(hProc,pfMessageBoxA,5,PAGE_READWRITE,& dwIdOld);
WriteProcessMemory(hProc,pfMessageBoxA,OldMessageBoxACode,5,0);
VirtualProtectEx(hProc,pfMessageBoxA,5,dwIdOld,& dwIdOld);
b book = false;
}
//测试文件:
Intapientry WinMain(h instance h instance,
Hinstance HPRevinstance,
LPSTR LPCMDLINE,
IntncMDSHOW)
{[install Hook())
{
messagebox a(NULL," Hook Error!",“钩子”,MB _ OK);
return 1;
}
MessageBoxA(NULL," TEST "," TEST ",MB _ OK);//可以看到Test变成了钩子,也可以看到
if(!Uninstall hook())
{
messagebox a(NULL,“卸载错误!”,“钩子”,MB _ OK);
return 1;
}
返回0;
}

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » Windows2000下Api函数的拦截分析

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情