回 帖 发 新 帖 刷新版面

主题:[转帖]探讨:VB利用StickyApp32.DLL使进程防杀

原文:

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安全的)

回复列表 (共13个回复)

沙发

经过反汇编看到这个StickyApp32.exe文件应该是VB5编写的!所以目前要解决的是在VB5的机器上生成文件看。可惜本人不是VB5没办法测试*_*,希望有vb5的朋友测试看!

板凳

不会仅仅防任务管理器关掉它吧?
我自己写的一个程序(自己常挂在内存使用的)可以干掉它,可我没使用什么特别代码呀,就是常规的OpenProcess,再TerminateProcess。

怎么回事?

3 楼

[quote]不会仅仅防任务管理器关掉它吧?
我自己写的一个程序(自己常挂在内存使用的)可以干掉它,可我没使用什么特别代码呀,就是常规的OpenProcess,再TerminateProcess。

怎么回事?[/quote]
你是xp系统吗?我在2000高级服务器版里不可以的,它好像真的勾住了OpenProcess函数,而且我也试了用360来关机他的进程,结果也不行。

4 楼

我用的的确是XP Professional,在任务管理器里面结束进程的确无效,但用我自己写的程序来结束,的确可以干掉,另外,还可以用命令行ntsd -c q -p [pid]这个方式干掉。
但后2种方面会出现异常,StickyApp32.exe在进程列表里面消失后,过几秒钟,Explorer.exe会发现异常崩溃的。

5 楼

[quote]我用的的确是XP Professional,在任务管理器里面结束进程的确无效,但用我自己写的程序来结束,的确可以干掉,另外,还可以用命令行ntsd -c q -p [pid]这个方式干掉。
但后2种方面会出现异常,StickyApp32.exe在进程列表里面消失后,过几秒钟,Explorer.exe会发现异常崩溃的。[/quote]
恩,我在同事的机器里也测试了下,一运行就出现EXPLORER崩溃了!晕,只能在2000下有效,而且还是原文件。算了不弄了,伤心呀![em21]

6 楼

哦,我明白为什么我的程序可以干掉它了。

先分析一下它的原理:
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 楼

[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 楼

正好想请教诸位,P_CODE编译的VB程序是否很难破解?

9 楼

应该相对难破解

10 楼

问题解决,果然是VB5缘故。哈哈!

我来回复

您尚未登录,请登录后再回复。点此登录或注册