反病毒攻防研究第009篇:DLL注入(上)——DLL文件的编写

一、前言

我之前所编写的用于模拟计算机病毒的对话框程序都是exe文件,所以运行时必将会产生一个进程,产生进程就非常容易被发现。而为了不被发现,可以选择将对话框程序创建为DLL文件。这种文件会加载到已有进程的地址空间中,这样就不会再次创建出进程,隐蔽性相对较好,DLL注入也是恶意程序总会使用的手段。这次我带算用几篇文章的篇幅来论述DLL注入的问题,而这篇文章就首先来讨论一下如何把我之前的对话框程序改写为DLL文件。

二、编写对话框DLL程序

这里我依旧使用VC++6.0,创建一个简单的Win32 Dynamic Link Library项目,之后系统就会自动为我们生成如下代码:

// HackedDll.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"

BOOL APIENTRY DllMain( HANDLE hModule,              //模块句柄
                       DWORD  ul_reason_for_call,   //DllMain函数被调用的原因
                       LPVOID lpReserved            //Windows保留参数
                     )
{
        return TRUE;
}

这里的DllMain函数中的第二个参数表明该DLL被调用的原因。为了针对不同的情况进行处理(比如当进程加载DLL时,进行资源申请的操作,而在卸载该DLL时,进行资源的释放操作),可以按照以下模板所示编写程序:

BOOL APIENTRY DllMain( HANDLE hModule,            //模块句柄
                       DWORD  ul_reason_for_call, //DllMain函数被调用的原因
                       LPVOID lpReserved          //Windows保留参数
                     )
{
        switch( ul_reason_for_call )
        {
                case DLL_PROCESS_ATTACH:  //当DLL被某进程加载时DllMain被调用
                {
                        break;
                }
                case DLL_PROCESS_DETACH:  //当DLL被某进程卸载时DllMain被调用
                {
                        break;
                }
                case DLL_THREAD_ATTACH:   //进程中有线程被创建时DllMain被调用
                {
                        break;
                }
                case DLL_THREAD_DETACH:   //进程中有线程结束时DllMain被调用
                {
                        break;
                }
        }
        return TRUE;
}

根据这个模板,结合我们的目的,创建一个MsgBox函数用于对话框的显示:

void MsgBox()
{
        MessageBox(0,"You have been hacked! (by J.Y.)","Warning",0);
        return;
}

然后在主函数的DLL_PROCESS_ATTACH下添加:

case DLL_PROCESS_ATTACH:  //当DLL被某进程加载时DllMain被调用
{
        MsgBox();
        break;
}

最后在DllMain上方添加一个导出函数:

extern "C" _declspec(dllexport) void MsgBox();

编译以上的代码,能够生成两个重要的文件,一个是HackedDll.dll,另一个是HackedDll.lib。前者是DLL文件,后者是库文件,库文件中包含着导出函数的相关信息。

三、DLL的调用

对于一个DLL文件,可以选择使用静态调用和动态调用。个人觉得动态调用更加有用,所以这里只讨论动态调用的方法。动态调用的程序如下:

#include <windows.h>

int main()
{
        HINSTANCE hInst;
        //动态加载DLL
        hInst = LoadLibrary("HackedDll.dll");
        if (hInst == NULL)
        {
                MessageBox(0, "HackedDll.dll文件不存在", "DLL加载失败", 0);
                return 0;
        }
        typedef void (*PFUNMSG)();
        //获取DLL的导出函数
        PFUNMSG pFunMsg = (PFUNMSG)GetProcAddress(hInst, "MsgBox");
        if (pFunMsg == NULL)
        {
                MessageBox(0,"获取函数地址失败", "DLL加载失败", 0);
                return 0;
        }
//      pFunMsg();
        return 0;
}

编译生成可执行文件,然后将之前编写好的HackedDll.dll文件与该exe文件放在同一目录下,执行,就可以调用DLL文件中的对话框函数了:

图1 调用DLL

这里需要说明的是,上述程序中“return0”上面的“pFunMsg()”被我注释起来了,原因是由于我在DLL中的设置是只要DLL被加载,那么MsgBox()函数就会自动被执行,如果“pFunMsg()”不被注释,程序运行中就会执行两次MsgBox()函数。如果我在DLL文件中没有设定加载时启动,那么就应该去掉上述程序中的注释。

四、用PEiD查看DLL文件

