有人把OpenProcess加了钩子,不让其他程序打开它的句柄,我们如何才能突破限制呢
如题:有人的进程防杀秘籍是给OpenProcess挂钩,当其他程序要使用该函数打开句柄的时候,返回错误值,来禁止别人终止它的程序,如何才能突破这种限制呢 问题点数:100、回复次数:10Top
1 楼jasonjixiang(吉祥)回复于 2005-07-04 09:02:11 得分 5
upTop
2 楼krh2001(边城浪子)回复于 2005-07-04 09:22:44 得分 15
API 钩子的原理就是更改函数入口的头几个字节跳转到一个自定义的地方去执行。我们可以反其道而行之:先分析一下该函数的头几个字节的具体值,保存下来, 然后既然它的程序可以修改,那么你的程序也应该可以将它恢复回去。这样先检测一下函数的起始字节是否正常,若不正常则将它恢复回去,然后再去执行该函数。Top
3 楼ggg82(我喜欢...)回复于 2005-07-07 09:18:35 得分 0
如果他使用修改函数导入表,原函数的地址我无法得到怎么办呢,因为在不同系统,原函数的地址是不同的呀Top
4 楼linestyle(linestyle)回复于 2005-07-07 09:40:55 得分 10
同意 krh2001(边城浪子) 的说法啊,呵呵,强行搜索API,很多病毒都是这样的:)Top
5 楼lonelyeagle(行路难)回复于 2005-07-07 14:15:21 得分 20
不要试图用OpenProcess得到进程句柄,再通过TerminateProcess关闭进程。
换个思路,杀死该进程的所有线程,它一样会完蛋。
BOOL CProcessOperation::TerminateAProcess(DWORD dwPid)
{
HANDLE hThreadSnap = NULL;
THREADENTRY32 te32;
BOOL bThreadFind = FALSE;
hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,NULL);
if(hThreadSnap)
{
te32.dwSize = sizeof(THREADENTRY32);
bThreadFind = Thread32First(hThreadSnap,&te32);
while(bThreadFind)
{
if(te32.th32OwnerProcessID == dwPid)
{
HANDLE hThread = NULL;
hThread = OpenThreadTHREAD_ALL_ACCESS,FALSE,te32.th32ThreadID);
if(hThread)
{
TerminateThread(hThread,0);
CloseHandle(hThread);
}
}
te32.dwSize = sizeof(THREADENTRY32);
bThreadFind = Thread32Next(hThreadSnap,&te32);
}
CloseHandle(hThreadSnap);
}
return TRUE;
}
Top
6 楼ggg82(我喜欢...)回复于 2005-07-08 08:06:18 得分 0
上次一个朋友的机器中毒了,我怎么也结束不了那个进程,本想复制文件过去杀他,结果,系统复制文件不可用,让我只好到dos下去,可他的机器光驱又不顶用,进dos都得大费周折,气的不行,如果有好的方法,突破这种限制,那岂不是更好。
krh2001(边城浪子)的方法很好,只不过挂接api有好些方法,如果不是通过修改函数前几字节,如修改函数导入表,我们无法得到原函数地址,怎么办呢?
lonelyeagle(行路难)杀死线程的创意很不错,只不过,他即可以挂openprocess,那不也可以挂openthread,还有更好的方法吗?Top
7 楼ForTopLevel(Beahead)回复于 2005-07-08 13:02:52 得分 20
我原来也思考过这个问题,我觉得如果是我的话可以在函数输入表里判断openprocess和其他任何同DLL的输入函数的相对偏移来处理,要保证的只是被选做参照的那个函数不能也是被修改了的。如果发现这个偏移地址不正确,那你就只能手动在K.DLL里搜索函数地址了,然后再写回去。这个方法是我能想到的最简洁的了 :)Top
8 楼ggg82(我喜欢...)回复于 2005-07-08 15:21:30 得分 0
ForTopLevel(Beahead) :怎么在kernel32.dll中搜索函数地址呀,可以给个例子吗Top
9 楼alphagx(alpha)回复于 2005-07-09 16:23:25 得分 30
我以前写过一个程序,在驱动里面删除进程的。
首先根据PID 找到 相应的 EPROCESS,
然后
KeAttachProcess(pEP);
status = ZwTerminateProcess(NULL,NULL);
KeDetachProcess();
上层再怎么Hook都没用。
Top
10 楼alphagx(alpha)回复于 2005-07-09 16:24:38 得分 0
现在在ring0层杀进程的太多了。
象eva 写的 knlps,
pjp 的iceword,网上 goolge一把。Top




