邪恶八进制信息安全团队技术讨论组's Archiver

冰血封情 2005-3-11 22:32

[转载]在Windows 2003中HOOK ZwCreateProcessEx

文章作者:ZwelL

工作需要,想控制进程的创建,于是HOOK了ZwCreateProcess,后来发现xp和2003中创建进程的都用NtCreateProcessEx(参见[1])。
但是ZwCreateProcessEx未被ntoskrnl.exe导出,用softice的ntcall命令也没有看到,网上也没有找到相关代码。没办法,跟踪ntoskrnl!ZwCreateProcess
>u ntoskrnl!ZwCreateProcessEx

_ZwCreateProcess
0008:804e7ae2   bb32000000   mov eax, 00000032

但是ZwCreateProcessEx有9个参数,最后一个未知,4字节,猜成HANDLE型。
原型如下:
typedef NTSTATUS (*NTCREATEPROCESSEX)(
   OUT PHANDLE ProcessHandle,
   IN ACCESS_MASK DesiredAccess,
   IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
   IN HANDLE ParentProcess,
   IN BOOLEAN InheritObjectTable,
   IN HANDLE SectionHandle OPTIONAL,
   IN HANDLE DebugPort OPTIONAL,
   IN HANDLE ExceptionPort OPTIONAL,
   IN HANDLE Unknown );  
最终用硬编码HOOK 成功,代码如下:


#include "ntddk.h"
#include "stdarg.h"
#include "stdio.h"
#include "ntiologc.h"

#define DWORD unsigned long
#define WORD unsigned short
#define BOOL unsigned long

