通过进程链枚举进程_asm

PEB断链 断链这种技术非常古老,同时应用于非常多的场景,在内核层如果我们需要隐藏一个进程的内核结构体,也会使用这种技术。本文基于PEB断链在用户层和内核层分别进行实现,在用户层达到的效果主要是dll模块的隐藏,在内核层达到的效果主要是进程的隐藏。 3环PEB断链 每个线程都有一个TEB结构来存储线程的一些属性结构,TEB的地址用fs:[0]来获取,在0x30这个地址有一个指针指向PEB结构 然后定位到PEB,PEB就是进程用来记录自己信息的一个结构,在PEB的0x00c偏移有一个 Ldr _PEB_LDR_DAT 阅读详情
 程序用内核驱动的方式进入ring0,然后访问EPROCESS结构,在EPROCESS结构中找到进程链,从而可实现进程的枚举,但是由于PID 为0的系统进程Idle并没有在这个链上.所以通过这种方法自然也就找不出它来.程序输出可以用softice或DebugView工具查看. 本程序只在XP下调试通过.
        ****************************************************************************************************
Author:dge/D哥
Date  :2006.5.1
****************************************************************************************************

;@echo off
;goto make
;***************************************************************************************************

.386
.model flat, stdcall
option casemap:none
;***************************************************************************************************
;                                 I N C L U D E   F I L E S                                        
;***************************************************************************************************
include d:/masm32/include/w2k/ntstatus.inc
include d:/masm32/include/w2k/ntddk.inc
include d:/masm32/include/w2k/ntoskrnl.inc
include d:/masm32/include/w2k/w2kundoc.inc
includelib d:/masm32/lib/w2k/ntoskrnl.lib
include d:/masm32/Macros/Strings.mac

_DriverUnload proto :PDRIVER_OBJECT
_DispatchControl proto :PDEVICE_OBJECT,:PIRP
_DispatchControlIo proto :PDEVICE_OBJECT,:PIRP

;***************************************************************************************************
;                                 C O N S T A N T S                                             
;***************************************************************************************************

.const
CCOUNTED_UNICODE_STRING "//Device//devEnum", g_usDeviceName, 4
CCOUNTED_UNICODE_STRING "//??//slEnum", g_usSymbolicLinkName, 4    
             
;***************************************************************************************************
;                                 N O N D I S C A R D A B L E   C O D E                                  
;***************************************************************************************************

.code

DriverEntry proc uses ebx edi esi, pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
 local status:NTSTATUS
 local pDeviceObject:PDEVICE_OBJECT
 local   dwId,lpEprocess
        local   ListOffset,NameOffset
 local   Version
           
       ;int 3
       ;invoke DbgPrint,$CTA0("/n/nEntry  DriverEntry/n/n")
 mov status,STATUS_DEVICE_CONFIGURATION_ERROR

 invoke IoCreateDevice,pDriverObject,0,addr g_usDeviceName,FILE_DEVICE_UNKNOWN,0,FALSE,addr pDeviceObject
 .if     eax==STATUS_SUCCESS
  invoke IoCreateSymbolicLink,addr g_usSymbolicLinkName,addr g_usDeviceName
  .if     eax ==  STATUS_SUCCESS
   mov eax,pDriverObject
   assume eax:ptr DRIVER_OBJECT
   mov [eax].DriverUnload,      offset _DriverUnload
   mov [eax].MajorFunction[IRP_MJ_Create*(sizeof PVOID)],  offset _DispatchControlIo
   mov [eax].MajorFunction[IRP_MJ_CLOSE*(sizeof PVOID)],  offset _DispatchControlIo
   mov [eax].MajorFunction[IRP_MJ_DEVICE_CONTROL*(sizeof PVOID)], offset _DispatchControlIo
   assume eax:nothing
   invoke  PsGetVersion,NULL,addr Version,NULL,NULL       ;获得得系统版本
                        mov     eax,Version
   cmp     eax,0
   jne     @f
   mov     ListOffset,0A0h
   mov     NameOffset,1fch
                        jmp     QQ
                @@:     cmp     eax,1
                 jne     exit
   mov     ListOffset,88h
   mov     NameOffset,174h
                QQ:     invoke  PsGetCurrentProcessId
   mov     dwId,eax
   invoke  PsLookupProcessByProcessId,dwId,addr lpEprocess
   mov     esi,lpEprocess
   add     esi,ListOffset
   mov     edi,esi
                        assume  edi:PLIST_ENTRY
   assume  esi:PLIST_ENTRY
   invoke DbgPrint,$CTA0("/n/n************Enumerate Process  Start   ***********/n/n")
                @@:     mov     edx,[esi].Flink                    
                        cmp     edx,edi                                        ;比较是否为最后一个EPROCESS
   je      @F
   assume  esi:nothing
   sub     esi,ListOffset
   add     esi,NameOffset
   invoke DbgPrint,$CTA0("%s/n"),esi
   sub     esi,NameOffset                                 ;恢复EPROCESS指针  
   add     esi,ListOffset                  
   assume  esi:PLIST_ENTRY 
   mov     esi,[esi].Flink
   jmp     @B
                @@:     invoke DbgPrint,$CTA0("/n/n************Enumerate Process Complete ***********/n/n")
                 assume  esi:nothing
   assume  edi:nothing                 
   mov     status,STATUS_SUCCESS
  .else
   invoke IoDeleteDevice, pDeviceObject
  .endif
 .endif
 mov     eax,status
 ret
