技巧2、PE EXE为32位or64位的魔术字
红色框住的是PE结构的magic魔术字
说明文件类型:10B --- 32位下的PE文件 20B --- 64位下的PE文件
上面的Exeinfo识别为64位,说明是通过这个魔术字来的,但下面的DIE不一样,仍然识别出来为32位,
技巧3、SEH链的运用
SEH:Structured Exception Handling,结构化异常处理, 是一种用于处理硬件异常和软件异常的机制。int 3 是一条汇编指令,用于触发一个调试断点异常(Breakpoint Exception)。当 int 3 被执行时,操作系统会调用注册的 SEH 异常处理函数来处理该异常。
以下是一段汇编代码示例,展示了如何使用 SEH 处理 int 3 触发的异常:
section .data
; 定义一些数据
msg db "SEH Exception Handled!", 0
section .text
global _start
extern __imp_MessageBoxA@16 ; 导入 MessageBoxA 函数
extern __imp_ExitProcess@4 ; 导入 ExitProcess 函数
_start:
; 设置 SEH 异常处理函数
push seh_handler ; 将异常处理函数的地址压入栈
push dword [fs:0] ; 异常处理结构体指针压栈保存当前的 FS:[0](旧的SEH 链)
mov dword [fs:0], esp ; 将新的 SEH 处理函数地址存入 FS:[0],利用该指针跳转到seh_handler
; 触发一个断点异常(int 3),程序到except块查找回调函数,
int 3
; 如果没有异常发生,继续执行
; 这里可以放置正常逻辑代码
; 恢复旧的 SEH 链
pop dword [fs:0] ; 恢复 FS:[0] 为旧的 SEH 链
add esp, 4 ; 清理栈
; 正常退出程序
push 0
call __imp_ExitProcess@4
seh_handler:
; 异常处理函数
; 获取异常信息
mov eax, [esp + 0x0C] ; 获取 EXCEPTION_RECORD 结构指针
mov ebx, [eax + 0x04] ; 获取异常代码(ExceptionCode)
cmp ebx, 0x80000003 ; 检查是否是断点异常(STATUS_BREAKPOINT)
jne not_handled ; 如果不是断点异常,跳转到未处理逻辑
; 如果是断点异常,显示消息框
push 0 ; MB_OK
push msg ; 消息内容
push msg ; 标题
push 0 ; hWnd
call __imp_MessageBoxA@16 ; 调用 MessageBoxA
; 继续执行程序
mov eax, 0xFFFFFFFF ; EXCEPTION_CONTINUE_EXECUTION
ret
not_handled:
; 如果不是断点异常,继续搜索其他异常处理函数
mov eax, 0x00000000 ; EXCEPTION_CONTINUE_SEARCH
ret
问题一:程序执行时会触发int 3转而seh吗?
答:会的,这是显示调用int3,程序到这里会转去执行seh_handler;
问题二:如OD调试器到这里时会执行seh吗?
答:两种情况,
(1)无调试器:程序运行到 int 3 时,会触发断点异常,操作系统会调用 seh_handler,显示消息框并继续执行。
(2)有调试器(OllyDbg):默认情况下,调试器会捕获 int 3 异常并暂停程序,不会跳转到 seh_handler。如果调试器设置为 "Pass to program",则会将异常交给 seh_handler 处理。
后记:为什么将SEH单独作为一个技巧来讲,因为在上一篇《天堂之门》技术中讲到如何从x86切换到x64时用到了一些特定代码,但在实际运用中不会这么直白,不会让你这么轻易地识别到,会采用很多的隐藏手法,其中有一种就是用SEH异常来作一个处理,隐藏天堂之门的特定入口,不让你轻易地发现。
原文始发于微信公众号(MicroPest):三个小技巧(二)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论