Windows NT/2000系统下进程的隐藏 |
|
|
摘要 进程的隐藏一直是*程序设计者不断探求的重要技术,本文采用远程线程技术,通过动态链接库方法,较好地解决了这一问题,通过远程线程将*作为线程隐藏在其他进程中,从而达到隐藏的目的。 关键字进程 线程 * 动态链接库 *程序(也称后门程序)是能被控制的运行在远程主机上的程序,由于*程序是运行在远程主机上,所以进程的隐藏无疑是大家关心的焦点。 本文分析了windows nt/2000系统下进程隐藏的基本技术和方法,并着重讨论运用线程嫁接技术如何实现windows nt/2000系统中进程的隐藏。 1 基本原理 在win95/98中,只需要将进程注册为系统服务就能够从进程查看器中隐形,可是这一切在windows nt/2000中却完全不同, 无论*从端口、启动文件上如何巧妙地隐藏自己,始终都不能躲过windows nt/2000的任务管理器,windows nt/2000的任务管理器均能轻松显示出*进程,难道在windows nt/2000下*真的再也无法隐藏自己的进程了?我们知道,在windows系统下,可执行文件主要是exe和com文件,这两种文件在运行时都有一个共同点,会生成一个独立的进程,寻找特定进程是我们发现*的方法之一,随着入侵检测软件的不断发展,关联进程和socket已经成为流行的技术,假设一个*在运行时被检测软件同时查出端口和进程,我们基本上认为这个*的隐藏已经完全失败。在windows nt/2000下正常情况用户进程对于系统管理员来说都是可见的,要想做到*的进程隐藏,有两个办法,第一是让系统管理员看不见你的进程;第二是不使用进程。lOcALHOSt本文以第二种方法为例加以讨论,其基本原理是将自已的*以线程方式嫁接于远程进程之中,远程进程则是合法的用户程序,这样用户管理者看到的只是合法进程,而无法发现*线程的存在,从而达到隐藏的目的。 2 实现方法 为了弄清实现方法,我们必须首先了解windows系统的另一种可执行文件----dll,dll是dynamic link library(动态链接库)的缩写,dll文件是windows的基础,因为所有的api函数都是在dll中实现的。dll文件没有程序逻辑,是由多个功能函数构成,它并不能独立运行,一般都是由进程加载并调用的。因为dll文件不能独立运行,所以在进程列表中并不会出现dll,假设我们编写了一个*dll,并且通过别的进程来运行它,那么无论是入侵检测软件还是进程列表中,都只会出现那个进程而并不会出现*dll,如果那个进程是可信进程,(例如浏览器程序iexplore.exe,没人会怀疑它是*吧?)那么我们编写的dll作为那个进程的一部分,也将成为被信赖的一员,也就达到了隐藏的目的。 运行dll方法有多种,但其中最隐蔽的方法是采用动态嵌入技术,动态嵌入技术指的是将自己的代码嵌入正在运行的进程中的技术。理论上来说,在windows中的每个进程都有自己的私有内存空间,别的进程是不允许对这个私有空间进行操作的,但是实际上,我们仍然可以利用种种方法进入并操作进程的私有内存。动态嵌入技术有多种如:窗口hook、挂接api、远程线程等,这里介绍一下远程线程技术,它只要有基本的进线程和动态链接库的知识就可以很轻松地完成动态嵌入。 远程线程技术指的是通过在另一个进程中创建远程线程的方法进入那个进程的内存地址空间。我们知道,在进程中,可以通过createthread函数创建线程,被创建的新线程与主线程(就是进程启动时被同时自动建立的那个线程)共享地址空间以及其他的资源。但是很少有人知道,通过createremotethread也同样可以在另一个进程内创建新线程,被创建的远程线程同样可以共享远程进程(是远程进程)的地址空间,所以,实际上,我们通过一个远程线程,进入了远程进程的内存地址空间,也就拥有了那个远程进程相当的权限。 3 实施步骤 1) 用process32next()函数找到宿主进程,获取宿主进程id,并用 openprocess()函数打开宿主进程。 2) 用virtualallocex()函数分配远程进程地址空间中的内存。 3) 用writeprocessmemory()函数将待隐藏的dll的路径名。 4) 拷贝到步骤二已经分配的内存中。 5) 用getprocaddress()函数获取loadlibrarya()函数的实地址(在kernel32.dll中)。 6) 用createremotethread()函数在远程进程中创建一个线程。 7) 它调用正确的loadlibrarya()函数。 8) 为它传递步骤二中分配的内存地址。 4 具体实例 下面是在c++builder 4.0环境下编写的运用远程线程技术隐藏*的程序代码: #include <vcl.h> #include <windows.h> #include <stdio.h> #include <tlhelp32.h>//该头文件包涵了进程操作的api函数 #pragma hdrstop #include unit1.h #pragma package(smart_init) #pragma resource *.dfm insisting pszlibfilename;//存放待隐藏的dll文件名 handle hprocesssnap=null;//进程快照句柄 handle hremoteprocess;//远程进程句柄 lpvoid pszlibfileremote;//远程进程中分配给文件名的空间 hmodule phmd;//存放kernel32.dll句柄 handle hremotethread1=null;//存放远程线程句柄 tform1 *form1; //--------------------------------------------------------- __fast call tform1::tf [1] [2] [3] 下一页
|
|
上一个论文: DOS界面下通用图形编辑软件的设计 下一个论文: 西方网络银行的发展战略及启示
|
|
|
看了《Windows NT/2000系统下进程的隐藏》的网友还看了:
[免费范文]LabWindows/CVI的应用特点 [免费范文]基于RRAS与虚拟专用网技术在Windows中的实现 [今日更新]巧用PowerPoint制作高中化学多媒体课件 [今日更新]植树节英语作文:Planting Trees(植树) [今日更新]植树节英语作文:Planting Trees 植树 [今日更新]基于WinCE的嵌入式网络通信系统设计 [今日更新]基于McWill通信技术的油气智能测控系统 [今日更新]Windows8是微软的翻身之战 [今日更新]Windows8 LOGO发布,经典Windows LOGO回顾 [今日更新]见招拆招 Win8使用无难题
|
|