exit:   mov     eax,STATUS_DEVICE_CONFIGURATION_ERROR
        ret
DriverEntry endp

;***************************************************************************************************
;                                 DispatchControlIo                                            
;***************************************************************************************************

_DispatchControlIo proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
                                                                               
       ;int 3
       ;invoke DbgPrint,$CTA0("/n/nEntry  DispatchCreateClose  /n/n")

 mov     eax,pIrp
 assume  eax:ptr _IRP
 mov     [eax].IoStatus.Status,STATUS_SUCCESS
 and     [eax].IoStatus.Information,0
 assume  eax:nothing

 invoke IoCompleteRequest,pIrp,IO_NO_INCREMENT

 mov eax, STATUS_SUCCESS
 ret

_DispatchControlIo endp

;***************************************************************************************************
;                                 DriverUnload                                           
;***************************************************************************************************

_DriverUnload proc pDriverObject:PDRIVER_OBJECT

       ;int 3
       ;invoke DbgPrint,$CTA0("/n/nEntry DriverUnload/n/n")
 
 invoke IoDeleteSymbolicLink,addr g_usSymbolicLinkName                 ;清除符号连接
 mov eax, pDriverObject                                             ;删除在初始化创建的设备
 invoke IoDeleteDevice,(DRIVER_OBJECT PTR [eax]).DeviceObject
 ret

_DriverUnload endp

;***************************************************************************************************
;                                 E N D                                           
;***************************************************************************************************
              
end DriverEntry

;***************************************************************************************************

:make

set path=%path%;d:/masm32/bin
set drv=enum

ml /nologo /c /coff %drv%.bat
link /nologo /driver /base:0x10000 /align:32 /out:%drv%.sys /subsystem:native %drv%.obj
del %drv%.obj
echo.
pause




参考资料:

(1).一块三毛钱--监视远程线程的创建.  http://www.zhongts.net/MyEssay/ThreadMonitor.htm                                                                      

(2)ZwelL--对windows内核操作的一些说明.  https://www.xfocus.net/bbs/index.php?act=SE&f=3&t=47208&p=192941

(3) KmdTut 中文翻译. http://asm.yeah.net

(4)Undocumented Windows NT 
用户态枚举进程的几种方法 最近在准备一个进程查看(当然不只进程查看功能了)的工具,总结了在用户态下查找进程的几种方法。当然,如果想要真正做到进程查看,还是要进入核心态中,因为在用户态是查不到什么东西的,但是可以用来和核心态结果进行比较找出隐藏进程。(内核级病毒、木马在Ring0中可以很容易的做到隐藏而是用户态程序检测不到)。//write by jingzhongrong1、利用ToolHelp API 阅读详情

相关推荐

EDR核心原理分析(2026/9/22 更新一版本)

文章摘要: EDR(端点检测与响应)通过行为分析(如API调用、进程链)检测威胁,区别于传统杀毒的静态签名匹配。其架构分6层:驱动层(内核回调采集事件)、通信层(内核-用户态数据传输)、分析层(规则引擎关联行为)、展示层(可视化与响应)。驱动是EDR的“传感器”,确保事件及时性(如进程创建回调)和完整性(覆盖系统启动阶段)。绕过EDR需分层突破,如移除内核回调(Rootkit技术)或DKOM隐藏进程。未来将探讨高阶免杀技术,融合PE结构、内存操作等底层知识,但需扎实的二进制、内核编程基础。

