编程查杀ttdianying流氓软件

来源:互联网 发布:linux memset 头文件 编辑:程序博客网 时间:2024/06/13 21:07

注:本文于07/1月于黑客防线发表版权归黑客防线所有,转载请注明出处

编程查杀ttdianying流氓软件

文/图  冷风[后方网络][东南网安]

 最近机房重了一种弹出网页式的流氓软件,毛病倒是不大,只是很讨人厌,每隔几分种就会弹出一次
 游戏也玩不安心。如图1示。
 用杀毒软件,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进程,那么跟据进程名判断是行不通了,不过可以在枚举进程时列出程序路径,
 跟据路径定位流氓软件,程序运行效果如图2示。
 以下代码在VC6.0+WIN2000 WINXP下通过。

 

 

#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:冷风袭人 ");
    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 | PROCESS_VM_READ,false,processid[i]);

            EnumProcessModules(hProcess, 
&hModule, sizeof(hModule), &needed);//枚举进程
            GetModuleFileNameEx(hProcess, hModule, path, sizeof(path));//得到进程路径

            
if(strstr(path,name))//是否包含流氓进程字符串
            {
                printf(
"发现流氓进程... ");
                TerminateProcessFromId(processid[i]);
//调用结束进程函数
                printf("正在删除文件... ");
                ::DeleteFile(path);
                printf(
"正清理注册表... ");
                HKEY key;
                LPCTSTR data
="SOFTWARE/Microsoft/Windows/CurrentVersion/Run";
                ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data,
0,KEY_WRITE,&key);
                ::RegDeleteValue(key,
"svchost");
                ::RegCloseKey(key);
                printf(
"软件清理成功... ");
                ret
=false;

            }
 

    }

    
    
if(ret)
    
{
        printf(
"没有发现流氓软件... ");
    }

    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(
"进程结束成功... ");
    
else
        printf(
"进程结束失败... ");

    
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) );

}

}
好了,如果以后碰到类似的问题,只要把上面的代码稍加修改,你也可以做出自己的专杀工具啦
代码参考了 如何在NT下获取进程的路径一文谢谢原作者
原创粉丝点击