typedef struct ServiceDescriptorEntry {
   unsigned int *ServiceTableBase;
   unsigned int *ServiceCounterTableBase; //Used only in checked build
   unsigned int NumberOfServices;
   unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry, *PServiceDescriptorTableEntry;

extern PServiceDescriptorTableEntry KeServiceDescriptorTable;

typedef NTSTATUS (*NTCREATEPROCESSEX)(
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
IN HANDLE ParentProcess,
IN BOOLEAN InheritObjectTable,
IN HANDLE SectionHandle OPTIONAL,
IN HANDLE DebugPort OPTIONAL,
IN HANDLE ExceptionPort OPTIONAL,
IN HANDLE Unknown );

NTCREATEPROCESSEX   OldNtCreateProcessEx;

// Length of process name (rounded up to next DWORD)
#define PROCNAMELEN    20
// Maximum length of NT process name
#define NT_PROCNAMELEN  16
ULONG gProcessNameOffset;

void GetProcessNameOffset()
{
   
   PEPROCESS curproc;
   int i;
   curproc = PsGetCurrentProcess();
   for( i = 0; i < 3*PAGE_SIZE; i++ )
   {
      if( !strncmp( "System", (PCHAR) curproc + i, strlen("System") ))
      {
        gProcessNameOffset = i;
      }
   }
}

BOOL GetProcessName( PCHAR theName )
{
   PEPROCESS     curproc;
   char        *nameptr;
   ULONG        i;
   KIRQL        oldirql;

   if( gProcessNameOffset )
   {
      curproc = PsGetCurrentProcess();
      nameptr  = (PCHAR) curproc + gProcessNameOffset;
      strncpy( theName, nameptr, NT_PROCNAMELEN );
      theName[NT_PROCNAMELEN] = 0; /* NULL at end */
      return TRUE;
   }
   return FALSE;
}

NTSTATUS NewNtCreateProcessEx(
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
IN HANDLE ParentProcess,
IN BOOLEAN InheritObjectTable,
IN HANDLE SectionHandle OPTIONAL,
IN HANDLE DebugPort OPTIONAL,
IN HANDLE ExceptionPort OPTIONAL,
IN HANDLE Unknown OPTIONAL)
{
   CHAR aProcessName[PROCNAMELEN];
      
   GetProcessName( aProcessName );
   DbgPrint("rootkit: NewNtCreateProcessEx() from %s\n", aProcessName);
   //DbgPrint("ok");
   return OldNtCreateProcessEx(ProcessHandle,DesiredAccess,
        ObjectAttributes,ParentProcess,InheritObjectTable,SectionHandle,DebugPort,ExceptionPort,Unknown);
}

NTSTATUS
OnStubDispatch(
   IN PDEVICE_OBJECT DeviceObject,
   IN PIRP        Irp
   )
{
   Irp->IoStatus.Status    = STATUS_SUCCESS;
   IoCompleteRequest (Irp,
                IO_NO_INCREMENT
                );
   return Irp->IoStatus.Status;
}

VOID OnUnload( IN PDRIVER_OBJECT DriverObject )
{
   DbgPrint("ROOTKIT: OnUnload called\n");

   _asm
   {
      CLI              //dissable interrupt
      MOV   EAX, CR0      //move CR0 register into EAX
      AND EAX, NOT 10000H //disable WP bit
      MOV   CR0, EAX      //write register back
   }

   (NTCREATEPROCESSEX)(*(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase + 0x32))=OldNtCreateProcessEx;

   _asm
   {
      MOV   EAX, CR0      //move CR0 register into EAX
      OR   EAX, 10000H      //enable WP bit   
      MOV   CR0, EAX      //write register back      
      STI              //enable interrupt
   }
}

NTSTATUS DriverEntry( IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath )
{
   int i;

   DbgPrint("My Driver Loaded!");
   GetProcessNameOffset();

   // Register a dispatch function
   for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
   {
        theDriverObject->MajorFunction[i] = OnStubDispatch;
   }

   theDriverObject->DriverUnload  = OnUnload;

   // save old system call locations
   //OldNtCreateProcessEx=(NTCREATEPROCESSEX)(SYSTEMSERVICE(0x32));
   OldNtCreateProcessEx=(NTCREATEPROCESSEX)(*(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase + 0x32));


   _asm
   {
      CLI              //dissable interrupt
      MOV   EAX, CR0      //move CR0 register into EAX
      AND EAX, NOT 10000H //disable WP bit
      MOV   CR0, EAX      //write register back
   }

   (NTCREATEPROCESSEX)(*(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase + 0x32))=  NewNtCreateProcessEx;

   _asm
   {
      MOV   EAX, CR0      //move CR0 register into EAX
      OR   EAX, 10000H      //enable WP bit   
      MOV   CR0, EAX      //write register back      
      STI              //enable interrupt
   }
              
   return STATUS_SUCCESS;
}

这样很不爽,每次都要这样看索引号,问了SOBEIT,可以通过从NTDLL中这样获取服务索引号:
来自rookkit:

#include <windows.h>
#include <stdio.h>

BOOL GetId( char *FuncName, ULONG *FunctionID )
{
   //get the function&#39;s address
   PBYTE Function = (PBYTE)GetProcAddress( GetModuleHandle( "ntdll.dll" ), FuncName );
   /*
   do some sanity checks,
   make sure this function
   has a corresponding kernel
   level function
   */

   *FunctionID = 0;

   //func not found...
   if ( Function == NULL )
   {
      return FALSE;
   }

   /*
   77F5B438  B8 00000000   MOV EAX, _FUNCTION_ID_
   77F5B43D  BA 0003FE7F   MOV EDX,7FFE0300
   77F5B442  FFD2        CALL EDX
   77F5B444  C2 1800      RETN XX
    */

   //mov eax
   if ( *Function != 0xB8 )
   {
      return FALSE;
   }
   /*
   since the address of
   the function which
   actually makes the call
   (SYSCALL) may change, we just
   check for mov edx
   */
   if ( *(Function + 5) != 0xBA )
   {
      return FALSE;
   }

   //call edx
   /*if ( *(PWORD)(Function + 10) != 0xD2FF )
   {
      return FALSE;
   }
   //retn
   if ( *(Function + 12) != 0xC2 )
   {
      return FALSE;
   }*/

   *FunctionID = *(PDWORD)(Function + 1);
   return TRUE;
}

int main(int argc, char* argv[])
{
   ULONG Id;
   
   printf( "function name: NtCreateProcessEx\n" );

   GetId( "NtCreateProcessEx", &Id );
   printf( "function id: %08X\n", Id );
   return 0;
}
///////////////////////////////////////////////////////////////////////

这样也不爽,要从用户态传到驱动层不方便,最后,用这个代码:

#include "ntddk.h"
#include "stdarg.h"
#include "stdio.h"
#include "ntiologc.h"
#include "ntimage.h"


#define DWORD unsigned long
#define WORD unsigned short
#define BOOL unsigned long
#define BYTE unsigned char

#define SEC_IMAGE   0x01000000

typedef struct _SECTION_IMAGE_INFORMATION {
PVOID EntryPoint;
ULONG StackZeroBits;
ULONG StackReserved;
ULONG StackCommit;
ULONG ImageSubsystem;
WORD SubsystemVersionLow;
WORD SubsystemVersionHigh;
ULONG Unknown1;
ULONG ImageCharacteristics;
ULONG ImageMachineType;
ULONG Unknown2[3];
} SECTION_IMAGE_INFORMATION, *PSECTION_IMAGE_INFORMATION;

DWORD GetDllFunctionAddress(char* lpFunctionName, PUNICODE_STRING pDllName)
{
   HANDLE hThread, hSection, hFile, hMod;
   SECTION_IMAGE_INFORMATION sii;
   IMAGE_DOS_HEADER* dosheader;
   IMAGE_OPTIONAL_HEADER* opthdr;
   IMAGE_EXPORT_DIRECTORY* pExportTable;
   DWORD* arrayOfFunctionAddresses;
   DWORD* arrayOfFunctionNames;
   WORD* arrayOfFunctionOrdinals;
   DWORD functionOrdinal;
   DWORD Base, x, functionAddress;
   char* functionName;
   STRING ntFunctionName, ntFunctionNameSearch;
   PVOID BaseAddress = NULL;
   SIZE_T size=0;

   OBJECT_ATTRIBUTES oa = {sizeof oa, 0, pDllName, OBJ_CASE_INSENSITIVE};

   IO_STATUS_BLOCK iosb;

   //_asm int 3;
   ZwOpenFile(&hFile, FILE_EXECUTE | SYNCHRONIZE, &oa, &iosb, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT);

   oa.ObjectName = 0;

   ZwCreateSection(&hSection, SECTION_ALL_ACCESS, &oa, 0,PAGE_EXECUTE, SEC_IMAGE, hFile);
   
   ZwMapViewOfSection(hSection, NtCurrentProcess(), &BaseAddress, 0, 1000, 0, &size, (SECTION_INHERIT)1, MEM_TOP_DOWN, PAGE_READWRITE);
   
   ZwClose(hFile);
   
   hMod = BaseAddress;
   
   dosheader = (IMAGE_DOS_HEADER *)hMod;
   
   opthdr =(IMAGE_OPTIONAL_HEADER *) ((BYTE*)hMod+dosheader->e_lfanew+24);

   pExportTable =(IMAGE_EXPORT_DIRECTORY*)((BYTE*) hMod + opthdr->DataDirectory[ IMAGE_DIRECTORY_ENTRY_EXPORT]. VirtualAddress);

   // now we can get the exported functions, but note we convert from RVA to address
   arrayOfFunctionAddresses = (DWORD*)( (BYTE*)hMod + pExportTable->AddressOfFunctions);

   arrayOfFunctionNames = (DWORD*)( (BYTE*)hMod + pExportTable->AddressOfNames);

   arrayOfFunctionOrdinals = (WORD*)( (BYTE*)hMod + pExportTable->AddressOfNameOrdinals);

   Base = pExportTable->Base;

   RtlInitString(&ntFunctionNameSearch, lpFunctionName);

   for(x = 0; x < pExportTable->NumberOfFunctions; x++)
   {
      functionName = (char*)( (BYTE*)hMod + arrayOfFunctionNames[x]);

      RtlInitString(&ntFunctionName, functionName);

      functionOrdinal = arrayOfFunctionOrdinals[x] + Base - 1; // always need to add base, -1 as array counts from 0
      // this is the funny bit.  you would expect the function pointer to simply be arrayOfFunctionAddresses[x]...
      // oh no... thats too simple.  it is actually arrayOfFunctionAddresses[functionOrdinal]!!
      functionAddress = (DWORD)( (BYTE*)hMod + arrayOfFunctionAddresses[functionOrdinal]);
      if (RtlCompareString(&ntFunctionName, &ntFunctionNameSearch, TRUE) == 0)
      {
        ZwClose(hSection);
        return functionAddress;
      }
   }

   ZwClose(hSection);
   return 0;
}

NTSTATUS
OnStubDispatch(
   IN PDEVICE_OBJECT DeviceObject,
   IN PIRP        Irp
   )
{
   Irp->IoStatus.Status    = STATUS_SUCCESS;
   IoCompleteRequest (Irp,
                IO_NO_INCREMENT
                );
   return Irp->IoStatus.Status;
}

VOID OnUnload( IN PDRIVER_OBJECT DriverObject )
{
   DbgPrint("ROOTKIT: OnUnload called\n");
}

NTSTATUS DriverEntry( IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath )
{
   int i;
   UNICODE_STRING dllName;
   DWORD functionAddress;
   int   position;
   DbgPrint("My Driver Loaded!");
   theDriverObject->DriverUnload  = OnUnload;
   RtlInitUnicodeString(&dllName, L"\\Device\\HarddiskVolume1\\Windows\\System32\\ntdll.dll");
   functionAddress = GetDllFunctionAddress("ZwCreateProcessEx", &dllName);
   position = *((WORD*)(functionAddress+1));

   DbgPrint("Id:%d\n", position);
              
   return STATUS_SUCCESS;
}

上面的代码从驱动层加载NTDLL,再从输出表中找出函数地址,mov eax,[ID]对应的b8后面的字就是索引号,其实跟前一个代码作用是相似的,
只是驱动层没有LoadLibrary,只能这样解决了。将上面的代码整合起来就比较完善了,大家看着改吧。这里顺便把2003中的服务描述表发出来,希望对大家有帮助:


Service table address:0x80567980  Number of services:280=0x127
Index     Address    Parameters  Name                                      
-------------------------------------------------------------------------------------------------
0x0      0x8058ddce  6        NtAcceptConnectPort                     
0x1      0x80596b7e  8        NtAccessCheck                          
0x2      0x805976ce  b        NtAccessCheckAndAuditAlarm                  
0x3      0x805a8bb7  b        NtAccessCheckByType                     
0x4      0x8059968a  10       NtAccessCheckByTypeAndAuditAlarm              
0x5      0x80658705  b        NtAccessCheckByTypeResultList               
0x6      0x8065a9b2  10       NtAccessCheckByTypeResultListAndAuditAlarm      
0x7      0x8065a9f5  11       NtAccessCheckByTypeResultListAndAuditAlarmByHandle  
0x8      0x8059dc4f  3        NtAddAtom                             
0xb      0x806581e2  6        NtAdjustGroupsToken                     
0xc      0x80597836  6        NtAdjustPrivilegesToken                    
0xd      0x8065104b  2        NtAlertResumeThread                     
0xe      0x805971ea  1        NtAlertThread                          
0xf      0x805996cc  1        NtAllocateLocallyUniqueId                  
0x10      0x80647eb9  3        NtAllocateUserPhysicalPages                 
0x11      0x805a70dc  4        NtAllocateUuids                        
0x12      0x80583188  6        NtAllocateVirtualMemory                    
0x13      0x8058faff  2        NtApphelpCacheControl                     
0x14      0x805e92fb  2        NtAreMappedFilesTheSame                    
0x15      0x805aae6f  2        NtAssignProcessToJobObject                  
0x16      0x804ebbcc  3        NtCallbackReturn                        
0x18      0x805eb49d  2        NtCancelIoFile                          
0x19      0x804f7445  2        NtCancelTimer                          
0x1a      0x8058c43a  1        NtClearEvent                           
0x1b      0x805768ac  1        NtClose                              
0x1c      0x80596eea  3        NtCloseObjectAuditAlarm                    
0x1d      0x80626f6f  2        NtCompactKeys                          
0x1e      0x8065b8ff  3        NtCompareTokens                        
0x1f      0x8058dc82  1        NtCompleteConnectPort                     
0x20      0x806271d6  1        NtCompressKey                          
0x21      0x8058c55a  8        NtConnectPort                          
0x22      0x804eb14b  2        NtContinue                           
0x23      0x805b0b1e  4        NtCreateDebugObject                     
0x24      0x805aabaf  3        NtCreateDirectoryObject                    
0x25      0x80578522  5        NtCreateEvent                          
0x26      0x80668009  3        NtCreateEventPair                        
0x27      0x805790cb  b        NtCreateFile                           
0x28      0x8059f5ab  4        NtCreateIoCompletion                     
0x29      0x805e09eb  3        NtCreateJobObject                        
0x2a      0x80651805  3        NtCreateJobSet                          
0x2b      0x80592a39  7        NtCreateKey                           
0x2c      0x805f225d  8        NtCreateMailslotFile                     
0x2d      0x805863a1  4        NtCreateMutant                          
0x2e      0x8058f416  e        NtCreateNamedPipeFile                     
0x2f      0x805c8e1e  4        NtCreatePagingFile                       
0x30      0x805a32a4  5        NtCreatePort                           
0x31      0x805bd684  8        NtCreateProcess                        
0x32      0x8058efe3  9        NtCreateProcessEx                        
0x33      0x806685b7  9        NtCreateProfile                        
0x34      0x80573eca  7        NtCreateSection                        
0x35      0x8059afa9  5        NtCreateSemaphore                        
0x36      0x805ab548  4        NtCreateSymbolicLinkObject                  
0x37      0x80588254  8        NtCreateThread                          
0x38      0x805a2688  4        NtCreateTimer                          
0x39      0x805a62a4  d        NtCreateToken                          
0x3a      0x805bc212  5        NtCreateWaitablePort                     
0x3b      0x805b12c1  2        NtDebugActiveProcess                     
0x3c      0x805b17dc  3        NtDebugContinue                        
0x3d      0x80574c08  2        NtDelayExecution                        
0x3e      0x8059ab90  1        NtDeleteAtom                           
0x41      0x805b7979  1        NtDeleteFile                           
0x42      0x805eca87  1        NtDeleteKey                           
0x43      0x8065aa3a  3        NtDeleteObjectAuditAlarm                  
0x44      0x805a20d4  2        NtDeleteValueKey                        
0x45      0x80586f5e  a        NtDeviceIoControlFile                     
0x46      0x805c9f0b  1        NtDisplayString                        
0x47      0x8058051e  7        NtDuplicateObject                        
0x48      0x8059cc7c  6        NtDuplicateToken                        
0x4b      0x8059a085  6        NtEnumerateKey                          
0x4c      0x80667a42  3        NtEnumerateSystemEnvironmentValuesEx           
0x4d      0x8059d849  6        NtEnumerateValueKey                     
0x4e      0x805ac037  2        NtExtendSection                        
0x4f      0x805e41d5  6        NtFilterToken                          
0x50      0x8059e01a  3        NtFindAtom                           
0x51      0x805920a7  2        NtFlushBuffersFile                       
0x52      0x8058a8b5  3        NtFlushInstructionCache                    
0x53      0x805e715b  1        NtFlushKey                           
0x54      0x805a130d  4        NtFlushVirtualMemory                     
0x55      0x80648b20  0        NtFlushWriteBuffer                       
0x56      0x8064852a  3        NtFreeUserPhysicalPages                    
0x57      0x8057b2bf  4        NtFreeVirtualMemory                     
0x58      0x8057f504  a        NtFsControlFile                        
0x59      0x805e8674  2        NtGetContextThread                       
0x5a      0x8064de05  2        NtGetDevicePowerState                     
0x5b      0x805e8ccb  4        NtGetPlugPlayEvent                       
0x5c      0x80544ec4  7        NtGetWriteWatch                        
0x5d      0x805f12e2  1        NtImpersonateAnonymousToken                 
0x5e      0x80597fdf  2        NtImpersonateClientOfPort                  
0x5f      0x8059b9c8  3        NtImpersonateThread                     
0x60      0x805b77c8  1        NtInitializeRegistry                     
0x61      0x8064dc59  4        NtInitiatePowerAction                     
0x62      0x8058ec31  2        NtIsProcessInJob                        
0x63      0x8064ddf2  0        NtIsSystemResumeAutomatic                  
0x64      0x805bc19c  2        NtListenPort                           
0x65      0x805b9dfe  1        NtLoadDriver                           
0x66      0x805b2d8f  2        NtLoadKey                             
0x67      0x8062758c  3        NtLoadKey2                           
0x68      0x805b4a6c  4        NtLoadKeyEx                           
0x69      0x805a2342  a        NtLockFile                           
0x6a      0x805e4eaa  2        NtLockProductActivationKeys                 
0x6b      0x805de064  1        NtLockRegistryKey                        
0x6c      0x805e4a65  4        NtLockVirtualMemory                     
0x6d      0x805ab8ba  1        NtMakePermanentObject                     
0x6e      0x805abb05  1        NtMakeTemporaryObject                     
0x6f      0x80647392  3        NtMapUserPhysicalPages                    
0x70      0x80647859  3        NtMapUserPhysicalPagesScatter               
0x71      0x80589905  a        NtMapViewOfSection                       
0x74      0x805ef59d  9        NtNotifyChangeDirectoryFile                 
0x75      0x80599f1c  a        NtNotifyChangeKey                        
0x76      0x80599d2d  c        NtNotifyChangeMultipleKeys                  
0x77      0x8058ef66  3        NtOpenDirectoryObject                     
0x78      0x80599615  3        NtOpenEvent                           
0x79      0x806680f4  3        NtOpenEventPair                        
0x7a      0x8057909d  6        NtOpenFile                           
0x7b      0x80634e03  3        NtOpenIoCompletion                       
0x7c      0x805af8b0  3        NtOpenJobObject                        
0x7d      0x80578d88  3        NtOpenKey                             
0x7e      0x80586508  3        NtOpenMutant                           
0x7f      0x805ed885  c        NtOpenObjectAuditAlarm                    
0x80      0x80593613  4        NtOpenProcess                          
0x81      0x8057e110  3        NtOpenProcessToken                       
0x82      0x8057e816  4        NtOpenProcessTokenEx                     
0x83      0x8058a94b  3        NtOpenSection                          
0x84      0x805b3152  3        NtOpenSemaphore                        
0x85      0x8058ea10  3        NtOpenSymbolicLinkObject                  
0x86      0x805a2a8c  4        NtOpenThread                           
0x87      0x8057f976  4        NtOpenThreadToken                        
0x88      0x8057f8e5  5        NtOpenThreadTokenEx                     
0x89      0x805eb40f  3        NtOpenTimer                           
0x8a      0x805a24a2  3        NtPlugPlayControl                        
0x8b      0x805ae364  5        NtPowerInformation                       
0x8c      0x805a2c28  3        NtPrivilegeCheck                        
0x8d      0x805e48ce  6        NtPrivilegeObjectAuditAlarm                 
0x8e      0x805a7bf0  5        NtPrivilegedServiceAuditAlarm               
0x8f      0x80584a67  5        NtProtectVirtualMemory                    
0x90      0x8059f752  2        NtPulseEvent                           
0x91      0x80585755  2        NtQueryAttributesFile                     
0x94      0x80508c75  2        NtQueryDebugFilterState                    
0x95      0x8057ffd5  2        NtQueryDefaultLocale                     
0x96      0x80587c53  1        NtQueryDefaultUILanguage                  
0x97      0x8058731c  b        NtQueryDirectoryFile                     
0x98      0x80595d65  7        NtQueryDirectoryObject                    
0x9a      0x80635410  9        NtQueryEaFile                          
0x9b      0x805a2d89  5        NtQueryEvent                           
0x9c      0x8059b735  2        NtQueryFullAttributesFile                  
0x9d      0x805edffe  5        NtQueryInformationAtom                    
0x9e      0x805852cf  5        NtQueryInformationFile                    
0x9f      0x805af5ab  5        NtQueryInformationJobObject                 
0xa0      0x80644a66  5        NtQueryInformationPort                    
0xa1      0x8057fdea  5        NtQueryInformationProcess                  
0xa2      0x80576dc6  5        NtQueryInformationThread                  
0xa3      0x8057e718  5        NtQueryInformationToken                    
0xa4      0x8059d58c  1        NtQueryInstallUILanguage                  
0xa5      0x80668a4e  2        NtQueryIntervalProfile                    
0xa6      0x80634ebc  5        NtQueryIoCompletion                     
0xa7      0x80580c31  5        NtQueryKey                           
0xa8      0x80626765  6        NtQueryMultipleValueKey                    
0xa9      0x80668412  5        NtQueryMutant                          
0xaa      0x805f1cad  5        NtQueryObject                          
0xab      0x80626953  2        NtQueryOpenSubKeys                       
0xac      0x80626b89  4        NtQueryOpenSubKeysEx                     
0xad      0x8057f59e  2        NtQueryPerformanceCounter                  
0xae      0x80635c9d  9        NtQueryQuotaInformationFile                 
0xaf      0x8058679a  5        NtQuerySection                          
0xb0      0x805997e7  5        NtQuerySecurityObject                     
0xb1      0x80667325  5        NtQuerySemaphore                        
0xb2      0x8058e816  3        NtQuerySymbolicLinkObject                  
0xb3      0x80667a76  4        NtQuerySystemEnvironmentValue               
0xb5      0x8057cbe2  4        NtQuerySystemInformation                  
0xb6      0x80597e57  1        NtQuerySystemTime                        
0xb7      0x8058c677  5        NtQueryTimer                           
0xb8      0x8059e436  3        NtQueryTimerResolution                    
0xb9      0x80577d61  6        NtQueryValueKey                        
0xba      0x80582264  6        NtQueryVirtualMemory                     
0xbb      0x8057960d  5        NtQueryVolumeInformationFile               
0xbc      0x8058c78e  5        NtQueueApcThread                        
0xbd      0x804eb198  3        NtRaiseException                        
0xbe      0x80667075  6        NtRaiseHardError                        
0xbf      0x8057d886  9        NtReadFile                           
0xc0      0x805aeb82  9        NtReadFileScatter                        
0xc1      0x8059859d  6        NtReadRequestData                        
0xc2      0x805861e0  5        NtReadVirtualMemory                     
0xc3      0x80588402  1        NtRegisterThreadTerminatePort               
0xc4      0x80574b77  2        NtReleaseMutant                        
0xc5      0x80598eb5  3        NtReleaseSemaphore                       
0xc6      0x80577945  5        NtRemoveIoCompletion                     
0xc7      0x8066e462  2        NtRemoveProcessDebug                     
0xc8      0x80626dec  2        NtRenameKey                           
0xc9      0x8062748f  3        NtReplaceKey                           
0xca      0x80580e50  2        NtReplyPort                           
0xcb      0x8057b2a0  4        NtReplyWaitReceivePort                    
0xcc      0x8057adb0  5        NtReplyWaitReceivePortEx                  
0xcd      0x80644b39  2        NtReplyWaitReplyPort                     
0xce      0x80667a4f  1        NtModifyDriverEntry                     
0xcf      0x805985f2  2        NtRequestPort                          
0xd0      0x8058cbc3  3        NtRequestWaitReplyPort                    
0xd1      0x8064dc04  1        NtRequestWakeupLatency                    
0xd2      0x805a4751  2        NtResetEvent                           
0xd3      0x8054543e  3        NtResetWriteWatch                        
0xd4      0x80627286  3        NtRestoreKey                           
0xd5      0x80650ff5  1        NtResumeProcess                        
0xd6      0x805806fa  2        NtResumeThread                          
0xd7      0x80627325  2        NtSaveKey                             
0xd8      0x806273b2  3        NtSaveKeyEx                           
0xd9      0x80625f0d  3        NtSaveMergedKeys                        
0xda      0x8058d4b2  9        NtSecureConnectPort                     
0xdd      0x805b16f1  2        NtSetContextThread                       
0xde      0x8066e4f1  3        NtSetDebugFilterState                     
0xdf      0x805ca1ac  1        NtSetDefaultHardErrorPort                  
0xe0      0x805b748b  2        NtSetDefaultLocale                       
0xe1      0x805b7433  1        NtSetDefaultUILanguage                    
0xe2      0x80667a5c  2        NtSetBootEntryOrder                     
0xe3      0x8063594e  4        NtSetEaFile                           
0xe4      0x8057abd7  2        NtSetEvent                           
0xe5      0x80575690  1        NtSetEventBoostPriority                    
0xe6      0x806683b0  1        NtSetHighEventPair                       
0xe7      0x806682e6  1        NtSetHighWaitLowEventPair                  
0xe8      0x8066e255  5        NtSetInformationDebugObject                 
0xe9      0x80578747  5        NtSetInformationFile                     
0xea      0x805e0b5f  4        NtSetInformationJobObject                  
0xeb      0x80626400  4        NtSetInformationKey                     
0xec      0x8059223e  4        NtSetInformationObject                    
0xed      0x80580221  4        NtSetInformationProcess                    
0xee      0x80577629  4        NtSetInformationThread                    
0xef      0x805a6844  4        NtSetInformationToken                     
0xf0      0x806685a0  2        NtSetIntervalProfile                     
0xf1      0x8057c39a  5        NtSetIoCompletion                        
0xf2      0x806508db  6        NtSetLdtEntries                        
0xf3      0x8066834f  1        NtSetLowEventPair                        
0xf4      0x8066827d  1        NtSetLowWaitHighEventPair                  
0xf5      0x80635c7e  4        NtSetQuotaInformationFile                  
0xf6      0x805a5626  3        NtSetSecurityObject                     
0xf7      0x80667d39  2        NtSetSystemEnvironmentValue                 
0xf8      0x80667a35  5        NtSetSystemEnvironmentValueEx               
0xf9      0x80597238  3        NtSetSystemInformation                    
0xfa      0x8067b325  3        NtSetSystemPowerState                     
0xfb      0x8066697b  2        NtSetSystemTime                        
0xfc      0x805abc19  2        NtSetThreadExecutionState                  
0xfd      0x804ee9bf  7        NtSetTimer                           
0xfe      0x805acb3b  3        NtSetTimerResolution                     
0xff      0x805bc73c  1        NtSetUuidSeed                          
0x100     0x80592859  6        NtSetValueKey                          
0x101     0x806361ed  5        NtSetVolumeInformationFile                  
0x102     0x8066614b  1        NtShutdownSystem                        
0x103     0x80546d9e  4        NtSignalAndWaitForSingleObject               
0x104     0x806687ec  1        NtStartProfile                          
0x105     0x80668999  1        NtStopProfile                          
0x106     0x80650fa0  1        NtSuspendProcess                        
0x107     0x805b0163  2        NtSuspendThread                        
0x108     0x80668af2  6        NtSystemDebugControl                     
0x109     0x80651a9b  2        NtTerminateJobObject                     
0x10a     0x80590cba  2        NtTerminateProcess                       
0x10b     0x80576714  2        NtTerminateThread                        
0x10c     0x8057e4f8  0        NtTestAlert                           
0x10d     0x8051ed5e  4        NtTraceEvent                           
0x10e     0x80667a69  4        NtTranslateFilePath                     
0x10f     0x806383c5  1        NtUnloadDriver                          
0x110     0x8062747c  1        NtUnloadKey                           
0x111     0x80625fc6  2        NtUnloadKey2                           
0x112     0x806261cb  2        NtUnloadKeyEx                          
0x113     0x805a220b  5        NtUnlockFile                           
0x114     0x805ae977  4        NtUnlockVirtualMemory                     
0x115     0x80589e79  2        NtUnmapViewOfSection                     
0x116     0x805c5aa2  2        NtVdmControl                           
0x117     0x805b07c8  4        NtWaitForDebugEvent                     
0x118     0x80574d38  5        NtWaitForMultipleObjects                  
0x119     0x8057428d  3        NtWaitForSingleObject                     
0x11a     0x8066821c  1        NtWaitHighEventPair                     
0x11b     0x806681bb  1        NtWaitLowEventPair                       
0x11c     0x80578248  9        NtWriteFile                           
0x11d     0x805aefe1  9        NtWriteFileGather                        
0x11e     0x805990a6  6        NtWriteRequestData                       
0x11f     0x805862d7  5        NtWriteVirtualMemory                     
0x120     0x805091c1  0        NtYieldExecution                        
0x121     0x805d7d7f  4        NtCreateKeyedEvent                       
0x122     0x8058f5cf  3        NtOpenKeyedEvent                        
0x123     0x8066922f  4        NtReleaseKeyedEvent                     
0x124     0x806694aa  4        NtWaitForKeyedEvent                     
0x125     0x8064f170  0        NtQueryPortInformationProcess               
0x126     0x8064f1a4  0        NtGetCurrentProcessorNumber   

参考资料:
1.MSDN系列(3)--Administrator用户直接获取SYSTEM权限  scz
   [url]http://www.nsfocus.net/index.php?act=magazine&do=view&mid=1900[/url]

2.hooking functions not exported by ntoskrnl
   [url]http://www.rootkit.com/newsread.php?newsid=151[/url]

3.Simple Hooking of Functions not Exported by Ntoskrnl.exe
   [url]http://www.rootkit.com/newsread.php?newsid=248[/url]

页: [1]
© 1999-2008 EvilOctal Security Team