欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]浅谈FS ~_TEB _PEB

[原创]浅谈FS ~_TEB _PEB

工具虚拟机+windbg
环境:Xp

FS指向当前TEB,那什么是TEB呢? 虽然在ddk中有结构,但我们不知道他的大小,不知道大小也就不知道偏移量。
1.打开我们熟悉的windbg 输入dt _teb来简单探索

kd> dt _teb

nt!_TEB

   +0x000 NtTib            : _NT_TIB

   +0x01c EnvironmentPointer : Ptr32 Void

   +0x020 ClientId         : _CLIENT_ID  :1.可以得到当前进程的ID,我们应该这样子得到呢?

   +0x028 ActiveRpcHandle  : Ptr32 Void

   +0x02c ThreadLocalStoragePointer : Ptr32 Void

   +0x030 ProcessEnvironmentBlock : Ptr32 _PEB 2.我们想访问PEB得到ImageBaseAddress 应该怎么做呢?

   +0x034 LastErrorValue   : Uint4B

   +0x038 CountOfOwnedCriticalSections : Uint4B

   +0x03c CsrClientThread  : Ptr32 Void

   +0x040 Win32ThreadInfo  : Ptr32 Void

   +0x044 User32Reserved   : [26] Uint4B

   +0x0ac UserReserved     : [5] Uint4B

   +0x0c0 WOW32Reserved    : Ptr32 Void

   +0x0c4 CurrentLocale    : Uint4B

   +0x0c8 FpSoftwareStatusRegister : Uint4B

   +0x0cc SystemReserved1  : [54] Ptr32 Void

   +0x1a4 ExceptionCode    : Int4B

   +0x1a8 ActivationContextStack : _ACTIVATION_CONTEXT_STACK

   +0x1bc SpareBytes1      : [24] UChar

   +0x1d4 GdiTebBatch      : _GDI_TEB_BATCH

   +0x6b4 RealClientId     : _CLIENT_ID

   +0x6bc GdiCachedProcessHandle : Ptr32 Void

   +0x6c0 GdiClientPID     : Uint4B

   +0x6c4 GdiClientTID     : Uint4B

   +0x6c8 GdiThreadLocalInfo : Ptr32 Void

   +0x6cc Win32ClientInfo  : [62] Uint4B

   +0x7c4 glDispatchTable  : [233] Ptr32 Void

   +0xb68 glReserved1      : [29] Uint4B

   +0xbdc glReserved2      : Ptr32 Void

   +0xbe0 glSectionInfo    : Ptr32 Void

   +0xbe4 glSection        : Ptr32 Void

   +0xbe8 glTable          : Ptr32 Void

   +0xbec glCurrentRC      : Ptr32 Void

   +0xbf0 glContext        : Ptr32 Void

   +0xbf4 LastStatusValue  : Uint4B

   +0xbf8 StaticUnicodeString : _UNICODE_STRING

   +0xc00 StaticUnicodeBuffer : [261] Uint2B

   +0xe0c DeallocationStack : Ptr32 Void

   +0xe10 TlsSlots         : [64] Ptr32 Void

   +0xf10 TlsLinks         : _LIST_ENTRY

   +0xf18 Vdm              : Ptr32 Void

   +0xf1c ReservedForNtRpc : Ptr32 Void

   +0xf20 DbgSsReserved    : [2] Ptr32 Void

   +0xf28 HardErrorsAreDisabled : Uint4B

   +0xf2c Instrumentation  : [16] Ptr32 Void

   +0xf6c WinSockData      : Ptr32 Void

   +0xf70 GdiBatchCount    : Uint4B

   +0xf74 InDbgPrint       : UChar

   +0xf75 FreeStackOnTermination : UChar

   +0xf76 HasFiberData     : UChar

   +0xf77 IdealProcessor   : UChar

   +0xf78 Spare3           : Uint4B

   +0xf7c ReservedForPerf  : Ptr32 Void

   +0xf80 ReservedForOle   : Ptr32 Void

   +0xf84 WaitingOnLoaderLock : Uint4B

   +0xf88 Wx86Thread       : _Wx86ThreadState

   +0xf94 TlsExpansionSlots : Ptr32 Ptr32 Void

   +0xf98 ImpersonationLocale : Uint4B

   +0xf9c IsImpersonating  : Uint4B

   +0xfa0 NlsCache         : Ptr32 Void

   +0xfa4 pShimData        : Ptr32 Void

   +0xfa8 HeapVirtualAffinity : Uint4B

   +0xfac CurrentTransactionHandle : Ptr32 Void

   +0xfb0 ActiveFrame      : Ptr32 _TEB_ACTIVE_FRAME

   +0xfb4 SafeThunkCall    : UChar

   +0xfb5 BooleanSpare     : [3] UChar


针对第一个问题:我们可以用asm直接访问FS来得到的地址
代码如下
mov eax,fs:[20h];

mov id,eax;

意思如下得到fs+20处的地址并取出数据,放在eax中,吧eax赋值给id。
4个数据寄存器32/16位(EAX,AX、EBX,BX、ECX,CX和EDX,DX)
2.同样在windbg中输入dt _peb 得到下面信息
kd> dt _peb

