- 8
- 0
- 约1.11万字
- 约 7页
- 2021-11-11 发布于福建
- 举报
;这个程序是从罗云彬老师的《 windows 环境下 32 位汇编语言》书上抄下来的,因为之前看
的时候看得不是很懂,后来总结了一些资料后终于是弄明白了,
;这里贴出我的分析供初学者学习,大神飘过吧,若有不对之处,还请大家提出来。
;首先是一个 SEH 异常处理代码,这段程序是作为一个子程序来调用的,为了避免使用全局
变量,这里用 _lpSEH 这个参数来传递需要保护的寄存器。
_SEHHandler proc C _lpExceptionRecord,_lpSEH,_lpContext,_lpDispatcherContext
pushad
mov esi,_lpExceptionRecord
mov edi,_lpContext
assume esi:ptrEXCEPTION_RECORD,edi:ptr CONTEXT
mov eax,_lpSEH
push[eax + 0ch]
pop [edi].regEbp ;恢复 Ebp
push[eax + 8]
pop [edi].regEip ;恢复 Eip
pusheax
pop [edi].regEsp
assume esi:nothing,edi:nothing
popad
mov eax,ExceptionContinueExecution
ret
_SEHHandler endp
;
; 在内存中扫描 Kernel32.dll 的基址 ,重点来了。
;
_GetKernelBase proc _dwKernelRet
local @dwReturn
pushad
mov @dwReturn,0
;********************************************************************
; 下面是地址重定位的代码,为了让这个子程序中的两个函数能用到任何地方
;********************************************************************
call @F
@@:
pop ebx
sub ebx,offset @B
;********************************************************************
; 下面是创建用于错误处理的 SEH 结构
;********************************************************************
assume fs:nothing
pushebp
lea eax,[ebx + offset _PageError]
pusheax
lea eax,[ebx + offset _SEHHandler]
pusheax
pushf s:[0]
mov fs:[0],esp
;********************************************************************
; 查找 Kernel32.dll 的基地址
;********************************************************************
mov edi,_dwKernelRet
and edi,0ffff0000h ;重点:为什么要和 0ffff0000h 进行 and 运算?因为 PE文件
被装入内存时是按 64K 对齐的,取 and
原创力文档

文档评论(0)