盾悟 3092

内核下枚举进程(一)进程活动链

今天学会了一种在内核下枚举进程的方法,写下来与大家共享。用到了的是EPROCESS 结构,EPROCESS 是一个关于进程的结构,此结构很庞大,包括的内容非常丰富.由于此结构未文档化所以用windbg来查看输入dt _eprocess命令查看该结构如下: ntdll!_EPROCESS +0x000 Pcb : _KPROCESS //进程控制...

308

枚举系统中所有进程,及他们的所有网络连接

枚举系统中所有进程,及他们的所有网络连接

枚举网络连接

枚举网络连接 Private Const RAS_MaxDeviceType = 16 Private Const RAS95_MaxDeviceName = 128 Private Const RAS95_MaxEntryName = 256 Private Type RASCONN95

Hacktt的专栏 804

复现基于PYNQ-Z2的手写数字识别卷积加速器设计

来源雪天鱼。

eachanm的博客 968

第二次 PX4仿真环境搭建过程全记录

参考链接 https://blog.youkuaiyun.com/yanwumuxi/article/details/80097294 https://www.ncnynl.com/archives/201709/2013.html 一、安装依赖项 我们使用Debian / Ubuntu LTS 作为Linux的标准支持版本,但是也支持Cent OS 和 Arch Linux的发行版本。 权限设置 警告:永远...

移步换景的博客 2263

【转】枚举进程:ring3->ring0

用google搜索了几天相关内容的资料,将所提到的逐一实现。哎,不禁感叹自己太菜了。居然用了几天的时间。没啥新思想、内容,只是总结,当然还有其他方法没总结到。但经常提到的ring3下的快照、psapi的EnumProcesses、暴力OpenProcess;ring0下的ZwQuerySystemInformation、activprocess链、暴力搜索内存、PspCidTable、Csrss进

依然静谧的专栏 1156

使用VIVADO 2019.1 搭建以太网接口

以太网 MAC+SGMII->GMII接口转换 以FPGA V7为例,搭建一个千兆以太网接口。运行环境为Vivado2019.1。板卡的FPGA V7与千兆网口芯片采用SGMII互联,最终实现FPGA与上位机之间的千兆网卡通信,实际实现时,V7采用MAC + GMII ->SGMII的结构。SGMII接口使用1G/2.5G Ethernet PCS/PMA or SGMII ip核,MAC层使用Tri Mode Ethernet MAC ip核。 由于MAC层IP不支持SGMII接口,因此需要G

qq_44641513的博客 8415

WIN API-VFP枚举网络连接

*--首先感谢网友dkfdtf对GetTcpTable方法的编写,才使我轻意的写成了GetExtendedTcpTable*--API-GetTcpTable:结果含有远程地址为空的记录,但不含有PID(进程ID) Clear#Define ERROR_INSUFFICIENT_BUFFER 122Declare Long GetTcpTable In Iphlpapi String @pTc

apple_8180(十豆三) 的专栏 4321

(10)Proteus 8.9上的STM32仿真系列(HAL)---freertos

实验设计:通过cubemxide生成freertos工程,然后创建一个 pc13 led灯间隔200ms闪烁的任务。非常遗憾的是proteus8.9仿真失败,实物上没有问题,但还是把流程过一遍。 一、原理图 实物是淘宝上stm32f103 c8t6的核心板,proteus上没有这个芯片,这里图上大概表示一下,用的是核心板自带的pc13引脚的led灯。 二、cubemxide配置 1.RCC如之前工程一样配置 2、配置SYS timebase Source不要使用systick,自己选择一个定时器,我这

qq_35442550的博客 7346

Modscan32连接上了却没数据?一文拆解所有报错(从“Device NOT CONNECTED”到“Checksum Error”)

本文深入解析Modscan32连接异常问题,从状态栏报错到数据异常,提供系统化的诊断思路和解决方案。涵盖物理层问题、配置参数错位、端口占用冲突等常见故障,帮助工程师快速定位和解决Modbus通信中的各类错误。

weixin_30384217的博客 399

进程链表监视进程是否被创建或者销毁

既然可以通过进程活动链表来枚举进程,当然可以用来监视进程是否被创建或者销毁。下面的程序是KmdKit例子里的代码,我在学习的过程中已经加了详细注释。KmdKit/examples/basic/Synchronization/SharedEvent - ProcessMon驱动代码:;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

