Quantcast
Channel: 看雪安全论坛
Viewing all articles
Browse latest Browse all 9556

【原创】浅谈FS ~_TEB _PEB

$
0
0
工具虚拟机+windbg
环境:Xp
:3:
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 。
具体看代码。
动手马上就懂~
。:D::D:也就是,这个结构里面有的内容我们都可以去拿,那windbg得到结构,通过结构得到各种数据。
asm是个好东西,他能打打提高代码的效率~~
:p:没什么技术含量,大牛请飘过。
群:121157016 欢迎你的加入~:3:
提提问题, 内核,病毒分析,网络。

代码:
#include [COLOR="rgb(255, 0, 255)"]<stdio.h>[/COLOR]
#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("[COLOR="rgb(255, 0, 255)"]当前ID指针地址:0x%x\n[/COLOR]",&PEB);
_asm
{
mov eax,fs:[30h];
mov ebx,[eax+02h];
mov PEB,ebx;


}
printf("当前系统调试:0x%x\n",PEB);
printf("[COLOR="rgb(255, 0, 255)"]当前系统调试:%d\n[/COLOR]",PEB);
_asm
{
mov eax,fs:[30h];
mov ebx,[eax+08h];
mov PEB,ebx;
}
printf("ImageBaseAddress:0x%x\n",PEB);




getchar();

return 0;
}

Viewing all articles
Browse latest Browse all 9556

Latest Images

Trending Articles

<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>