当前位置:编程学习 > 网站相关 >>

欲穷千里目 更上一层楼——由MNK病毒看Dll注入技术

文/图 黄强
        引言

前些阵子,自己在双击打开U盘时看到一个火炬图标,伴随着杀毒软件刺耳的报警声,我感觉十有易做图是中病毒了。没有急着删除,我仔细检查了U盘里的所有文件,发现多出了3个属性为“系统、隐藏”的家伙,分别是:

图 1
起先,我还怀疑这是误报,在别的杀毒软件下一试,同样也把它们当作病毒对待。不过,看到病毒的图标挺有特点,而且文件也不大,我突然萌生了一个分析病毒的想法,一来了解一下病毒究竟搞了些什么破坏,二也温习温习好久没练的反汇编调试技术。
动机有了,还得知道对手叫什么名字。Rising 2007将这个病毒定名为“Trojan.Mnless.ec”;KIS 6.0则将其定义为木马程序,名日“Trojan.Win32.Agent.agp”。看来这个病毒的名字还真是蹊跷冗长。算了,为了分析方便,我们称其为MNK病毒好了。^_^



        磨刀不误砍柴功

整个病毒由三个文件组成,MNK.exe、MNKdll.dll和autorun.inf。从文件名来猜测, autorun.inf会在双击U盘时自动运行病毒程序, 但MNK.exe和MNKdll.dll的具体功能仍无法得知。
为了分析方便,首先打开cmd窗口,用ATTRIB -S -H去掉MNK.exe和MNKdll.dll的系统、隐藏属性。考虑到MNK.exe是可执行文件,MNKdll.dll是动态连接库,二者的文件结构都符合Windows PE格式。可以用PeDecoder V1.1来对它们做一个PE扫描。

节选了MNK.exe的关键PE信息

        文件创建时间 : Nov 26 2006,Sun,16:11:35
        导出表(Export Table)信息 : 无
        导入表(Import Table)信息 :
  
图 2

节选了MNKDll.dll的关键PE信息

        文件创建时间 : Nov 25 2006,Sat,09:50:27    
        导出表(Export Table)信息
  
图 3

        导入表(Import Table)信息
  
图 4


从上面的扫描结果,可以看到这两个文件差不多都在同一时间创建,从各自的导入表也可以找到所调用外部函数的准确资料。二者都有文件读写操作,但MNK.exe还涉及进程访问,MNKDll.dll则有一些和注册表相关的函数调用。再看导出表,MNK.exe没有导出函数,但MNKDll.dll则提供HookProc,InstallHook,UnstalHook三个函数供外部调用。这几个函数顾名思义,功能十有易做图是在操作系统上安装钩子(InstallHook)与解除钩子(UnstalHook),那执行的钩子过程自然就是HookProc。
现在看来,MNK.exe就是病毒的主程序,MNKDll.dll则为主程序提供了辅助的函数。



        庖丁解牛

首先将MNK.exe在OllyDbg下加载。虽然这个文件只有4KB大小,但反汇编之后却有了近两千行代码,限于篇幅,这里只按照执行流程给出关键部分地分析和评论。

从程序入口点开始调试,病毒首先作了一些准备工作,用GetProcAddress从kernel32.dll中读出了LoadLibraryA,GetModuleHandleA和GetProcAddress,三个函数的地址。
接着,病毒开始了第一步行动,用GetComputerNameExA获得本地计算机名,并和字符串“netpla”进行比较。如果两者相同,再调用MessageBoxA显示一对话框,提示信息为“主人您好!您的系统目前状况良好!”,随即退出程序。由此看来,只需将计算机名设置为“netpla”就可以防止被MNK病毒感染,或许这就是病毒制造者的计算机名吧。

但如果本地计算机名和“netpla”不相同,病毒就会将其更改。

PUSH 403001                   ->:存放新计算机名的缓冲区首地址    
PUSH 2                                
CALL 004017AE                //JMPDOWN    >>>: KERNEL32.DLL: SetComputerNameExA
PUSH 403001                            
PUSH 5                                
CALL 004017AE                //JMPDOWN    >>>: KERNEL32.DLL: SetComputerNameExA

这里有两次SetComputerNameExA的调用。第1次是给本地的计算机设置一个“ComputerNameDnsDomain”类型的名字,也即DNS域分配的计算机名。新名字会以 “pla+原计算机名”的形式出现,若原来是“MyPC”,病毒会将其改为“plaMyPC”。第2次调用SetComputerNameExA给计算机设置的名字类型是“ComputerNamePhysicalDnsHostname”,是该计算机的DNS主机名。关于计算机名类型的详细说明可以在MSDN中关于COMPUTER_NAME_FORMAT的记录下找到。

改完计算机名,病毒开始入侵系统。为了有效的破获系统而又尽量不被发现,病毒需要为自己找一个安全的隐蔽场所。MNK病毒用GetModuleFileNameA得到运行的病毒文件名,即MNK.exe。然后用explorer进程打开病毒文件所在的目录,将病毒文件复制到由GetSystemDirectoryA得到系统目录下,并设置文件属性。

PUSH 1                                  
PUSH 403118                   //          存放目的文件名称的缓冲区地址。系统目录+“MNK.exe”
PUSH 403158                   //          存放源文件名称的缓冲区地址。当前目录+“MNK.exe”
CALL 0040176C                 //                JMPDOWN    >>>: KERNEL32.DLL: CopyFileA
PUSH 6                        //                 文件属性,  “系统 | 隐藏”
PUSH 403118                   //                 已存在的文件名称,MNK.exe
CALL 004017B4                //        JMPDOWN    >>>: KERNEL32.DLL: SetFileAttributesA
… … …
PUSH 403118                  //        存放目的文件名称的缓冲区地址。系统目录+“MNKdll.dll”          
PUSH 4020CD                 //          存放源文件名称的缓冲区地址。当前目录+“MNKdll.dll”
CALL 0040176C      
补充:综合编程 , 安全编程 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,