目前我正在玩被称为“天堂之门”的 windows/WOW64 技巧,正如你们中的一些人可能知道的那样,即使在 x86 程序中,它也允许我们进入 x64 模式(当我测试它时我很惊讶它有效!)但我知道它不受所有 Windows 版本的支持,所以我的代码(因为有代码)使用 seh,它看起来像这样:
start:
use32
;; setup seh...
call $33:.64bits_code ; specify 0x33 segment, it's that easy
;; success in x64 mode, quit seh...
jmp .exit
.64bits_code:
use64
;; ...
use32
retf
.seh_handler:
use32
;; ...
xor eax,eax ; EXCEPTION_CONTINUE_EXECUTION
ret
.32bits_code:
; we have been called by a far call (well, indirectly, routed by a seh handler)
; HERE IS THE PROBLEM => Should i use a retf since cs and eip are on the stack,
; or the exception has been triggered before pushing them???
; "retf" or "jmp .exit"?
.exit:
xor eax,eax
push eax
call [ExitProcess]
我知道一个简单的“jmp .exit”可以解决问题,但我对此非常好奇