API 线程 异常

来源:互联网 发布:考研政治题库软件 编辑:程序博客网 时间:2024/06/06 06:50

(1)获取进程ID方法1
获取窗口句柄
FindWindow

从窗口句柄获取进程ID,主线程句柄
GetWindowThreadProcessId


(2)获取进程ID方法2
获取进程快照
CreateToolhelp32Snapshot

从快照句柄中获取进程ID,EXE名,父进程ID
Process32First
Process32Next


(3)从进程ID获取进程句柄 (设置进程操作权限)
OpenProcess


(4)读写地址空间 (自己代码段不可写,而目标进程可写)
ReadProcessMemory
WriteProcessMemory


(5)
恢复进程执行
ResumeThread

关闭进程,线程句柄
CloseHandle


(6)Debug API
让进程进入调试状态
DebugActiveProcess

获取Debug事件
WaitForDebugEvent

恢复调试进程运行
ContinueDebugEvent


(7)线程环境
存取寄存器
GetThreadContext
SetThreadContext

挂起线程
SuspendThread

恢复线程
ResumeThread


(8)远程线程申请地址空间 (需要PROCESS_VM_OPERATION权限)
VirtualAllocEx
返回内存指针

创建远程线程 (PROCESS_CREATE_THREAD权限)
CreateRemoteThread


//上述只能修改个别代码内存地址,而写入代码会使变量地址出错

(9)代码的重定位问题 13.4 进程的隐藏(2)

dwVar dd ?
call @F    ;解决重定位
@@:     ;
pop ebx    ;
sub ebx,offset @B   ;
mov eax,[ebx + offset dwVar]


//--------------------------------------------------------------------------------------------------
异常处理函数

(1)筛选器异常处理
设置一个筛选器异常处理回调函数,惟一参数是回调函数的地址
SetUnhandledExceptionFilter
//invoke  SetUnhandledExceptionFilter,offset _Handler

回调函数格式,参数是个指针,指向EXCEPTION_POINTERS结构
_Handler    proc    l   pExceptionInfo
回调函数返回值:
EXCEPTION_EXECUTE_HANDLER (1)//不显示出错对话框,终止进程
EXCEPTION_CONTINUE_SEARCH (0)//显示出错对话框,终止进程
EXCEPTION_CONTINUE_EXECUTION (-1)//将CONTEXT设置回去,继续执行程序
//EXCEPTION_RECORD中包含EXCEPTION_NONCONTINUABLE标志,不能使用EXCEPTION_CONTINUE_EXECUTION标志

//参照13.3.3小节中介绍调试API的时候介绍过
EXCEPTION_POINTERS STRUCT
  pExceptionRecord  DWORD ?  //指向EXCEPTION_RECORD结构,记录异常原因、位置(14.2 使用筛选器处理异常(2))
  ContextRecord     DWORD ?  //指向CONTEXT结构,记录运行时环境
EXCEPTION_POINTERS ENDS

//--------------------------------------------------------------------------------------------------

(2)SEH异常处理
使用fs前
assume fs:nothing
否则错误: error A2108: use of register assumed to ERROR

注册回调函数
push        offset _Handler ;回调函数
push        fs:[0]  ;fs:[0]指向ExceptionList字段
mov     fs:[0],esp  ;

删除回调函数
pop fs:[0] ;
pop eax  ;堆栈平衡

TIB结构
NT_TIB STRUCT
    ExceptionList dd     ?       ;ExceptionList指向EXCEPTION_REGISTRATION结构
    StackBase dd         ?       ;堆栈基址
    StackLimit dd        ?       ;堆栈大小
    SubSystemTib dd      ?
    FiberData dd         ?
    ArbitraryUserPointer dd ?
    Self dd ?                    ;本NT_TIB结构自身的线性地址
NT_TIB ENDS

EXCEPTION_REGISTRATION  STRUCT
    prev  dd ?       ;前一个EXCEPTION_REGISTRATION结构的地址
    handler dd ? ;异常处理回调函数地址
EXCEPTION_REGISTRATION  ENDS


调函数参数定义
_Handler   proc _lpExceptionRecord,_lpSEH,_lpContext,_lpDispatcherContext
_lpExceptionRecord -> EXCEPTION_RECORD结构
_lpSEH     -> EXCEPTION_REGISTRATION结构,自身结构地址
_lpContext    -> CONTEXT结构

回调函数返回值
ExceptionContinueExecution (==0):将线程环境设置为_lpContext参数的CONTEXT结构并继续执行。
ExceptionContinueSearch  (==1):回调函数拒绝处理异常,系统将EXCEPTION_REGISTRATION结构 prev字段 得到前一个回调函数地址并调用它。
ExceptionNestedException (==2):回调函数中发生新异常,即嵌套异常。
ExceptionCollidedUnwind  (==3):发生了嵌套展开操作(展开操作的介绍参见14.3.4小节)。

展开操作(Unwinding)
异常代码 EXCEPTION_UNWIND
异常标志 EXCEPTION_UNWINDING (==2)

API: RtlUnwind (不保存 esi edi ebx 寄存器,自行保存)
invoke  RtlUnwind,lpLastStackFrame,lpCodeLabel,lpExceptionRecord,dwRet
lpLastStackFrame:
(1)取值EXCEPTION_REGISTRATION结构地址,对当前回调函数之后所有回调函数展开操作,包含EXCEPTION_UNWINDING异常标志
(2)取值NULL,退出展开, EXCEPTION_UNWINDING + EXCEPTION_UNWINDING_FOR_EXIT 标志
lpCodeLabel: (指定函数返回的位置)
(1)取值NULL,返回 RtlUnwind函数后一条指令,否则返回到lpCodeLable指定地址
lpExceptionRecord: (指定一个EXCEPTION_RECORD结构,传给每个回调函数) NULL
dwRet: NULL

 

 

 

 

//--------------------------------------------------------------------------------------------------

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击