daiyu22的专栏 486

告别手动标注!PDMS NakiToolkit插件安装与初体验:以Pipeline工具为例

本文详细介绍了PDMS NakiToolkit插件的安装与使用,特别是其Pipeline工具如何通过自动化标注和材料统计功能大幅提升三维工厂设计效率。从环境准备到实战演示,帮助工程师告别繁琐的手动标注工作,实现项目交付周期的大幅缩短。

weixin_30047059的博客 352

KPCR

由于Windows需要支持多个CPU, 因此Windows内核中为此定义了一套以处理器控制区(Processor Control Region)即KPCR为枢纽的数据结构, 使每个CPU都有个KPCR. 其中KPCR这个结构中有一个域KPRCB(Kernel Processor Control Block)结构, 这个结构扩展了KPCR. 这两个结构用来保存与线程切换相关的全局信息.  通常fs

stonesharp的专栏 4192

如何完全卸载axure软件以及解决安装axure后打不开的问题【2023年】

如何完全卸载axure软件以及解决安装axure后打不开的问题【2023年】

念兮为美 5141

量化交易零基础入门教程

特点 从零开始教编程。靠谱的量化交易学习资源稀少,且具有不讲编程、代码较难、过多等不适合新手等问题,本教程中则会从零开始教编程,解决量化入门过难过编程门槛这一问题。 量化与编程相结合。本教程不仅会教编程,而且会尽量结合量化情景,减少“我要做量化交易为什么要看这些用来培训程序员的东西”的愤懑。 简易精炼,快速入门。尽量只讲最核心最常用的知识,助你快速摆脱想学习量化却处处陌生不知所措的茫然的新手阶段。 读前说明 文后会有自测与自学,包括一些额外的延伸自学内容以及稍有难度的自测题目。 最最最基础的股票.

JanLEE 2888

内核态进程管理器Intercessor和实现细节

 标 题: 【原创】内核态进程管理器Intercessor和实现细节 作 者: greatcsk 时 间: 2007-09-05,20:20 链 接: http://bbs.pediy.com/showthread.php?t=51157 BLOG原文:http://www.csksoft.net/blog/post/Intercessor_taskmgr.html 相关文件: 已经修

jingzu的专栏 2337

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

枚举进程列表

#include "test1.h" #include #include #include "psapi.h" #pragma comment(lib, "psapi.lib") /************************************************************************/ /* 快照方式

Arbboter的专栏 1709

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

利用ZwQuerySystemInformation和paspi枚举进程

#include #include #include typedef DWORD (WINAPI *ZWQUERYSYSTEMINFORMATION)(DWORD,PVOID,DWORD,PDWORD); typedef struct _SYSTEM_PROCESS_INFORMATION{ DWORD NextEntryDelta; DWORD ThreadCount;

Makers 1259

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ring0检测隐藏进程

2007年8月26日 ring0检测隐藏进程标 题: 【原创】ring0检测隐藏进程作 者: 堕落天才时 间: 2007-05-10,13:28链 接: http://bbs.pediy.com/showthread.php?t=44243//网上得到一篇好文章 Ring0下搜索内存枚举隐藏进程 ,但是拿里面的代码来使用的时候发现并没有太多效果//于是修改之,终于实现了

jingzu的专栏 3300

<转>内核层 进程列举 NtQuerySystemInformation

/*--------- 1.c -----------*/ #include "1.h"   //---------列举进程---------   NTSTATUS EnumProcess()   {   int iCount = 1;    //进程计数   NTSTATUS status;   //返回值   PVOID pSi = NULL; /*指向SystemInformationCla...

weixin_33721344的博客 203

Windows下如何枚举所有进程

要编写一个类似于 Windows 任务管理器的软件,首先遇到的问题是如何实现枚举所有进程。暂且不考虑进入核心态去查隐藏进程一类的,下面提供几种方法。请注意每种方法的使用局限,比如使用这些 API 所需要的操作系统是什么(尤其是是否能在 Windows Mobile 下使用)。   本文参考用户态枚举进程的几种方法,原文对于每一种方法都给出了完整的代码,被我照抄下来。还有一篇:如何用 Win32 ...

weixin_34116110的博客 866
上一篇: Hook API监视驱动的加载_ASM
下一篇: 列举进程的内核函数ZwQuerySystemInformation _asm
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值