浅谈FS ~_TEB _PEB
来源:互联网 发布:竞争对手数据分类 编辑:程序博客网 时间:2024/06/07 21:57
浅谈FS ~_TEB _PEB
FS指向当前TEB,那什么是TEB呢? 虽然在ddk中有结构,但我们不知道他的大小,不知道大小也就不知道偏移量。
1.打开我们熟悉的windbg 输入dt _teb来简单探索
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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来得到的地址
代码如下
1
2
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 得到下面信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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
代码如下:
1
2
3
4
5
6
7
_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;
}
24
收藏
阅读全文
0 0
- 浅谈FS ~_TEB _PEB
- FS
- fs
- fs
- fs
- fs
- fs
- fs
- FS
- 浅谈FS段寄存器在用户层和内核层的使用
- FS-V1、FS-M1、FS-M2、FS-T1、FS-T2
- fs寄存器
- FS寄存器
- FS寄存器
- fs:[124]
- FS寄存器
- FS Register
- fs shell
- Dr.COM宽带认证客户端网络环境使用路由器上网
- 欧拉函数模板
- java 常用集合list与Set、Map区别及适用场景总结
- 已解决java.lang.NumberFormatException: For input string: "7006@17006"
- listview嵌套gradview,图片显示不完整,偶尔显示,偶尔不显示
- 浅谈FS ~_TEB _PEB
- Java中Volatile关键字详解
- git pull命令
- 开启博客之旅
- 关于MYSQL的轮询与监控一点点小心得
- Elasticsearch之数据如何在集群中分布和获取。
- 第4篇 堆排序
- Windows服务框架与服务的编写
- 剑指offer——数组名与指针的区别