nt!_PEB

   +0x000 InheritedAddressSpace : UChar

   +0x001 ReadImageFileExecOptions : UChar

   +0x002 BeingDebugged    : UChar

   +0x003 SpareBool        : UChar

   +0x004 Mutant           : Ptr32 Void

   +0x008 ImageBaseAddress : Ptr32 Void 我们今天要做的~~

   +0x00c Ldr              : Ptr32 _PEB_LDR_DATA

   +0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS

   +0x014 SubSystemData    : Ptr32 Void

   +0x018 ProcessHeap      : Ptr32 Void

   +0x01c FastPebLock      : Ptr32 _RTL_CRITICAL_SECTION

   +0x020 FastPebLockRoutine : Ptr32 Void

   +0x024 FastPebUnlockRoutine : Ptr32 Void

   +0x028 EnvironmentUpdateCount : Uint4B

   +0x02c KernelCallbackTable : Ptr32 Void

   +0x030 SystemReserved   : [1] Uint4B

   +0x034 AtlThunkSListPtr32 : Uint4B

   +0x038 FreeList         : Ptr32 _PEB_FREE_BLOCK

   +0x03c TlsExpansionCounter : Uint4B

   +0x040 TlsBitmap        : Ptr32 Void

   +0x044 TlsBitmapBits    : [2] Uint4B

   +0x04c ReadOnlySharedMemoryBase : Ptr32 Void

   +0x050 ReadOnlySharedMemoryHeap : Ptr32 Void

   +0x054 ReadOnlyStaticServerData : Ptr32 Ptr32 Void

   +0x058 AnsiCodePageData : Ptr32 Void

   +0x05c OemCodePageData  : Ptr32 Void

   +0x060 UnicodeCaseTableData : Ptr32 Void

   +0x064 NumberOfProcessors : Uint4B

   +0x068 NtGlobalFlag     : Uint4B

   +0x070 CriticalSectionTimeout : _LARGE_INTEGER

   +0x078 HeapSegmentReserve : Uint4B

   +0x07c HeapSegmentCommit : Uint4B

   +0x080 HeapDeCommitTotalFreeThreshold : Uint4B

   +0x084 HeapDeCommitFreeBlockThreshold : Uint4B

   +0x088 NumberOfHeaps    : Uint4B

   +0x08c MaximumNumberOfHeaps : Uint4B

   +0x090 ProcessHeaps     : Ptr32 Ptr32 Void

   +0x094 GdiSharedHandleTable : Ptr32 Void

   +0x098 ProcessStarterHelper : Ptr32 Void

   +0x09c GdiDCAttributeList : Uint4B

   +0x0a0 LoaderLock       : Ptr32 Void

   +0x0a4 OSMajorVersion   : Uint4B

   +0x0a8 OSMinorVersion   : Uint4B

   +0x0ac OSBuildNumber    : Uint2B

   +0x0ae OSCSDVersion     : Uint2B

   +0x0b0 OSPlatformId     : Uint4B

   +0x0b4 ImageSubsystem   : Uint4B

   +0x0b8 ImageSubsystemMajorVersion : Uint4B

   +0x0bc ImageSubsystemMinorVersion : Uint4B

   +0x0c0 ImageProcessAffinityMask : Uint4B

   +0x0c4 GdiHandleBuffer  : [34] Uint4B

   +0x14c PostProcessInitRoutine : Ptr32     void 

   +0x150 TlsExpansionBitmap : Ptr32 Void

   +0x154 TlsExpansionBitmapBits : [32] Uint4B

   +0x1d4 SessionId        : Uint4B

   +0x1d8 AppCompatFlags   : _ULARGE_INTEGER

   +0x1e0 AppCompatFlagsUser : _ULARGE_INTEGER

   +0x1e8 pShimData        : Ptr32 Void

   +0x1ec AppCompatInfo    : Ptr32 Void

   +0x1f0 CSDVersion       : _UNICODE_STRING

   +0x1f8 ActivationContextData : Ptr32 Void

   +0x1fc ProcessAssemblyStorageMap : Ptr32 Void

   +0x200 SystemDefaultActivationContextData : Ptr32 Void

   +0x204 SystemAssemblyStorageMap : Ptr32 Void

   +0x208 MinimumStackCommit : Uint4B


代码如下:
_asm

{

	mov eax,fs:[30h];

	mov ebx,[eax+08h];

	mov ImageBaseAddres,ebx;

}

printf("ImageBaseAddress:0x%x\n",PEB);

解释 PEB位于 TEB偏移的30处, 得到地址后给了eax ,eax+30就是PEB的指针,我们要指针里面的数据,而[eax+08h]是读出指针地址里面的内容在给ImageBaseAddres 。
具体看代码。
动手马上就懂~
。也就是,这个结构里面有的内容我们都可以去拿,那windbg得到结构,通过结构得到各种数据。
asm是个好东西,他能打打提高代码的效率~~
没什么技术含量,大牛请飘过。
群:121157016 欢迎你的加入~
提提问题, 内核,病毒分析,网络。

代码:
#include <stdio.h>
#include <string.h>
int main (viod)
{
        int a=100;
        int (*aaa)(int);
        int PEB;
        int i;
_asm
{
        mov eax, fs:[0x30];
    mov PEB,eax;
}
printf("当前PEB地址:0x%x\n", PEB);
_asm
{
        mov eax, fs:[0x20];
        mov PEB,eax;
       
      
}
printf("当前进程ID:0x%x\n", PEB);
printf("当前ID指针地址:0x%x\n",&PEB);
_asm
{
        mov eax,fs:[30h];
    mov ebx,[eax+02h];
        mov PEB,ebx;
}
printf("当前系统调试:0x%x\n",PEB);
printf("当前系统调试:%d\n",PEB);
_asm
{
        mov eax,fs:[30h];
        mov ebx,[eax+08h];
        mov PEB,ebx;
}
printf("ImageBaseAddress:0x%x\n",PEB);
getchar();
return 0;
}

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功