fs

来源:互联网 发布:多益网络账号游戏绑定 编辑:程序博客网 时间:2024/04/28 20:25
FS寄存器指向当前活动线程的TEB结构(线程结构) 
偏移  说明 
000  指向SEH链指针 
004  线程堆栈顶部 
008  线程堆栈底部 
00C  SubSystemTib 
010  FiberData 
014  ArbitraryUserPointer 
018  FS段寄存器在内存中的镜像地址 
020  进程PID 
024  线程ID 
02C  指向线程局部存储指针 
030  PEB结构地址(进程结构) 
034  上个错误号 
 
 
得到KERNEL32.DLL基址的方法 
assume fs:nothing            ;打开FS寄存器 
mov eax,fs:[30h]            ;得到PEB结构地址 
mov eax,[eax + 0ch]        ;得到PEB_LDR_DATA结构地址 
mov esi,[eax + 1ch]        ;InInitializationOrderModuleList 
lodsd                      ;得到KERNEL32.DLL所在LDR_MODULE结构的InInitializationOrderModuleList地址 

mov edx,[eax + 8h]        ;得到BaseAddress,既Kernel32.dll基址  


SEH异常在汇编中实现,据我的理解是这样的

push ********                                              //将需要返回的地址压入堆栈

mov eax,dword ptr fs:[0]                            //fs:[0]是指向堆栈里面的SEH 那么这句的意思就是将堆栈SEH地址传送到寄存器EAX.

push eax                                                    //fs[0]压入堆栈,

mov dword ptr fs:[0],esp                              //构造一个ERR结构,这句完成后,堆栈里面最上方就有一个SEH记录了

上面的就是SEH结构,下面的就是让程序产生异常.

产生异常最白的理解方法就是让程序出错,不是跳到其他垃圾地方,而是让语句出错

例如div 0 也就是除以0 大家都知道0是不能被除的```所以程序就出错了```


原创粉丝点击