IsDebuggerPesentによるwindows PEBプロセス環境ブロック構造の解説

3602 ワード

まずPEBとTEBの概念を紹介します.
PEB(プロセス環境ブロック)は、プロセス情報を格納する.各プロセスには独自の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:[7 EFDE 002]が表示される
7EFDE002  01                                               
ODで開くのでデバッグ状態であることが検出され,7 EFDE 002アドレスの中値は01であり,デバッグされていないと仮定すると00である.(自分でこの値を変更すればIsDebuggerPesentの検出が可能)
7 EFDE 002アドレス中の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;
7 EFDE 002アドレス対応はPEB構造
/*002*/ UCHAR BeingDebugged;
したがってPEBの先頭アドレスは7 EFDE 002アドレスから2を引く.7 EFDE 000を得ることがPEBの先頭アドレスである
NtGlobalFlagのアドレスが
/*068*/ LARGE_INTEGER NtGlobalFlag; // Address of a local copy
7 EFDE 068はNtGlobalFlagのアドレス
データ・フォームの末尾
7EFDE068  70                                               p
ODでデバッグしているので7 EFDE 068アドレスの値は70で、変更すればオーバー検出できます
転載先:https://www.cnblogs.com/jzdwajue/p/7240005.html