NT环境下进程隐藏的实现

在NT环境下隐藏进程,也就是说在用户不知情的条件下,执行自己的代码的 方法有很多种,比如说使用注册表插入DLL,使用Windows挂钩等等。其中比较有 代表性的是Jeffrey Richer在《Windows核心编程》中介绍的LoadLibrary方法和 罗云彬在《windows环境下32位汇编语言程序设计》中介绍的方法。两种方法的 共同特点是:都采用远程线程,让自己的代码作为宿主进程的线程在宿主进程的 地址空间中执行,从而达到隐藏的目的。相比较而言,Richer的方法由于可以使 用c/c++等高级语言完成,理解和实现都比较容易,但他让宿主进程使用 LoadLibrary来装入新的DLL,所以难免留下蛛丝马迹,隐藏效果并不十分完美。 罗云彬的方法在隐藏效果上绝对一流,不过,由于他使用的是汇编语言,实现起 来比较难(起码我写不了汇编程序:))。笔者下面介绍的方法可以说是对上述两 种方法的综合:采用c/c++编码,实现完全隐藏。并且,笔者的方法极大的简化 了远程线程代码的编写,使其编写难度与普通程序基本一致。

基础知识

让自己的代码作为宿主进程的线程,在宿主进程的地址空间中执行确实是个 不错的主意。但是要自己把程序放到其他进程的地址空间中去运行,将面临一个 严峻的问题:如何实现代码重定位。关于重定位问题,请看下面的程序:


int func()//函数func的定义

int a = func();//对func的调用

这段程序经过编译链接后,可能会变成下面的样子:

0x00401800: push ebp//这是函数func的入口
0x00401801: mov ebp, esp

0x00402000: call 00401800//对函数func的调用
0x00402005: mov dword ptr [ebp-08], eax

请注意“0x00402000”处的直接寻址指令“call 00401800”。上面的程序在正常执行(由windows装入并执行)时,因为PE 文件的文件头中含有足够的信息,所以系统能够将代码装入到合适的位置从而保 证地址“00401800”处就是函数func的入口。但是当我们自己把程序 装入到其他进程的地址空间中时,我们无法保证这一点,最终的结果可能会象下 面这样:


0x00801800: push ebp//这是函数func的入口
0x00801801: mov ebp, esp

0x00802000: call 00401800//00401800处是什么
0x00802005: mov dword ptr [ebp-08], eax

显然,运行上面的代码将产生不可预料的结果(最大的可能就是执行我们费 尽千辛万苦才装入的代码的线程连同宿主进程一起被系统杀死)。 不知大家注 意过系统中动态链接库(dll)的装入没有:一个dll被装入不同进程时,装入的 地址可能不同,所以系统在这种情况下也必须解决dll中直接寻址指令的重定位 问题。原来,绝大多数dll中都包含一些由编译器插入的用于重定位的数据,这 些数据就构成了重定位表。系统根据重定位表中的数据,修改dll的代码,完成 重定位操作。Richer使用的LoadLibrary也是借用了这一点。所以我们的重定位 方法就是:替系统来完成工作,自己根据重定位表中的数据进行重定位。既然如 此,那就让我们来了解一下重定位表吧。

先来分析一下重定位表中需要保存哪些信息。还以上面的代码为例,要让它 能正确执行,就必须把指令“call 00401800”改为“call 00801800”。进行这一改动需要两个数据,第一是改哪,也就是哪个内存 地址中的数据需要修改,这里是“0x00802001”(不是 “0x00802000”);第二是怎么改,也就是应该给该位置的数据加上 多少,这里是“0x00400000”。这第二个数据可以从dll的实际装入 地址和建议装入地址计算而来,只要让前者减后者就行了。其中实际装入地址装 入的时候就会知道,而建议装入地址记录在文件头的ImageBase字段中。所以, 综上所述,重定位表中需要保存的信息是:有待修正的数据的地址。

位置 数据 描述
0000h 00001000h 页起始地址(RVA)
0004h 00000010h 重定位块长度
0008h  3006h 第一个重定位项,32位都须修正
000ah 300dh 第二个重定位项,32位都须修正
000ch 3015h  第三个重定位项,32位都须修正
000eh 0000h 第四个重定位项,用于对齐
0010h 00003000h 页起始地址(RVA)
0014h 0000000ch 重定位块长度
0018h 3008h 第一个重定位项,32位都须修正
001ah 302ah 第二个重定位项,32位都须修正
其他重定位块
0100h 0000h 重定位表结束标志
时间: 2024-08-04 08:45:17

NT环境下进程隐藏的实现的相关文章

Linux环境下进程中断的原因

问题描述 Linux环境下进程中断的原因 linux环境下,哪些原因可能造成某进程中断?或者说,代码中哪些不合理的地方可能会引起进程的中断? 解决方案 内存溢出等,程序无法处理的异常都会造成程序进程中断 解决方案二: 中断是一种是一种机制: 看下面的一段汇编代码: .section .data string:.ascii "hello" .section .text .globl _start _start: movl $4,%eax#sys_call_num movl $2,%ebx

