浅析进程“伪隐藏”技术与实现两则

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

进程隐藏?干吗用?你不知道?我晕!进程隐藏技术多用于木马和病毒中(还用你说?!),用于提高其生存率。其实现方法因WIN系统架构不同而各异,一些常用方法资料很多,我在这里也就不多说啦!

   这里的"伪隐藏"指的是,虽然在"WINDOWS任务管理器"进程列表中可以看到其进程存在,但在硬盘中却找不到或者说不容易找到其相对应的程序文件。

   一:乾坤大挪移

   大家都知道,当一个程序正在运行时,WIN系统是不允许我们把其删除的(所以才会有人寻找程序自删除_blank>技术),但却不知大家是否注意到,在WIN2000中,当一个程序正在运行时,我们虽然不能把它删除,但我们却可以把程序文件在同一分区内移动位置以及重命名,你可以自己试验一下!这也就是"Windows文件保护"所使用的方法!试想,如果我们的程序在运行后,立即把自身移动位置并重命名,而在"WINDOWS任务管理器"进程列表中显示的却还是原来的程序名,那你又该如何来查找到其对应的程序文件呢?当然如果程序在内存中没有进行变形的话,你可以利用内存查看_blank>软件(如WINHEX)并利用查找功能来找到相对应的程序文件,但如果程序在内存中变形

,也可以说解密,使得内存映像和硬盘中的原程序文件不同,那我是暂时没法找出来啦!
   实现_blank>代码如下(MASM):

;进程隐藏之乾坤大挪移(只能在同分区内移动)

.386
.model flat, stdcall
option casemap:none

include windows.inc
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib
     .data?
selfname db MAX_blank>_PATH dup(?)
     .data
movename db "c:/mm.jpg",0
     .code
main:
invoke GetModuleFileName,NULL,addr selfname,MAX_blank>_PATH  ;得到自身路径
mov al, byte ptr selfname  ;得到所在分区
mov byte ptr movename,al  ;修正movename,使其在同分区内移动
invoke MoveFile,addr selfname,addr movename  ;把自身移动位置并改名
invoke  MessageBox,NULL,offset selfname,offset movename,MB_blank>_OK
invoke ExitProcess, NULL
end main

     本例程在WIN2000下调试通过,XP" target=_blank>XP和WIN2003应该也可以,请有条件的弟兄测试,WIN98和WINME不能用,与硬盘格式无关!

二:程序自删除(仅适用于NTFS硬盘分区格式)

     在NTFS分区下存在文件流早已不是什么秘密啦,但大家主要用它来隐藏文件,我在一次测试中却发现当我运行一个文件流程序时,这个文件流程序所在的宿主文件却是可以被删除的!进一步测试发现文件流程序运行时并无法直接删除这个文件流程序,只能删除宿主文件,从而来删除文件流程序。利用此特性,我们同样可以实现类似于上例的效果,且比其隐藏效果要好点。方法为:判断是否是NTFS格式分区,如果是则把自身复制为一个文件流,并运行复制的文件流,运行时检测到自己是存在于文件流中时就删除宿主文件。

     实现_blank>代码如下(MASM):



;进程隐藏之文件流(只能用于NTFS分区格式)

.386

.model flat, stdcall

option casemap:none



include windows.inc

include kernel32.inc

includelib kernel32.lib

include user32.inc

includelib user32.lib

       .data?

selfname      db MAX_blank>_PATH dup(?)

szFileSystemName  db 10 dup(?)

       .data



delname db "`.`:icyfox.exe",0

;此处的"`.`:icyfox.exe"可以改为其他文件名如"cs.txt:cs.exe"

;我这里用"`.`"的目的是为了防止删除其他存在的文件



szErr db "我不在NTFS格式的分区内,退出!",0

szYes db "我在下面的流内,已被删除!",0

.code



main:

invoke GetModuleFileName,NULL,addr selfname,MAX_blank>_PATH

mov bl,byte ptr selfname+3

mov byte ptr selfname+3,0

xor eax,eax



;下面获取自身所在分区格式,并判断是否是NTFS格式

invoke  GetVolumeInformation,addr selfname,eax,eax,/

  eax,eax,eax,addr szFileSystemName, sizeof szFileSystemName

mov byte ptr selfname+3,bl

.if dword ptr szFileSystemName!='SFTN';NTFS

  invoke  MessageBox,NULL,offset szErr,NULL,MB_blank>_OK

  invoke ExitProcess, NULL

.endif



