网络安全 频道

浅析木马服务端的生成技术

现在需要考虑的问题是,如何将这个MsgBox.exe嵌入到客户端程序中?一个最好想,也是最直观的办法是利用一个BYTE数组来放置MsgBox.exe的二进制数据(CIH病毒就是这样,它专门准备了一个PE文件头),然后再使用API函数CreateFile将这段二进制数据写成文件。部分代码如下:

BYTE bySrvData[] = {

    0x4d, 0x5a, 0x90, 0x00, 0x03, 0x00, 0x00, 0x00,

    0x04, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,

    0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

    0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

    

// 由于篇幅略去以下所有数据-_-#...

};

BOOL CreateServer()

{

    HANDLE hFile;

    DWORD dwWritten;

    hFile = CreateFile( "C:\\MsgBox.exe", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL );

    

if

( hFile == NULL )

        

return

FALSE;

    WriteFile( hFile, (LPCVOID)bySrvData, 

sizeof

( bySrvData ), &dwWritten, NULL );

    CloseHandle( hFile );

    

return

TRUE;

}

好了,代码到此为止。虽然它可以胜利完成任务,但是你一定不愿意编写这样的代码——对于MsgBox.exe的数据部分,它实在太冗长了(我算了一笔账,对于编译完成的MsgBox.exe,它只有不到3KB的大小,但是如果把它的二进制数据像上面那样保存成文本文件,这个文本文件就会拥有15KB的体积)。况且,这仅仅是一个“Hello, World!”程序,那么换成真正的木马服务端程序又会怎么样呢?而且,很多的服务端是用高级语言编写的,它们动辄会拥有几十KB的体积!

现在我们只能别无选择地换一个角度考虑如何来解决这个问题:除了用BYTE数组,还有别的方法可以将MsgBox.exe放入客户端程序中吗?

答案是肯定的,那就是利用EXE文件的自定义资源。在解说如何使用自定义资源之前,我先大体介绍一下我要使用的几个API:

FindResource:查找一个资源。由于我们是要将这个服务端作为EXE的自定义资源形式放在EXE之中,所以在释放它之前必须首先找到它才可以。

SizeofResource:获得资源的尺寸,装载资源时使用。

LoadResource:装载资源,将资源的二进制数据装载到内存中。

LockResource:锁定资源,将内存中的资源数据锁定。

好了,你可以通过查阅MSDN来了解这几个函数的详细功能及参数,这里我就不赘述了。我的整个思路如下:

将MsgBox.exe作为客户端程序的二进制资源一同编译。

在生成MsgBox.exe服务端的时候,使用以上的几个API函数读取这一段二进制资源数据。

将这段二进制数据保存为文件。

现在我来实现第1步。首先你将MsgBox.exe改名为MsgBox.bin作为一个二进制文件,并将这个文件放入客户端源代码的文件夹下。然后,向客户端的资源脚本(.rc文件)中导入这个二进制资源,如下图所示:

    这时候,VC会弹出一个对话框提示,如下图:
0
相关文章