在逆向工程中,PEiD这款软件经常会被使用到,因为运用它可以查看PE文件的结构。而DLL文件也属于PE文件。这里我把HackedDll.dll文件拖拽到PEiD的界面上,它就会自动解析出该DLL文件的PE结构,如图所示:

图2 用PEiD查看DLL文件结构

在这里可以看到该文件是由VC6开发的,属于DLL文件。单击“Subsystem”右边的“>”按钮,打开“PE Details”界面,在“Directory Information”中单击“ExportTable” 右边的“>”按钮,就可以打开“Exports Viewer”。由于我所编写的DLL文件中只有一个导出函数MsgBox(),那么该导出表中就只有一个导出项。如下图所示:

图3 查看导出项

当以后编写比较复杂的DLL文件时,用PEiD这款软件就能够很清晰地看出整个程序的内部元素。在整个《反病毒攻防研究》系列中,会多次使用到这个程序。而在以后的《安全类软件编写》系列中,也会尝试编写一个类似的程序。

五、DLL注入的查杀方法

由于DLL是要依托于其它进程才能够“存活”的,所以是不能够用正常手段(比如在cmd下)进行查杀的。所以这里我打算采用Icesword(冰刃)这款软件。

首先运行TestMain.exe程序用于加载HackedDll.dll,此时弹出对话框(如图1所示),然后打开冰刃,选择“进程”,就能够列出目前系统中的所有进程项。找到TestMain.exe,在它上面单击右键,在弹出的菜单中选择“模块信息”,就能够查看与该进程相关的所有模块,如图所示:

图4 利用冰刃查看模块信息

这里可以在选中“HackedDll.dll”后,选择“卸载”或者“强制卸载”,那么这个DLL文件就会从“模块信息”中消失。此时之前弹出的对话框并没有变化,但是当单击对话框中的“确定”按钮后,就会弹出“DLL加载失败”对话框:

图5 DLL成功卸载

这正是我之前的程序中用于错误处理的程序,这也就说明了,该DLL文件的确已经成功卸载。之后就可以依据图4中显示出的该DLL的路径,删掉该DLL文件就可以了。

六、小结

这次编写了一个DLL版的模拟病毒程序,在以后的研究中会多次用到。可见DLL程序并不难编写,重要的还是一套流程,按照“模板”编写就可以了。可以说,随着DLL研究的开展,我们的技术研究也渐渐步入了中级阶段。

时间: 2024-10-13 23:00:15

反病毒攻防研究第009篇:DLL注入(上)——DLL文件的编写的相关文章

反病毒攻防研究第012篇:利用Inline HOOK实现主动防御

一.前言 之前文章中所讨论的恶意程序的应对方法,都是十分被动的,即只有当恶意程序被执行后,才考虑补救措施.这样,我们就会一直处于后手状态,而如果说病毒的危害性极大,那么即便我们完美地修复了诸如注册表项,服务项等敏感位置,并且删除了病毒本身,但是它依旧可能已经破坏了系统中非常重要的文件,造成了不可逆的损伤.因此这篇文章就来简单讨论一下利用Inline HOOK技术实现主动防御,在病毒执行前,就主动将危险函数劫持,如同一道防火墙,保护我们计算机的安全. 二.Inline HOOK原理 我们平时所使用

反病毒攻防研究第015篇:病毒感染标志的添加

一.前言 对于感染型病毒而言,如果对同一个目标文件多次进行感染,有可能导致目标文件损坏,使得无法执行.所以病毒程序往往会在第一次感染时对目标文件写进一个感染标志,这样在第二次遇到该文件时,首先判断一下该文件中是否包含有感染标志,如果有,则不再感染,如果没有感染标志则进行感染(关于文件的感染,可参见<反病毒攻防研究第004篇:利用缝隙实现代码的植入>和<反病毒攻防研究第005篇:添加节区实现代码的植入>).所谓的感染标志其实就是在PE文件中无关紧要的位置写入的一个字符串,所以感染标志

反病毒攻防研究第010篇:DLL注入(中)——DLL注入与卸载器的编写

一.前言 我在上一篇文章中所讨论的DLL利用方法,对于DLL文件本身来说是十分被动的,它需要等待程序的调用才可以发挥作用.而这次我打算主动出击,编写DLL注入与卸载器,这样就可以主动地对进程进行注入的操作了,从而更好地模拟现实中恶意代码的行为. 二.DLL注入的原理 如果想让DLL文件强制注入某个进程,那么就需要通过创建远程线程来实现.这里需要注意的是,所谓的"远程线程",并不是跨计算机的,而是跨进程的.举例来说,进程A在进程B中创建一个线程,这就叫做远程线程.从根本上说,DLL注入技

