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

來源:互聯網
上載者:User

標籤:pre   ant   date   als   lca   debug   自己的   global   set   

首先介紹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]=01eax=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進程環境塊結構

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.