很弱智的文章,VC高手就不用看了。
注意:如果在IS启动时用SSM阻止它加载IsDrv120.sys,那么IS还会加载动态驱动.(文件名不定.)今天测试了一下FuckJacks.exe关闭IceSword的机制,发现它根本就不是通过驱动来关闭IceSword的,即使IS加载的是正确的驱动文件IsDrv120.sys,它还是可以结束的。
其实FuckJacks.exe用的是一个很被人们看不起的方法来关闭IceSword的.那就是调用 ::SendMessage()这个API函数.这个函数PJF以前也提到过,而且也是目前唯一比较简单的关闭IS的方法.我们来看一下SendMessage()函数:
LRESULT WINAPI SendMessage(
HWND hWnd, // handle of destination window
UINT Msg, // message to send
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
显然,第二个参数Msg需要传递WM_CLOSE,最后两个参数传递0就行了。问题就出在这个接受消息的进程的HANDLE上。利用::OpenProcess()是获得不到正确的IceSword HANDLE的,而且在很长时间里,连得到IS的HANDLE都是一件很麻烦的事。况且IS的标题栏里显示的东西也不是固定的,通过::FindWindow()试图找到HANDLE也会泡汤。听说9月的《黑客防线》的《折断冰刃》一文中有如何得到IS的HANDLE。由于我没有看过这篇文章,于是猜想它是调用了 AdjustTokenPrivileges之类的函数提升自己进程的权限从而得到IS的HANDLE的。
如果得到了HANDLE,那么关闭IS也就容易了。
于是写了个小程序:
// 由于我技术太差,无法用程序得到IS的标题,只好在程序中直接输入IS的标题了。
//这样的方法只能用一次,重启IS后,标题栏又变了,当然不行了。
#include <stdio.h>
#include <windows.h>
void main()
{
char name[]="16B819"; ///这是我的IS的标题栏
//printf(" Name \n");
//scanf("%s",name);
HANDLE hProcess=::FindWindow(NULL,name);
if(hProcess!=NULL)
::PostMessage((HWND__ *)hProcess,WM_CLOSE,0,0);
// ::Sleep(10000);
// ::PostMessage((HWND__ *)hProcess,WM_CHAR,13,NULL); //如果这个函数能调用成功,那么IS就会被关掉,可惜我不会……
printf("OK\n");
getchar();
}
运行这个程序,IS的窗口上便会弹出“确定退出”的对话框。
如果这个时候才传递一个回车消息或者相当于点击“是”的WM_COMMAND消息,那么IS就会被结束。
注意:在测试FuckJacks.exe时,应该会发现,IS被结束时也是出现了“确定退出”的对话框的。===================
后记:
在PJF的BLOG里,有一位高手曾经这样评价这种关闭IS的方法:
那些木马有本事就来正面的,在IS中隐藏进程,或者直接结束IS进程(而不是玩些乱发消息的把戏)。
及PJF的话:
任何一软件,你针对他做,很弱智的方法就能让他不能正常工作。这种东西可以用没有任何技术含量的手法去做,
纯粹耍流氓而已。随便一个抹去特征的个人IS版本就可让大多数流氓没用了。
这种手法就好比写个软件把系统目录全删了,让windows不能启动,然后就宣称自己的软件比windows系统更牛,典型的哗众取宠。我的功夫太差,只好说到这里了。