В настоящее время я играю с трюком windows/WOW64, известным как «небесные ворота», который, как некоторые из вас, вероятно, знают, позволяет нам войти в режим x64, хотя в программе x86 (я был так поражен, когда я проверил его и он работал) Но я знаю, что это не поддерживается на всех версиях Windows, поэтому мой код (потому что есть код) использует SEH, это выглядит следующим образом:О ассемблерных дальних звонках и небесных воротах, выполняйте сегментные вызовы, которые вызывают исключение push cs и eip ПЕРЕД исключением, которое выбрано?
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