危险漫步博客
新鲜的“黑客思维”就是从全新的角度看待黑客技术,从更高的层面去思考;专注于黑客精神及技术交流分享的独立博客。
文章2306 浏览20614306

隐蔽后门的制作

无论是我们通过入侵网站提权还是通过漏洞利用获得计算机的控制权之后,都要对该计算机植入后门,以便于我们以后的再次访问,之前我也在博客上发表过类似的文章,对此感兴趣的朋友去看看。按照类型的不同,这些后门主要分为两大类:主动连接式后门,被动连接式后门(反弹式连接)。按照功能的不同,主要分为远控木马类和远程shell类。远控木马相信大家一定很熟悉了,这里就不再去赘述,本文主要讲解下远程反弹式shell后门的编程制作。要想深入的了解本文的内容要求大家有一定的windows API编程功底。

一、软件功能分析

任何一个软件在开始开发之前都要对软件的功能进行分析,这里我们也来分析一下我们要制作的软件。首先,作为一个后门,要有自启动的功能,我们就采用注册表自启动:同时,为了安全起见,我们需要给我们的后门进行备份;由于是个shell,我们需要绑定cmd并进行网络通信;采用反弹式连接,我们的后门就需要每隔一定的时间的主动连接主控端。

二、主要的APl介绍

在正文开始之前,为了照顾大多数没有基础的朋友,我们先来了解一下本文中用到的主要API。

1、原型LPTSTR lstrcat(LPTSTR lpStringl,LPCTSTR lpString2)

函数功能:该函数将一个字符串附加在另一个字符串后面。

参数说明:

lpString1:一个以NULL为终止符字符串指针。这个缓冲区必须足够大能包含两个字符串。

lpString2:一个以NULL为终止符字符串指针,它将追加在由lpString1中指定。这个缓冲区必须足够大能包含两个字符串。

返回值:若函数运行成功,返回值指向缓冲区;若失败,则返回值为NULL。

2、原型BOOL CopyFile(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,BOOL bFaillfExists)

函数功能:复制文件。

参数说明:

lpExistingFileName String,源文件名

lpNewFileName String,目标文件名

bFailIfExists Long,如果设为TRUE(非零),那么一旦目标文件已经存在,则函数调用会失败。

否则目标文件被改写返回值:非零表示成功,零表示失败。

3、原型LONG RegOpenKeyEx

函数功能:打开一个制定的注册表键

参数说明:

HKEY hKey,//需要打开的主键的名称

LPCTSTR lpSubKey,//需要打开的子键的名称

DWORD ulOptions,//保留,设为0

REGSAM samDesired,//安全访问标记,也就是权限

PHKEY phkResult//得到的将要打开键的句柄

4、原型DWORD GetModuleFileName(HMODULE hModule. LPTSTR lpFilename, DWORD nSize)

参数说明:

hModule HMODULE装载一个程序实例的句柄。如果该参数为NULL,该函数返回该当前应用程序全路径。

lpFileName LPTSTR是你存放返回的名字的内存块的指针,是一个输出参数nSize DWORD,装载到缓冲区lpFileName的最大值。

返回值:如果返回为成功,将在lpFileName的缓冲区当中返回相应模块的路径,如果所为的nSize过小,那么返回仅按所设置缓冲区大小返回相应字符串内容。如果函数失败,返回值将为0。

5、原型RegSetValueEx(hKey Long,lpValueNameString,Reserved Long,dwType Long,lpData Any,cbData Long);

函数功能:设置注册表键值

参数说明:

hKey Long,一个已打开项的句柄,或指定一个标准项名

lpValueName String,要设置值的名字

Reserved Long,未用,设为零

dwType Long,要设置的数量类型

lpData Any,包含数据的缓冲区中的第一个字节

cbData Long,lpData缓冲区的长度*/

6、原型SOCKET WSAAPI WSASocket(intaf, int type, int protocol, LPPROTOCOL_INFO lpProtocollnfo, Group g,int iFlags)

参数功能:创建一个与指定传送服务提供者捆绑的套接口

参数说明:

af:地址族描述。目前仅支持AF_INET格式,亦即ARPA Internet地址格式。

type:新套接口的类型描述。

protocol:套接口使用的特定协议,如果调用者不愿指定协议则定为0。

lpProtocollnfo:一个指向PROTOCOL INFO结构的指针,该结构定义所创建套接口的特性。如果本参数非零,则前三个参数(af, type,protocol)被忽略。

g:套接口组的描述字。

iFlags:套接口属性描述。

三、开始编程

本文中用到的主要API就是这些了,编程平台为VC6.0,创建工程的细节就不介绍了,直接开始编码写代码。

第一步:包含头文件,本节代码中包含一下头文件以及库即可。

第二步:全局数据结构

第三步、主函数编写,这也是最主要的部分。这里Win32程序的入口点为

我们直接抄上即可。

下面开始正式的主题代码编写,我们希望在程序开始运行的时候就创建程序的副本,并将副本放到系统目录中。这就要求我们首先获取当前的系统路径,用到的函数是:

这里说明一下,GetWindowsDirectory与GetSystemWindowsDirectory有些不同,在实践中发现,如果用户安装的是双系统或者多系统,GetWindowsDirectory有时就会得到c:\document and settings\administrator\wmdows的路径,所以为了保险起见,建议大家采用GetSystemWindowsDirectory,至于这里是GetSystemWindowsDirectoryA是因为我采用的是ANSI编码。

假设我们将程序的副本考至windows/system32/test.exe,我们通过上面的API获得windows路径放在buffer中,下面我们就要把system32/test.exe拼接到buffer中形成完整的路径。代码如下:

程序将自己的副本拷贝至目标路径,除了获得目标路径外还需要知道自己的位置,这个过程用一下代码实现:

获取路径之后就是文件拷贝,代码:

文件拷贝完成后下面要做的就是实现从注册表的自启动,自启动路径为bufFer,代码如下:RegopenKeyEx(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",(DWORD)NULL,KEY ALL ACCESS,&MyKey);到这里,程序的基本操作就完成了,下面要做的是实现网络通信,以及通信与cmd的捆绑。

通过上面的基本数据填充以及初始化,剩下的就是反向链接的实现以及循环等待。

四、测试

到这里,我们就完成了一个远程反弹式shell后门的制作,编译完成后运行,我们看一下效果,采用本机测试,本地监听程序为VNC,监听端口为3364设置 。

运行我们编译好的程序,运行,出现提示。

同时在system32下,出现了我们的备份文件test.exe,启动项查看,修改注册表成功。为了保证该后门能够实现我们需要的cmd功能,我们进行一下简单的命令测试。

我们输入dir点击“发送上面的信息”,得到反馈信息,测试成功。

到此为止,我们的完全手工打造的反弹式后门就完成了,所有后门的原理都这个类似,大家可以在此基础上进行完善并优化,完整的代码以及注释已经打包,如果对有的API不了解,建议大家查看MSDN,或者到网上搜索。

相关推荐