首页
社区
课程
招聘
[原创]windows异常学习心得2
发表于: 2016-7-8 16:11 5002

[原创]windows异常学习心得2

2016-7-8 16:11
5002
[工具]:od
异常处理方式分两种:
第一种:筛选器处理方式,缺点:单一,无论什么出现异常都调用它,设置新的旧的覆盖
第二种:线程处理异常普遍使用这种,可以便于封装子程序
线程处理异常:
     每个线程对应一个TEB(W9x系列称为TIB)结构,刚好异常处理EXCEPTION_REGISTRATION结构指针ExceptionList,正好是TEB结构第一个字段FS:[0]所指向的数据,即TEB总是由FS:[0]指向的
nt!_TEB
TEB at      fs:7FFDF000

   +0x000   NtTib                       // _NT_TIB                   ;就是这个其他别管
   +0x01c   EnvironmentPointer          // Ptr32 Void
   +0x020   ClientId                    // _CLIENT_ID
   +0x028   ActiveRpcHandle             // Ptr32 Void
   +0x02c   ThreadLocalStoragePointer   // Ptr32 Void
   +0x030   ProcessEnvironmentBlock     // Ptr32 _PEB  
随便用OD打开在命令栏输入dd 7FFDF000第一个就是跟随进去就看得到EXCEPTION_REGISTRATION结构
EXCEPTION_REGISTRATION struc
{
        Prev             dd ;      //前一个_EXCEPTION_REGISTRATION结构
        handler        dd ;     //异常处理过程地址,你可以在这里做文章,发生异常跳到你想跳到的程序入口
EXCEPTION_REGISTRATION ends
;----------------------------------------------------------------
7FFDF000  0012FFC4  (指向 SEH 链指针)跟随进去就看得见了
7FFDF004  00130000  (线程堆栈顶部)
7FFDF008  0012E000  (线程堆栈底部)
7FFDF00C  00000000
7FFDF010  00001E00
7FFDF014  00000000
;----------------------------------------------------------------
0012FFC4  FFFFFFFF  SEH 链尾部         ; Prev             dd ;      //前一个_EXCEPTION_REGISTRATION结构
0012FFC8  775BE16D  SE处理程序       ;handler        dd ;     //异常处理过程地址
0012FFCC  000AC333
0012FFD0  00000000

下面是一个例子:

;
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;学习:SEH处理异常代码
;编译:ml /c /coff seh.asm
;链接:link /subsystem:windows seh.ojb
;EXCEPTION_REGISTRATION=err结构简称
;大致思路:
;注册回调函数
;引发异常,从用户领空到系统领空
;跳转到handler
;恢复fs:[0]
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                .386
                .model        flat,stdcall
                option        casemap:none
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;头文件
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
include                windows.inc
include                user32.inc
include                kernel32.inc
includelib        kernel32.lib
includelib        user32.lib
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;数据段
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                .const
szCapiton                db                'SEH处理异常例子',0
szSEHText                db            '安全位置',0
sztText                  db                '绝对不会执行',0
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;代码段
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                .code
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;在堆栈中创建SEH链表
;传统的SEH的框架我想我就不多说了。
;  如下:
;  push    SEH_Handler
;  push    dword ptr fs:[0]
;  mov  [fs:0], esp
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
start:
                assume        fs:nothing               ;masm默认将FS:[0]段寄存器定义为error,使用先用assume来启用
                push        offset _SafePlace              ;handler   //异常处理过程地址学习病毒经常用的,靠你发挥了
                push        fs:[0]                               ; Prev      //原来的ERR结构保存
                mov                fs:[0],esp                ;创建自己的err结构,esp=原来err结构,用完再pop fs:[0]回去就恢复就可以了
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;发生异常代码
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                xor                eax,eax
                mov                word ptr [eax],0     ;访问内存异常用户领空调到系统领空
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;以下代码不会被执行
                invoke        MessageBox,NULL,offset sztText,offset szCapiton,MB_OK
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
_SafePlace:
                invoke        MessageBox,0,offset szSEHText,offset szCapiton,MB_OK
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;恢复原来FS:[0]
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                pop                fs:[0]
                pop                eax
                invoke        ExitProcess,NULL       
end                start
编辑链接OD打开记得设置异常非法内存访问勾掉(建议大家用老古董OD方便试)

没写完明天接着写,怎么设置取消观看啊.
这就尴尬了

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 61782
活跃值: (21986)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2

   

   


没写完明天接着写,怎么设置取消观看啊.
这就尴尬了 

取消观看没有的。你可以编辑帖子的内容补充完成。

   

   

2017-4-17 18:45
0
游客
登录 | 注册 方可回帖
返回