首页
社区
课程
招聘
[原创][开源]巧妙利用SEH异常链AntiDebug及Od反AntiDebug
发表于: 2015-11-27 21:25 18351

[原创][开源]巧妙利用SEH异常链AntiDebug及Od反AntiDebug

2015-11-27 21:25
18351

工具:VS2012  OD

直接进入正题吧:
简单介绍下基础知识,根据三个(结构体):

[*]TEB结构---线程信息块
[*]SEH结构---结构化异常处理
[*]PEB结构---枚举用户模块列表

把思路扩展开。

FS段寄存器指向当前的TEB结构:

[*]   在TEB偏移0x00处指向SEH链指针
[*]  在TEB偏移0x18处是指向TEB结构体自身 
[*]  在TEB偏移0x30处是指向PEB结构体指针


反调试思路

__asm{ /* 添加SEH异常链A */ 
        push XXXXXXX;      //将回调函数XXXXXXX压入堆栈
        push dword ptr fs:[0];    //将先前的EXCEPTION_REGISTRATION结构保存
        mov dword ptr fs:[0],esp;  // 将线程信息块(TIB)中的第一个DWORD指向
                                // 新的EXCEPTION_REGISTRATION结构。
    };
  __asm{ /* 添加SEH异常链A */ 
        push ExpHandel_A;
        push dword ptr fs:[0];
        mov dword ptr fs:[0],esp;
    };
    __asm{ /* 添加SEH异常链B */   
        push ExpHandel_B;
        push dword ptr fs:[0];
        mov dword ptr fs:[0],esp;
    };

    // 2. 人为制造异常
    int *pTest = nullptr;
    *pTest = 0;

  return 0;
//可注释  存在的意义 是更好理解SEH执行流程

EXCEPTION_DISPOSITION ExpHandel_B(
    EXCEPTION_RECORD              *pExceptionRecord,   // 异常状态描述
    EXCEPTION_REGISTRATION_RECORD *pEstablisherFrame,  // 异常注册框架
    CONTEXT                       *pContextRecord,     // 返回线程上下文
    PVOID                         pDispatcherContext ) // 分发器上下文(系统使用,无需关注)
{
    // 返回“运行下一个异常处理器”
    return ExceptionContinueSearch;
}
    // 1. 获取调试标志位
    BYTE IsBeginDebug = false; 
    __asm {
        push eax;
        mov eax, dword ptr fs:[0x30]; // 获取PEB
        mov al,byte ptr ds:[eax+2]; // 获取PEB.BeginDebug
        mov IsBeginDebug,al;
        pop eax;
    };
  
    // 2. 备份正确的异常返回地址
    g_funExceptionReturn = (void (*)())pContextRecord->Eip;

    // 3. 根据标志位执行不同的SEH异常处理流程
    if ( IsBeginDebug )
        pContextRecord->Eip = (DWORD)WrongFun;
    else
        pContextRecord->Eip = (DWORD)RightFun;

    // 4. 返回“已经正常处理”
    return ExceptionContinueExecution;
void RightFun()
{
    MessageBox(0,L"正常运行!",L"SEH反调试测试",MB_OK);
    // 删除异常处理器
    //     运行至此处时栈顶的信息是EXCEPTION_REGISTRATION_RECORD,里面
    // 保存着其最初运行的已成处理器,我们将其保存到FS:[0]处后就相当于
    // 摘除了前面注册的SEH异常链信息。
    __asm pop dword ptr fs:[0];
    g_funExceptionReturn();
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 4
支持
分享
最新回复 (30)
雪    币: 81
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
沙发 。。 收藏了。。
2015-11-27 21:42
0
雪    币: 6541
活跃值: (4501)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
3
感谢分享,不错额
2015-11-27 21:49
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
mark.有时间看看
2015-11-27 22:11
0
雪    币: 786
活跃值: (1621)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
看看反调试  thanks
2015-11-27 23:17
0
雪    币: 54
活跃值: (75)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
mark
2015-11-28 01:28
0
雪    币: 23
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
LZ的帖子是普及贴还是新的Anti技术?我记得SOD插件里头有【Anti BeingDebugged】选项啊
2015-11-28 08:53
0
雪    币: 123
活跃值: (144)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
这种反调试手段只要设置pass exception to program,然后sod把beingdebugged设置为0
就直接可以忽略这个地方了,主要因为产生异常的地方太明显了,一些老壳常用手法= -
2015-11-28 10:14
0
雪    币: 1176
活跃值: (1264)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
9
普及贴 大多数OD有插件干掉它的
2015-11-28 10:22
0
雪    币: 1176
活跃值: (1264)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
10
嗯  这种手法很容易干掉
2015-11-28 10:27
0
雪    币: 96
活跃值: (36)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
谢谢楼主,新手需要这个,希望楼主更多分享
2015-11-28 10:35
0
雪    币: 1176
活跃值: (1264)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
12
可以的  我准备发一个系列

  • PEB相关...
  • NTQ相关...
  • 窗口相关...

  • 就技术层面来说反调试就是这三大块(PS:我目前所知的)。
    之后就是思路上的对抗了。

    我写的比较详细 甚至于快捷键 都弄出来了... 就是为了让新手更易理解  
    对于 老手的感觉就是“就这么点 也能说这么多....”
    2015-11-28 10:54
    1
    雪    币: 96
    活跃值: (36)
    能力值: ( LV4,RANK:50 )
    在线值:
    发帖
    回帖
    粉丝
    13
    拭目以待
    2015-11-28 11:15
    0
    雪    币: 130
    活跃值: (402)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    14
    mark
    2015-11-28 13:53
    0
    雪    币: 79
    活跃值: (12)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    15
    好帖子  收藏
    2015-11-28 14:41
    0
    雪    币: 1042
    活跃值: (495)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    16
    很直观,学习了
    2015-11-28 16:07
    0
    雪    币: 707
    活跃值: (1301)
    能力值: ( LV9,RANK:190 )
    在线值:
    发帖
    回帖
    粉丝
    17
    不错,学习了
    2015-11-28 21:44
    0
    雪    币: 248
    活跃值: (3789)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    18
    还是可以anti
    2015-11-28 23:33
    0
    雪    币: 3
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    19
    收藏了  好贴
    2015-12-13 03:01
    0
    雪    币: 248
    活跃值: (3789)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    20
    BeingDebugged标志。。。
    2015-12-13 04:10
    0
    雪    币: 27
    活跃值: (11)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    21
    为什么不直接取BeginDebug标志了?为什么还有弄个SEH,可以我没有看明白!
    2015-12-16 00:49
    0
    雪    币: 43
    活跃值: (40)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    22
    好棒!!!
    2015-12-16 10:54
    0
    雪    币: 160
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    23
    大牛啊,好多优秀和精华帖
    顺便问一下你是在15PB学习么?
    2016-1-4 13:35
    0
    雪    币: 1176
    活跃值: (1264)
    能力值: ( LV12,RANK:380 )
    在线值:
    发帖
    回帖
    粉丝
    24
    是的
    2016-1-4 14:12
    0
    雪    币: 9
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    25
    各种期待。新手等你更新哦加油楼主顶你
    2016-1-7 20:23
    0
    游客
    登录 | 注册 方可回帖
    返回
    //