病毒木马查杀第004篇:熊猫烧香之专杀工具的编写

一、前言

如果是非感染型的病毒,完成行为分析之后,就可以开始编写专杀工具了。当然对于我们这次研究的对象——“熊猫烧香”来说,其实通过之前的行为分析,我们并没有得出它的所有恶意行为,毕竟还没有对其进行逆向分析。所以这里仅针对我们上一篇文章所得出的结果,来进行专杀工具的编写。一般来说,专杀工具既可以用批处理实现,又可以用编程语言编写,但是现实中更多的还是用后者进行制作的,因为其更加严谨、灵活。因此我这里会使用C++来写一个简单的“熊猫烧香”专杀程序。

二、病毒行为回顾与归纳

这里我们首先回顾一下病毒的行为:

病毒行为1:病毒本身创建了名为“spoclsv.exe”的进程,该进程文件的路径为“C:\WINDOWS\system32\drivers\spoclsv.exe”。

病毒行为2:在命令行模式下使用net share命令来取消系统中的共享。

病毒行为3:删除安全类软件在注册表中的启动项。

病毒行为4:在注册表“HKCU\Software\Microsoft\Windows\CurrentVersion\Run”中创建“svcshare”,用于在开机时启动位于“C:\WINDOWS\system32\drivers\spoclsv.exe”的病毒程序。

病毒行为5:修改注册表,使得隐藏文件无法通过普通的设置进行显示,该位置为:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\SHOWALL,病毒将CheckedValue的键值设置为了0。

病毒行为6:将自身拷贝到根目录,并命名为“setup.exe”,同时创建“autorun.inf”用于病毒的启动,这两个文件的属性都是“隐藏”。

病毒行为7:在一些目录中创建名为“Desktop_.ini”的隐藏文件。

病毒行为8:向外发包,连接局域网中其他机器。

纵观以上八点行为,这里需要说明的是,其中的第二点行为,由于我不知道用户计算机在中毒前的设置,因此这条我打算忽略。第三点行为,我不知道用户的计算机安装了哪些杀毒软件,而病毒又会将所有杀软的注册表启动项删除,所以这一条我打算忽略,用户在使用本专杀工具后,可以自行重新安装杀软,或者有经验的用户也可以自行在注册表中添加回杀软名称。另外,病毒的第八点行为,我也打算忽略,因为只要删除了病毒本体,那么自然就解决了这个问题,所以我的专杀工具主要应付剩下的五个问题。在这里各位读者想必也能够发现,我的专杀工具所要做的工作,与我之前写的手动查杀的过程其实是极为相似的,这也是为什么我当时就强调,我们依旧要掌握手动查杀病毒这个技能的原因。

三、专杀工具界面的制作

如果使用批处理来杀毒,因为它运行时没有界面,因此我们往往不知道杀毒程序究竟干了些什么,也不知道究竟有没有查杀成功,这也凸显了使用高级语言开发专杀工具的优势。这里我使用MFC进行“熊猫烧香”病毒专杀工具的开发,绘制界面如下图所示:

图1 界面绘制

其中的“Edit Box”控件的属性调整如下:

图2 调整“Edit Box”控件的属性

界面非常简单,接下来就是代码的编写。

四、计算病毒程序的散列值

在查杀病毒的技术中有一种方法类似于特征码查杀法,这种方法并不从病毒内提取特征码,而是计算病毒的散列值。利用这个散列值,就可以在查杀的过程中计算每个文件的散列,然后进行比较。这种方法简单易于实现,一般在病毒刚被发现时,在逆向分析前使用。常见的计算散列的算法有MD5、Sha-1以及CRC32等。

这里使用CRC32算法计算散列值,代码如下:DWORD CRC32(BYTE* ptr,DWORD Size){DWORD crcTable[256],crcTmp1;//动态生成CRC-32表for (int i=0; i<256; i++){crcTmp1 = i;for (int j=8; j>0; j–){if (crcTmp1&1) crcTmp1 = (crcTmp1 >> 1) ^ 0xEDB88320L;else crcTmp1 >>= 1;}crcTable[i] = crcTmp1;}//计算CRC32值DWORD crcTmp2= 0xFFFFFFFF;while(Size–){crcTmp2 = ((crcTmp2>>8) & 0x00FFFFFF) ^ crcTable[ (crcTmp2^(*ptr)) & 0xFF ];ptr++;}return (crcTmp2^0xFFFFFFFF);}

该函数的参数有两个,一个是指向缓冲区的指针,第二个是缓冲区的长度。它将文件全部读入缓冲区中,然后用CRC32函数计算文件的CRC32散列值,可以得到我所研究的“熊猫烧香”病毒的散列值为0x89240FCD。这里请大家注意,不同版本的病毒的散列值是不同的,我所得出的这个值仅针对我所讨论的这个版本的病毒。

五、查找进程与提升权限 我们需要在内存中查找病毒是否存在,代码如下:BOOL FindTargetProcess(char *pszProcessName,DWORD *dwPid){BOOL bFind = FALSE;HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);if (hProcessSnap == INVALID_HANDLE_VALUE){return bFind;}PROCESSENTRY32 pe = { 0 };pe.dwSize = sizeof(pe);BOOL bRet = Process32First(hProcessSnap,&pe);while (bRet){if (lstrcmp(pe.szExeFile,pszProcessName) == 0){*dwPid = pe.th32ProcessID;bFind = TRUE;break;}bRet = Process32Next(hProcessSnap,&pe);}CloseHandle(hProcessSnap);return bFind;} 这里还需要提升系统的权限,提升成功后,,当前进程就可以访问一些受限的系统资源。代码如下:BOOL EnableDebugPrivilege(char *pszPrivilege){HANDLE hToken = INVALID_HANDLE_VALUE;LUID luid;TOKEN_PRIVILEGES tp;BOOL bRet = OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken);if (bRet == FALSE){return bRet;}bRet = LookupPrivilegeValue(NULL,pszPrivilege,&luid);if (bRet == FALSE){return bRet;}tp.PrivilegeCount = 1;tp.Privileges[0].Luid = luid;tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;bRet = AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL);return bRet;}躲在墙角、掩藏那孤独而又不奢怜悯的伤…

病毒木马查杀第004篇:熊猫烧香之专杀工具的编写

相关文章:

你感兴趣的文章:

标签云: