현재 저는 "천국의 문"으로 알려진 windows/WOW64 트릭을 사용하고 있습니다. 아마도 여러분 중 일부는 x86 프로그램에서 x64 모드로 들어갈 수있게 해줄 것입니다 (i가 ! 그것을 테스트하고 일했다)하지만 난 코드가 있기 때문에) SEH를 사용, 그것은 다음과 같습니다 (, 그것은 모든 Windows 버전에서 지원되지 않습니다 그래서 내 코드를 알고 어셈블러 원거리 호출 및 천국 게이트에 대해 예외를 발생시키는 호출을 세그먼트 화합니까? cs 및 eip 예외가 throw되기 전에?
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 "이 트릭을 할 것이지만 나는 그것에 대해 매우 궁금합니다.
무엇이 당신의 질문입니까? 코드에있는 해당 주석이 맞으면 질문의 일부로 적절하게 작성하십시오. –
정말 미안 해요, 이건 내 첫번째 StackOverflow 질문입니다. 음, 네, 제 질문입니다 : 예를 들어, 코드가 x86 전용 시스템에서 실행되는 경우 예외가 발생하면 cs와 eip가 이미 스택에 푸시됩니까? 따라서 retf, 또는 단순히 jmp해야합니까? – nts94