码迷,mamicode.com
首页 > Windows程序 > 详细

通过IsDebuggerPesent解说windows PEB进程环境块结构

时间:2017-07-26 17:42:29      阅读:158      评论:0      收藏:0      [点我收藏+]

标签: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]=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进程环境块结构

标签:pre   ant   date   als   lca   debug   自己的   global   set   

原文地址:http://www.cnblogs.com/jzdwajue/p/7240005.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!