Win2000下进程隐藏的一种方案

十分抱歉,匆匆写了几句代码有点bug,即"ZwOpenSection(&g_hMPM,SECTION_MAP_WRITE|SECTION_MAP_WRITE,&attributes)"使得第一次运行返回失败,请删除原文,改正为: pjf (jfpan20000@sina.com) 上次在CVC提到了这东西,因为很简单觉得没必要多说什么,但有人要求写全,所以补充几句: 很多帖子对此论题作了分析,比如APIHOOK.系统服务HOOK等等,至于远线程注入没有自己的进程,本不算

使用Resin在NT环境下配置JSP环境

js 首先你需要在WIN2000上安装IIS服务器,然后进行下面的步骤: 一.下载必要的软件. 一个是jdk,现在的最新版本是1.4,可以到java的官方站点下载: http://java.sun.com/j2se/1.4/download.html 选择Windows(alllanguages,includingEnglish)这个,大约35M 第二个是支持JSP的服务器.我选择的是Resin,因为它的效率很高,而且对xml和中文的支持很好.最新版本是Resin-2.1.4,可以到他的官方站点

Linux环境下的高级隐藏技术_unix linux

    摘要:本文深入分析了Linux环境下文件.进程及模块的高级隐藏技术,其中包括:Linux可卸载模块编程技术.修改内存映象直接对系统调用进行修改技术,通过虚拟文件系统proc隐藏特定进程的技术. 隐藏技术在计算机系统安全中应用十分广泛,尤其是在网络攻击中,当攻击者成功侵入一个系统后,有效隐藏攻击者的文件.进程及其加载的模块变得尤为重要.本文将讨论Linux系统中文件.进程及模块的高级隐藏技术,这些技术有的已经被广泛应用到各种后门或安全检测程序之中,而有一些则刚刚起步,仍然处在讨论阶段,应用

linux环境下一个进程最多能有多少个线程

以下是对在linux环境下一个进程最多能有多少个线程进行了介绍,需要的朋友可以过来参考下 默认情况下: 主线程+辅助线程 +<253个自己的线程<=255 含主线程和一个辅助线程,最多255个,即你自己只能生成253个线程. 据说可以设置线程数目: 据说是可以设置的,但本人还没有验证!不知道可否. 在你的shell中键入limit命令,里面有descriptor的数目,就是你的进程可以创建的最大线程数目.可以通过修改内核文件更改该数目.

link环境下使用codefirst技术制作一个《网盘软件》的有效期,如何隐藏显示

问题描述 link环境下使用codefirst技术制作一个<网盘软件>的有效期,如何隐藏显示 link环境下使用codefirst技术制作一个<网盘软件>的有效期,如何隐藏显示 解决方案 既然过了有效期,那么就直接把文件删除好了,干吗要隐藏.既然文件存在,就让用户下载,干吗要有有效期 解决方案二: 这个应该是在前台页面aspx中控制隐藏还是显示,或者在数据库中获得筛选好的文件列表给页面. 然后前台页面收到数据库,可以按照网格模式或者列表模式显示.

Windows环境下通过lynx查看隐藏链接识别黑链方法

最近看了好多关于lynx相关的文章,通俗一点lynx就是个文本浏览器,一个和搜索引擎爬虫有点类似的工具,通过这个工具可以非常方便的实现一些辅助SEO的效果,今天小编主要分享一下在windows环境下如果使用lynx来识别页面中的隐藏链接,从而根据获取到的隐藏链接查看是否被黑链. 首先,搭建一个lynx的运行环境 Lynx不能用那种编译过的在windows下运行的版本,有很多功能是不能用的,因此在这里小编分享一种简单的方法去搭建一个环境支持lynx的使用,当然如果你有时间去安装一个虚拟机,然后装一

负载平衡环境下的SESSION管理

session|session 创建交互式web 页面时最大的挑战之一是维持用户的状态,一个站点也许想记住你是谁.在n页之前你点击了什么.在这最后一次做了些什么.现在马上要向你显示什么.实现这些功能的途径有许多,如查询字符串.提交表单或cookies,最强大的一种是ASP的Session 对象.  原文出处:http://www.asptoday.com/articles/20000118.htm      当用户第一次到达某站点,他/她被给予一个HTTP cookie格式的SessionID

asp.net环境下的cmd命令执行

asp.net|执行 cmd.asp木马大家一定用过吧.这是一个可以执行cmd命令的asp文件(不过要被杀毒软件追杀^_^).其原理是用WSCRIPT.SHELL对象调用cmd.exe,然后把返回的信息放到一个临时文件,再利用FSO把临时文件信息读出来显示在浏览器里. 呵呵,在asp.net环境下也是可以写出类似程序的.不过可以不用那些对象. VB.net里有一个shell函数,可以执行外部程序.呵呵,就是利用它!现看看微软的.net framework SDK的介绍: [Shell 函数命名空