通过IsDebuggerPesent解说windows PEB进程环境块结构
Posted jzdwajue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过IsDebuggerPesent解说windows PEB进程环境块结构相关的知识,希望对你有一定的参考价值。
首先介绍PEB和TEB概念:
PEB(Process Environment Block。进程环境块)存放进程信息。每一个进程都有自己的PEB信息。位于用户地址空间。
跟踪到第3步
数据窗体跟踪ds:[7EFDE002]能够看到
所以PEB的起始地址就是7EFDE002地址减去2.得到7EFDE000就是PEB的起始地址
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 copy7EFDE068 为NtGlobalFlag的地址
数据窗体尾随得到
7EFDE068 70 p由于我们在用OD调试所以7EFDE068 地址中的值为70,改动就能够过检測
以上是关于通过IsDebuggerPesent解说windows PEB进程环境块结构的主要内容,如果未能解决你的问题,请参考以下文章