页面加载中...

编写自己的流氓软件专杀工具

日期:2008年5月7日 评论次数:2 Comments » 浏览次数:

最近机房中了一种弹出网页式的流氓软件ttdianying,毛病倒是不大,只是很讨人厌,每隔几分种就会弹出一次,游戏也玩不安心,
用杀毒软件、360安全卫士、超级兔子都查不出个所以然来,上Google搜索也是哀声一片,并无清除方法,于是只能自己动手解决了。

找出真凶

这类软件一般都是自启动的,我们就从注册表开始。打开注册表定位到HKEY_LOCAL_MACHINE\

SOFTWARE\Microsoft\Windows\CurrentVersion\Run,里面有一个名为svchost的项指向路径C:\WINNT\System32\drivers\svchost.exe。这有点古怪,首先系统不需要在这里启动svchost服务,再者svchost.exe也不应该出现在C:\WINNT\System32\

drivers目录里,而雅虎助手也频频提示svchost.exe试图更改IE启动页面。我们把svchost.exe复制出来好好研究一下看看。

分析程序

为了大体了解此恶意软件的动作,先用SSS跟踪一下,发现此程序只是更改注册表就运行了程序,并无线程注入、加载驱动等其它动作,因此清除起来也方便得多。我们可按如下思路清除,首先结束进程,然后删除文件,最后清理注册表,就可以清除此软件了。

因为机房有近百台机器,如果一台一台恢复,等我恢复完了怕我也得跟着一块挂掉了,所以就写了一个专杀工具。



编写程序

通常我们需要通过枚举系统进程来查找流氓软件。此流氓软件的进程名为svchost.exe,而系统中有很多svchost.exe进程,那么根据进程名判断就行不通了,不过我们可以在枚举进程时列出程序路径,根据路径定位流氓软件,程序运行效果如图所示。专杀工具的具体代码如下所示,在VC6.0+Wondows 2000/XP下测试通过。



#include <stdio.h>

#include <windows.h>

#include "PSAPI.H"

#pragma comment( lib, "PSAPI.LIB" )

int TerminateProcessFromId(DWORD dwId);

//结束进程函数

BOOL EnablePriv();

//提升进程权限

int main(void)

{

printf("流氓软件ttdianying专杀工具 by:冷风袭人\n\n");

DWORD processid[1024],needed,processcount,i;

HANDLE hProcess;

HMODULE hModule;

char path[256] = "";

char name[256] = "system32\\drivers\\svchost.exe";

//流氓进程字符串

BOOL ret=true;

       EnablePriv(); //提升进程权限

       EnumProcesses(processid, sizeof(processid), &needed);

       processcount=needed/sizeof(DWORD);

       for (i=0;i<processcount;i++)

       {

hProcess=OpenProcess(PROCESS_QUERY_INFORMATION&#124; PROCESS_VM_READ,false,processid);

EnumProcessModules(hProcess, &hModule, sizeof(hModule), &needed);

   //枚举进程

   GetModuleFileNameEx(hProcess, hModule, path, sizeof(path));

   //得到进程路径

   if(strstr(path,name))

   //是否包含流氓进程字符串

   {

         printf("发现流氓进程…\n\n");

         TerminateProcessFromId(processid);

                //调用结束进程函数

                printf("正在删除文件…\n\n");

                ::DeleteFile(path);

                printf("正清理注册表…\n\n");

                HKEY key;

LPCTSTR data="SOFTWARE\\Microsoft\\Windows\\

CurrentVersion\\Run";

::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data,0,KEY_WRITE,&key);

                ::RegDeleteValue(key,"svchost");

                ::RegCloseKey(key);

                printf("软件清理成功…\n\n");

                ret=false;

              }

       }

       if(ret)

       {

         printf("没有发现流氓软件…\n\n");

       }

       CloseHandle(hProcess);

       CloseHandle(hModule);

       return 0;

}

int TerminateProcessFromId(DWORD dwId)

//结束进程函数

{

       BOOL bRet=FALSE;

       HANDLE hProcess=::OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwId);

       if(hProcess!=NULL)

       {

              bRet=::TerminateProcess(hProcess,0);

       }

       ::CloseHandle(hProcess);

       if(bRet)

              printf("进程结束成功…\n\n");

       else

              printf("进程结束失败…\n\n");

       return 0;

}

BOOL EnablePriv()

//提升进程权限

{

HANDLE hToken;

if ( OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) )

{

       TOKEN_PRIVILEGES tkp;

       LookupPrivilegeValue( NULL,SE_DEBUG_NAME,&tkp.Privileges[0].Luid );    //修改进程权限

       tkp.PrivilegeCount=1;

       tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;

       AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );     //通知系统修改进程权限

       return( (GetLastError()==ERROR_SUCCESS) );

}

}

好了,以上就是我编写的专杀工具了,感觉如何?如果大家以后也碰到了类似的问题,只要把上面的代码稍加修改,你也可以做出自己的专杀工具啦!

2 Comments.

  1. 阿菜 说道:
    1楼

    ;-)

  2. 阿杰 说道:
    2楼

    您好,我试着复制你的代码编绎,VC6提示一处错误,请问该如何修改呢?请指教
    : fatal error C1083: Cannot open include file: &#8216;PSAPI.H&#8217;: No such file or directory
    执行 cl.exe 时出错.
    :|

Leave a Reply

回到顶部