反病毒攻防研究第011篇:DLL注入(下)——无DLL的注入

一.前言 一般来说,想要将自己编写的程序注入到其它进程中,是必须要使用DLL文件的,这种方法已经在上一篇文章中讨论过了.但是事实上,可以不依赖于DLL文件来实现注入的.只不过这种方法不具有通用性,没有DLL注入那样灵活,因为它需要把代码写入"注入程序"中,一旦想要注入的内容发生了变化,就需要重写整个"注入程序".而不像DLL注入那样,只要修改DLL程序即可.即便如此,无DLL进行注入的方式,也是一种值得讨论的方法. 二.无DLL注入的基本原理 在注入与卸载方面,无论

反病毒攻防研究第004篇:利用缝隙实现代码的植入

一.前言 现在很多网站都提供各式各样软件的下载,这就为黑客提供了植入病毒木马的良机.黑客可以将自己的恶意程序植入到正常的程序中,之后发布到网站上,这样当用户下载并运行了植入病毒的程序后,计算机就会中毒,而且病毒可能会接着感染计算机中的其他程序,甚至通过网络或者U盘,使得传播面积不断扩大.而本篇文章就来剖析病毒感染的实现原理,首先需要搜索正常程序中的缝隙用于"病毒"(用对话框模拟)的植入,之后感染目标程序以实现"病毒"的启动.当然,讨论完这些,我依旧会分析如何应对这种

反病毒攻防研究第007篇:简单木马分析与防范part1

一.前言 病毒与木马技术发展到今天,由于二者总是相辅相成,你中有我,我中有你,所以它们之间的界限往往已经不再那么明显,相互之间往往都会采用对方的一些技术以达到自己的目的,所以现在很多时候也就将二者直接统称为"恶意代码".这次我打算用两篇文章的篇幅来讨论病毒与简单的木马相互结合的分析与防范方法.本篇也就是第一篇,讨论的是利用只有服务器端的木马程序实现"病毒"的启动.而在下一篇中,我会讨论既有服务器端又有客户端的木马程序与"病毒"相结合的分析与防范.

反病毒攻防研究第008篇:简单木马分析与防范part2

一.前言 一般来说,木马是既有客户端也有服务器端的.上次讨论的不过是一种特殊情况,毕竟不是人人都懂得DOS命令,因此现在木马的客户端也都是做成非常直观的界面形式,方便操作.本篇文章会从客户端与服务器端两个方面进行讨论,与上次的讨论不同的是,这次我会直接把用来模拟病毒的对话框程序放入服务器端,这样只要成功连接,那么就可以通过由客户端所发出的命令来让服务器端直接执行对话框程序.用这种思想,可以给服务器端增加很多功能,但是在这里仅仅讨论对话框的打开. 二.服务器端的实现 这里所讨论的木马依旧是命令行下

反病毒攻防研究第005篇:添加节区实现代码的植入

一.前言 上一篇文章所讨论的利用缝隙实现代码的植入有一个很大的问题,就是我们想要植入的代码的长度不能够比缝隙大,否则需要把自身的代码截成几个部分,再分别插入不同的缝隙中.而这次所讨论的方法是增加一个节区,这个节区完全可以达到私人订制的效果,其大小完全由我们自己来决定,这样的话,即便是代码较长,也不用担心.而这种方式最大的缺陷就是不利于恶意代码自身的隐藏,因此在现实中可能并不常用.其实,我在这里讨论节区的添加,是为了以后更加深入的讨论打下基础,因为在加壳以及免杀技术中,经常会对PE文件添加节区.这

网络攻防研究第001篇:尝试暴力破解某高校研究生管理系统学生密码

前言 如果你是在校大学生,而且还对网络攻防比较感兴趣的话,相信你最开始尝试渗透的莫过于所在院校的学生管理系统.因为一般来说这样的系统往往比较薄弱,拿来练手那是再合适不过的了.作为本系列的第一篇文章,我将会利用暴力破解的方式,尝试对某高校的研究生管理系统的学生密码进行破解.由于这个管理系统的网站属于该高校的内网资源,外网是无法访问的,因此大家就不要尝试按照文中的内容来对文中出现的网址进行访问了.利用本文所论述的暴力破解思想,可以帮助大家更好地认识我们的网络,也有助于了解目标网站是否安全.那么在这里