注:本文于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"
#pragmacomment(lib,"PSAPI.LIB")
intTerminateProcessFromId(DWORDdwId);//结束进程函数
BOOLEnablePriv();//提升进程权限

intmain(void)
...{
printf("流氓软件ttdianying专杀工具by:冷风袭人 ");
DWORDprocessid[1024],needed,processcount,i;
HANDLEhProcess;
HMODULEhModule;
charpath[256]="";
charname[256]="system32/drivers/svchost.exe";//流氓进程字符串
BOOLret=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("正清理注册表... ");
HKEYkey;
LPCTSTRdata="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);
return0;
}

intTerminateProcessFromId(DWORDdwId)//结束进程函数
...{
BOOLbRet=FALSE;
HANDLEhProcess=::OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwId);
if(hProcess!=NULL)
...{
bRet=::TerminateProcess(hProcess,0);
}
::CloseHandle(hProcess);
if(bRet)
printf("进程结束成功... ");
else
printf("进程结束失败... ");
return0;
}

BOOLEnablePriv()//提升进程权限
...{
HANDLEhToken;
if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken))
...{
TOKEN_PRIVILEGEStkp;
LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tkp.Privileges[0].Luid);//修改进程权限
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&tkp,sizeoftkp,NULL,NULL);//通知系统修改进程权限
return((GetLastError()==ERROR_SUCCESS));
}
}
代码参考了 如何在NT下获取进程的路径一文谢谢原作者
本文介绍了一种名为ttdianying的流氓软件的查杀方法。该软件会在计算机上每隔几分钟弹出一次网页广告,影响用户体验。文章详细记录了从发现恶意软件到编写专用查杀工具的全过程。
1796

被折叠的 条评论
为什么被折叠?



