1. 程式人生 > >通過IsDebuggerPesent解說windows PEB進程環境塊結構

通過IsDebuggerPesent解說windows PEB進程環境塊結構

location fhe threshold cpp flag alloc session mage mut

首先介紹PEB和TEB概念:
PEB(Process Environment Block。進程環境塊)存放進程信息。每一個進程都有自己的PEB信息。位於用戶地址空間。


TEB(Thread Environment Block。線程環境塊)系統在此TEB中保存頻繁使用的線程相關的數據。位於用戶地址空間。在比 PEB 所在地址低的地方。

進程中的每一個線程都有自己的一個TEB。


寫一個使用IsDebuggerPesent函數的windows程序。用OD打開,斷點IsDebuggerPesent函數

OD進入IsDebuggerPesent函數內部

74E23789 >  64:A1 18000000   mov     eax, dword ptr fs:[18]
74E2378F    8B40 30          mov     eax, dword ptr [eax+30]
74E23792    0FB640 02        movzx   eax, byte ptr [eax+2]
74E23796    C3               retn

跟蹤到第3步

74E23792    0FB640 02        movzx   eax, byte ptr [eax+2]


查看窗體能夠看到

ds:[7EFDE002]=01
eax=7EFDE000

數據窗體跟蹤ds:[7EFDE002]能夠看到

7EFDE002  01                                               

由於我們用OD打開,所以檢測到處於調試狀態,7EFDE002地址中值就是01,假設沒有被調試的話,就是00。(假設自己改動這個值的話,就能夠過IsDebuggerPesent的檢測)

7EFDE002地址中01就是內存中IsDebuggerPesent進行推斷的標誌位

在csdn的中這個朋友blog的這篇文章我們能夠看到http://blog.csdn.net/waveradio/article/details/2681346

//struct _PEB結構:
typedef struct _PEB { // Size: 0x1D8
/*000*/ UCHAR InheritedAddressSpace;
/*001*/ UCHAR ReadImageFileExecOptions;
/*002*/ UCHAR BeingDebugged;
/*003*/ UCHAR SpareBool; // Allocation size
/*004*/ HANDLE Mutant;
/*008*/ HINSTANCE ImageBaseAddress; // Instance
/*00C*/ VOID *DllList;
/*010*/ PPROCESS_PARAMETERS *ProcessParameters;
/*014*/ ULONG SubSystemData;
/*018*/ HANDLE DefaultHeap;
/*01C*/ KSPIN_LOCK FastPebLock;
/*020*/ ULONG FastPebLockRoutine;
/*024*/ ULONG FastPebUnlockRoutine;
/*028*/ ULONG EnvironmentUpdateCount;
/*02C*/ ULONG KernelCallbackTable;
/*030*/ LARGE_INTEGER SystemReserved;
/*038*/ ULONG FreeList;
/*03C*/ ULONG TlsExpansionCounter;
/*040*/ ULONG TlsBitmap;
/*044*/ LARGE_INTEGER TlsBitmapBits;
/*04C*/ ULONG ReadOnlySharedMemoryBase;
/*050*/ ULONG ReadOnlySharedMemoryHeap;
/*054*/ ULONG ReadOnlyStaticServerData;
/*058*/ ULONG AnsiCodePageData;
/*05C*/ ULONG OemCodePageData;
/*060*/ ULONG UnicodeCaseTableData;
/*064*/ ULONG NumberOfProcessors;
/*068*/ LARGE_INTEGER NtGlobalFlag; // Address of a local copy
/*070*/ LARGE_INTEGER CriticalSectionTimeout;
/*078*/ ULONG HeapSegmentReserve;
/*07C*/ ULONG HeapSegmentCommit;
/*080*/ ULONG HeapDeCommitTotalFreeThreshold;
/*084*/ ULONG HeapDeCommitFreeBlockThreshold;
/*088*/ ULONG NumberOfHeaps;
/*08C*/ ULONG MaximumNumberOfHeaps;
/*090*/ ULONG ProcessHeaps;
/*094*/ ULONG GdiSharedHandleTable;
/*098*/ ULONG ProcessStarterHelper;
/*09C*/ ULONG GdiDCAttributeList;
/*0A0*/ KSPIN_LOCK LoaderLock;
/*0A4*/ ULONG OSMajorVersion;
/*0A8*/ ULONG OSMinorVersion;
/*0AC*/ USHORT OSBuildNumber;
/*0AE*/ USHORT OSCSDVersion;
/*0B0*/ ULONG OSPlatformId;
/*0B4*/ ULONG ImageSubsystem;
/*0B8*/ ULONG ImageSubsystemMajorVersion;
/*0BC*/ ULONG ImageSubsystemMinorVersion;
/*0C0*/ ULONG ImageProcessAffinityMask;
/*0C4*/ ULONG GdiHandleBuffer[0x22];
/*14C*/ ULONG PostProcessInitRoutine;
/*150*/ ULONG TlsExpansionBitmap;
/*154*/ UCHAR TlsExpansionBitmapBits[0x80];
/*1D4*/ ULONG SessionId;
} PEB, *PPEB;


7EFDE002地址相應的是PEB結構的

/*002*/ UCHAR BeingDebugged;

所以PEB的起始地址就是7EFDE002地址減去2.得到7EFDE000就是PEB的起始地址

還能夠判斷出NtGlobalFlag的地址就是

/*068*/ LARGE_INTEGER NtGlobalFlag; // Address of a local copy
7EFDE068 為NtGlobalFlag的地址

數據窗體尾隨得到

7EFDE068  70                                               p
由於我們在用OD調試所以7EFDE068 地址中的值為70,改動就能夠過檢測



通過IsDebuggerPesent解說windows PEB進程環境塊結構