;下面判断自己是否在流(STREAM)中

;如果路径中含有两个:号,说明自己在文件流中

lea  esi,selfname

xor edx,edx

@@:

LODSB

or  al,al

jz  @F  ;遇到0结束

.if al==":"

  INC edx

.endif

.if edx==2

  mov byte ptr [esi-1],0

  invoke DeleteFile,addr selfname     ;删除宿主文件

  invoke  MessageBox,NULL,offset delname,offset szYes,MB_blank>_OK

  invoke ExitProcess, NULL

.endif

jmp  @B



;下面是当自身不在文件流中时,把自身复制到流中并运行

@@:

invoke CopyFile,addr selfname,addr delname,FALSE

invoke  WinExec,addr delname,NULL

invoke ExitProcess, NULL

end main



     附加品:

     我在测试时发现,当delname(也就是流名)为" .:icyfox.exe" (.前为一空格,也可以是其他字符)时,会产生一个无法删除的文件" .",我的盘中还留着它,请大家想想办法帮我删掉它!我怀疑可能和那个文件夹_blank>漏洞有关,但现在是文件,我在后面加上/也删不掉!

kernel32基地址获得学习笔记 原文链接:点击打开链接 第一种方法 通过线程初始化时, 获得esp堆栈指针中的ExitThread函数的地址,然后通过搜索获得kernel32.dll的基地址。 线程在被初始化的时,其堆栈指针指向ExitThread函数的地址,windows这样做是为了通过ret返回时来调用ExitThread地址。所以一般我们可以在我们主线程的起始位置(也就是 程序入口点处)通过获得堆栈指针中E 阅读详情

相关推荐

说说windows内核中为什么要隐藏进程

 好久没有写博客了,最近抽时间把这些杂碎零散的知识梳理下来,分享给更多朋友去找乐子,在草稿箱里面仍了好几天忘发了。接下来谈谈本篇主题,隐藏两字。一、隐藏意味着什么?  不想被人发现呗,人性如此,亦是如此。二、为什么要隐藏?  其实个人觉着这是根本,好好写个程序你为什么要隐藏自己的进程、线程?为啥?无非你不想让别人知道,或者不该让别人知道。windwos下有很多未公开的东西,这是隐藏。面对对象...

weixin_33948416的博客 754

vxk的rootkit 技术小结

by vxkMy Root Kit Note 0. What the Root kit Real Mean For?Root Kit is a kind of tools to hide itself or other files or process from normal users eyes or take privileges for whom could control i

4930

windows黑客编程技术隐藏技术进程装,傀儡进程进程隐藏

windows黑客编程技术隐藏技术进程装,傀儡进程进程隐藏

weixin_44891742的博客 8263

小议文件保护和锁定技术

近1年来互连网上的木马越来越多,有的还删除不掉,要切换到dos才可行,如:CNNC,3721等,实现技术也五花八门,但就文件不可删除的实现技术可分三类:  1 Attach file system; 这种技术和Filemon/sfilter查不多,就是挂一个filter驱动到fs上,其他函数都是passthru下去,只处理IRP_MJ_SET_INFORMATION,当发现有删除需保护文件的IRP

906

解析网页后门和挂马

网站被挂马,被植入后门,这是管理员们无论如何都无法忍受的。Web服务器被攻克不算,还“城门失火殃及池鱼”,网站的浏览者也不能幸免。这无论是对企业的信誉,还是对管理员的技术能力都是沉重的打击。下面笔者结合实例对网页后门及其网页挂马的技术进行解析,知己知彼,拒绝攻击。一、前置知识W&q1Y"o-cJ6SR-m)u,s+tm0网页后门其实就是一段网页代码,主要以ASP和PHP代码为主。由于这

9472

PSTOOLS系列工具分析----对PSEXEC的逆向解析

 PSTOOLS系列工具分析----对PSEXEC的逆向解析    在网络攻击中,经常用到一个工具系列叫pstools,它是由Sysinternals公司推出的一个功能强大的Windows NT/2000远程管理工具包,最新版本为V2.1,包含了10多个工具。在入侵时,最常用的就是其中的psexec(获取对方Shell)、pslist(列举进程)、pskill(杀进程)等工具,它们使用简单

在程序中感悟人生算法 7444

顺序表(Sequential List)详解:从数组到 C 语言实现

