前言
在《x86/x64体系探索及编程》的ex10-7代码中,使用了int3,bound,into来加载CS寄存器。我们现在来尝试分析bochs对于这几条指令的实现。
into指令分析
关于into以及处理OF异常的代码如下,比较好理解。into指令只是判断eflag的of位,这位标志着是否存在溢出发生,如果存在溢出,则触发OF异常。
;; 测试 INTO 指令
mov eax, 0x80000000
mov ebx, eax
add eax, ebx ; 产生溢出,OF标志置位
into ; 引发 #OF 异常
;---------------------------------------
; OF_handler(): #OF handler
;---------------------------------------
OF_handler:
jmp do_OF_handler
omsg1 db '---> Now, enter #OF handler',10, 10,0
do_OF_handler:
push ebx
mov ebx, [esp + 12] ; 读 eflags 值
mov esi, omsg1
call puts
mov esi, ebx
call dump_flags_value
pop ebx
iret
Intel手册中对于INTO指令的描述非常简单,只是注意这是一个trap类型,而不是fault类型,我们之后会看细节,看看两种类型的实际区别,这里简单来讲,trap类型执行完后不会再来执行原指令,而fault则会再来执行原指令,int主动调用的都为trap类型。
我们现在来用IDA逆向代码,确定其位置,然后用bochs定位,最后用visual