主题:[转帖]探讨:VB利用StickyApp32.DLL使进程防杀
帅哥阳伞
[专家分:16530] 发布于 2008-05-24 07:10:00
原文:
form:http://www.internals.com/utilities_main.htm
StickyApp32
StickyApp32 is a tiny visual basic application which is resistant to termination attempts from the Windows NT task manager. It does this by establishing a hook on the OpenProcess API and modifying the return value of this function. Complete source code is included !
问题:
如果运行它本身生成的EXE文件是可以做到进程防杀的(icesword除外),但如果我们再生成一个EXE文件就不行了?
发现:
原来的StickyApp32.exe文件比我们后来生成的exe文件要小的多。
希望各位帮忙分析原因!
说明:如果用瑞星等杀软的客户请先将文件监控关闭下,否则会报病毒!(StickyApp32.dll安全的)
最后更新于:2008-05-24 07:16:00
回复列表 (共13个回复)
沙发
帅哥阳伞 [专家分:16530] 发布于 2008-05-27 09:03:00
经过反汇编看到这个StickyApp32.exe文件应该是VB5编写的!所以目前要解决的是在VB5的机器上生成文件看。可惜本人不是VB5没办法测试*_*,希望有vb5的朋友测试看!
板凳
tanchuhan [专家分:15140] 发布于 2008-05-27 10:57:00
不会仅仅防任务管理器关掉它吧?
我自己写的一个程序(自己常挂在内存使用的)可以干掉它,可我没使用什么特别代码呀,就是常规的OpenProcess,再TerminateProcess。
怎么回事?
3 楼
帅哥阳伞 [专家分:16530] 发布于 2008-05-27 13:45:00
[quote]不会仅仅防任务管理器关掉它吧?
我自己写的一个程序(自己常挂在内存使用的)可以干掉它,可我没使用什么特别代码呀,就是常规的OpenProcess,再TerminateProcess。
怎么回事?[/quote]
你是xp系统吗?我在2000高级服务器版里不可以的,它好像真的勾住了OpenProcess函数,而且我也试了用360来关机他的进程,结果也不行。
4 楼
tanchuhan [专家分:15140] 发布于 2008-05-27 16:55:00
我用的的确是XP Professional,在任务管理器里面结束进程的确无效,但用我自己写的程序来结束,的确可以干掉,另外,还可以用命令行ntsd -c q -p [pid]这个方式干掉。
但后2种方面会出现异常,StickyApp32.exe在进程列表里面消失后,过几秒钟,Explorer.exe会发现异常崩溃的。
5 楼
帅哥阳伞 [专家分:16530] 发布于 2008-05-27 17:13:00
[quote]我用的的确是XP Professional,在任务管理器里面结束进程的确无效,但用我自己写的程序来结束,的确可以干掉,另外,还可以用命令行ntsd -c q -p [pid]这个方式干掉。
但后2种方面会出现异常,StickyApp32.exe在进程列表里面消失后,过几秒钟,Explorer.exe会发现异常崩溃的。[/quote]
恩,我在同事的机器里也测试了下,一运行就出现EXPLORER崩溃了!晕,只能在2000下有效,而且还是原文件。算了不弄了,伤心呀![em21]
6 楼
tanchuhan [专家分:15140] 发布于 2008-05-27 17:15:00
哦,我明白为什么我的程序可以干掉它了。
先分析一下它的原理:
1、SetWindowsHookEx(WH_CBT, pHookFunction, hHookDLL, 0)挂一个系统全局钩子
2、当某进程启动时肯定有相应的事件发生,此时Windows把DLL插入相应的进程,并调用DLL里面的pHookFunction(或者说引起了WH_CBT钩子事件)
3、在pHookFunction里面判断是否已经钩了OpenProcess函数,如果还没则执行挂钩,否则跳过。
4、当某进程想结束其它进程时,它首先会调用OpenProcess,但由于之前已经在DLL里面挂钩了,会直接跳到DLL里面的OpenProcess_Handler。
5、在OpenProcess_Handler里面,判断函数的第3个参数dwProcessId是否要保护的进程ID,如果是则返回0,否则执行正常操作。
附主要代码:
DLL:
[code=c]
HANDLE __stdcall OpenProcess_Handler(DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId)
{
HANDLE RetValue = NULL;
HWND hWnd;
DWORD ProcessId;
hWnd = FindWindow("ThunderRT5Form", "StickyApp32");
GetWindowThreadProcessId(hWnd, &ProcessId);
if (dwProcessId != ProcessId)
RetValue = pOpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);
return RetValue;
}
__declspec(dllexport) LRESULT CALLBACK HookFunction(int code, WPARAM wParam, LPARAM lParam)
{
if (pOpenProcess == NULL)
pOpenProcess = (OPENPROCESS_PROC)HookAPIFunction(GetModuleHandle(NULL), "KERNEL32.DLL", "OpenProcess", (PROC)OpenProcess_Handler);
return false;
}
[/code]
EXE
[code=c]
hHookDLL = LoadLibrary("StickyApp32.DLL")
pHookFunction = GetProcAddress(hHookDLL, "HookFunction")
hSystemHook = SetWindowsHookEx(WH_CBT, pHookFunction, hHookDLL, 0)
[/code]
由于我的程序在系统启动时就已经启动了,并且作为键盘快捷键的后台程序,没有可见的窗口,因此StickyApp32启动后,我的程序并没有发生什么事件,也就无法引起WH_CBT这个钩子的调用。相应的DLL并没有插入我的进程,所以我的进程可以干掉StickyApp32
另外,这样一分析也解释了我的另外一个疑惑,就是启动StickyApp32后,再执行某些操作(例如显示桌面,最小化所有窗口之类的),我的程序就无法干掉StickyApp32。
这是由于这些操作引起了WH_CBT的调用
编译的EXE文件大小问题,我估计它那个版本是用P-Code方式来编译的
7 楼
帅哥阳伞 [专家分:16530] 发布于 2008-05-27 21:12:00
[quote]编译的EXE文件大小问题,我估计它那个版本是用P-Code方式来编译的[/quote]
不是的,P-Code我试过,大小还是达不到10K,大概是12k.而且P-Code代码反汇编是点不开STRING DATA REFERENCES按钮的,但它反汇编后还是可以点开的。
如图:
[color=800000]这张是后来生成的StickyApp32.exe文件[/color]
[img]http://file.pfan.cn/upfile/200805272125120.rar[/img]
[color=800000]这张是原来的StickyApp32.exe文件[/color][img]http://file.pfan.cn/upfile/200805272125759.rar[/img]
[color=800000]这张是p-code后的按钮变灰[/color]
[img]http://file.pfan.cn/upfile/200805272125226.rar[/img]
8 楼
asanscape [专家分:1350] 发布于 2008-05-28 11:56:00
正好想请教诸位,P_CODE编译的VB程序是否很难破解?
9 楼
帅哥阳伞 [专家分:16530] 发布于 2008-05-28 13:44:00
应该相对难破解
10 楼
帅哥阳伞 [专家分:16530] 发布于 2008-05-29 08:50:00
问题解决,果然是VB5缘故。哈哈!
我来回复