顺序表是用连续存储单元依次存储数据元素的线性结构,数组则是其最常见的实现方式,两者本质相同、仅视角不同——数组关注物理存储,顺序表关注逻辑关系。顺序表支持随机访问 $O(1)$,但插入删除需移动元素,效率为 $O(n)$。本文用 C 语言静态数组完整实现了顺序表的初始化、增删改查操作,帮助初学者在不涉及指针的前提下理解其核心原理,为后续学习动态顺序表打下基础。

Guangyu536的博客 306

windows 驱动实例分析系列: HidHide驱动分析-HidHideCLI 篇(三)

`HID.cpp` 模块实现了完整的设备枚举信息采集,这些功能 GUI 版本共享相同的核心逻辑,但在输出格式上存在差异——CLI 版本输出 JSON,而 GUI 版本填充树形控件。

王马的博客 128

苍穹外卖【day10| 订单状态定时处理】

本文设计并实现订单状态自动流转机制,通过定时任务处理超时订单:15分钟未付款自动取消,派送超60分钟则标记为完成,避免状态卡死。采用MyBatis动态SQL精准更新字段,减少数据库压力。定时任务WebSocket互补——前者兜底,后者实时通知,保障系统可靠性用户体验。

2503_94545876的博客 43

【回溯】【中等】全排列/子集/电话号码的字母组合/组合总和/括号生成/单词搜索/分割回文串

【待更新】

2301_81831660的博客 46

cmake教程

单/多个源文件、不同目录下的源文件、组织架构(源文件/头文件/对象文件/elf文件/库文件)、库的编译控制链接(.so/.a)、编译选项、控制选项(生成部分文件/编译部分代码)

Wangshijie1015的博客 56

Qt的常用类QList--序列数据管理

因此可以采用下标来进行索引进行快速的访问。而QVector是Qt对所有数组的封装,它元素的存储位置彼此相邻,也就是说它是以数组的形式进行存储的,它的插入删除操作常常伴随着内存的移动,所以效率上并没有QList高。QlinkList我们可以把它当成一个链表,它以非连续的内存块进行保存数据,所以它不能使用下标进行访问,它更适合于数据的插入操作。通过list.at()函数和下标,它的区别就是通过下标的时候,QList会对它的数据进行一次拷贝,也就是内存的一次复制,所以我们通过下标这种方式效率不高。

qq_42831443的博客 111

75 条文章索引被一条 add 清成 1 条,退出码还是 0:tri-article 的 index.py 我读了 205 行

以一次真实清库事故切入,逐段复现 tri-article 索引脚本的三处静默失败并给出可运行加固代码(严格加载抛错、原子写 os.replace、长度差预筛的软去重)。附带 dedup 省略 --slug 时判定退化为「slug 长度 ≤2」、search 只搜 title、真实 75 条索引中 6 条在 domain 维度不可达、save_index 零调用等实测结论,并用 65/75 的哈希自证说明历史失配来自改标题未回写。

三声三视的博客 155

33 链表排序

给你链表的头结点head,请将其按排列并返回。[1,2,3,4]head = [][]你可以在O(n log n)时间复杂度和常数级空间复杂度下,对链表进行排序吗?

weixin_52079669的博客 210

systemd-mount命令详解

是 systemd 提供的一个命令行工具,用于动态创建和启动.mount或.automount单元。它的核心设计理念传统的mount(8)命令不同:它不是立即执行挂载系统调用,而是将挂载操作排入 systemd 的服务管理器作业队列,从而能够自动处理父挂载点依赖、文件系统检查等前置条件,并支持按需自动挂载。

zhaominyong的专栏 237

Mybatis的多表操作问题

Q1 :一对一表关系之中哪个属性封装到<ResultMap>中?哪一个封装到<association>当中?Q2:一对多表关系之中哪个属性封装到<ResultMap>中?哪一个封装到<collection>当中?A:主要看谁包含谁,例如:一个用户 (User) 持有一张身份证 (IdCard)所以把OrderList封装进collection中。一个用户名下的所有订单。

m0_57532232的博客 223

Java 对象拷贝,怎样避免空值覆盖和数据误改?

先定 null 的含义,再定引用是否要独立。跳过 null 可以保留新对象默认值;要修改副本里的集合,就显式复制需要独立的那一层。不要把“创建新对象”当成“完成深拷贝”。如果这篇文章对您有用,欢迎关注。后续会继续拆解 Java 后端的实用代码,讲清写法、原理和使用时要注意的细节。

MetaLite的博客 96
上一篇: Windows 2003下的进程隐藏
下一篇: NT环境下进程隐藏的实现
iiprogram
博客等级 码龄25年 1066粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值