博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《脱壳艺术》学习笔记2--SEH检测调试器
阅读量:2343 次
发布时间:2019-05-10

本文共 1383 字,大约阅读时间需要 4 分钟。

 
《脱壳艺术》学习笔记 2
时间:
2008
2
22
星期五,
10
5
35
 
SEH
检测调试器
 
新建
vc++ Console
项目
,
编写下面代码测试
:
int
main()
{
 bool bIsInDebugger = true ;
 
 try{
   //
非法内存访问
,
会引发异常
 
 
   int *p = NULL;
   *p = 0;
 }catch(...)
 {
   
//
对异常进行处理
    //
如果应用程序接管异常
,
我们认为当前程序没有被调试
   
bIsInDebugger = false ;
 }
 
 if
( bIsInDebugger == true )
 {
    exit();
 }else
 {
    cout<<"Hello World"<<endl;  
 }
 
 return 0;
}
 
检测调试器的原理是
:
当被调试进程出现异常时,该异常通常被调试器接管。这样应用程序自己设置的异常处理函数就得不到执行。我们可以利用这一点在异常处理例程中设置标志变量达到检测的目的。
 
实际调试过程中发现
: try
语句中给
0x00000000
地址赋值的操作导致内存访问违规
,
应用程序弹出下面窗口

连续试了几次都是这样, 可能没有执行SEH处理? 分析反汇编代码没有发现什么特别的地方.

回想以前用VC 6.0 的时候,异常处理可以捕获这个异常并很好的处理.

思考了一会,我觉得可能和项目属性设置有关,

查看了 [配置属性]-->[C/C++]-->代码生成-->启用C++异常中的设置  这里的设置为"", 更改为",但有SEH异常"

再次调试上面代码运行 OK.

 

实际加壳部分的 SEH 是用汇编写的:

分析 《脱壳艺术》中的代码

//----------设置异常处理----------

// 异常处理函数地址

push     .exeception_handler

// 指向先前SEH结构体的地址, 现在它作为下一个异常处理函数

push     dword [fs:0]                

//使 fs:[0]指向刚添加SEH结构地址,当出现异常时 exeception_handler 首先得到处理

mov           [fs:0],esp

      

;reset flag(EAX) invoke int 3

xor       eax,eax // 设置初始标志

int 3             // 引发异常

 

;restore exception handler

pop       dword [fs:0]

add       esp,4

 

; check if the flag had been set

test     eax,eax

je        .debugger_found

:::

// 异常处理函数

.exeception_handler:

;EAX = ContextRecord

mov       eax,[esp+0xc]

;set flag (ContextRecord.EAX)

mov       dword [eax+0xb0],0xffffffff

;set ContextRecord.EIP

inc       dword [eax+0xb8]

xor       eax,eax

 retn

 

push    .exeception_handler

push    dword [fs:0]

mov         [fs:0],esp

3 条汇编语句可以用下面结构图表示.

                                             简单的 SEH

 
你可能感兴趣的文章
针对外部存储器(如磁盘)上存放的程序和数据,说法正确的是()。----阿里巴巴2015校招研发在线笔试题
查看>>
下列关于线程调度的叙述中,错误的是()。----阿里巴巴2015校招研发在线
查看>>
如何扩展 web 服务器?----阿里巴巴2015校招研发在线
查看>>
有两个32bit的数A、B,使用下面方式得到32bit的数C、D。哪一种可以使用C、D得到A、B的值?----阿里巴巴2015校招研发在线
查看>>
如何设计数据表、解决数据库并发访问瓶颈、数据库事务----阿里巴巴2015校招研发在线
查看>>
皮划艇找瓶子--------阿里巴巴2015校招研发在线
查看>>
HTTP的会话有四个过程,请选出不是的一个()----百度2016研发工程师笔试题(六)
查看>>
在ISO/OSI参考模型中,网络层的主要功能是()----百度2016研发工程师笔试题(六)
查看>>
MapReduce框架中,在Map和Reduce之间的combiner的作用是()----百度2016研发工程师笔试题(六)
查看>>
计算页号----百度2016研发工程师笔试题(六)
查看>>
在一个分时操作系统中,进程出现由运行状态进入就绪状态,由阻塞状态进入就绪状态的原因分别可能是()
查看>>
数据库 alter 语句的使用----百度2016研发工程师笔试题(六)
查看>>
数据库恢复的基础是利用转储的冗余数据。这些转储的冗余数据包括()----百度2016研发工程师笔试题(六)
查看>>
在一棵度为3的树中,度为3的节点个数为2,度为2的节点个数为1,则度为0的节点个数为()----百度2016研发工程师笔试题(六)
查看>>
在/etc/fstab文件中指定的文件系统加载参数中, 参数一般用于CD-ROM等移动设备。----百度2016研发工程师笔试题(六)
查看>>
在多级存储体系中,“Cache-主存”结构的作用是解决( )的题目。----腾讯2014研发笔试卷
查看>>
C++ 实现 0-1 背包问题
查看>>
指针数组 数组指针 指针函数 函数指针
查看>>
对类成员访问权限的控制,是通过设置成员的访问控制属性实现的,下列不是访问控制属性的是( )
查看>>
字符串常量放在只读存储区
查看>>