fs

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是不能被除的```所以程序就出错了```


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值