2012-06-11 4 views
4

현재 저는 "천국의 문"으로 알려진 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 "이 트릭을 할 것이지만 나는 그것에 대해 매우 궁금합니다.

+0

무엇이 당신의 질문입니까? 코드에있는 해당 주석이 맞으면 질문의 일부로 적절하게 작성하십시오. –

+0

정말 미안 해요, 이건 내 첫번째 StackOverflow 질문입니다. 음, 네, 제 질문입니다 : 예를 들어, 코드가 x86 전용 시스템에서 실행되는 경우 예외가 발생하면 cs와 eip가 이미 스택에 푸시됩니까? 따라서 retf, 또는 단순히 jmp해야합니까? – nts94

답변

1

OS가 인터럽트를 받거나 오류가 발생하면 사용자 코드가 무엇이든지 상관없이 CPU가 필요한 커널 스택에 IRET은 그것이 무엇이든간에 보이지 않게 다시 시작합니다.

커널 스택에는 해당 상태와 관련된 "마법"이 없습니다. "계속 실행"이란 저장된 값 rflags, cs:ripss:rsp을 복원하고 cs:rip이 가리키는 코드를 실행하는 것을 의미합니다. 예외가 점프 "전에"발생

  1. : 단지까지 통화 중에 발생하는 예외의 종류에 대해 생각, 특히 SEH를 포함하지 않고, 고려해야 할 두 건 정말 있다는 것을 의미

    아무것도 가 눌려지면, 커널 스택의 상태는 호출 명령어를 다시 시작하여 재개해야한다고 말합니다.

  2. 예외가 점프 "다음에"발생합니다 cs:eip이이나 .64bits_code 라벨 후 rip 지점 어딘가에, 밀어, 그 저장된 상태는 우리가 64 비트 코드로 이동해야 다시 시작하는 것을 말한다되었다. CPU가 "중간"중단하기까지 호출을 허용하는 경우

는 OS의 실행이 계속 될 때 일관된 결과를 생성 cs:rip 전혀 취할 수있는 값이 없을 것이다. 예를 들어 원거리 전화의 복귀 주소가 예외가 발생하기 전에 푸시되었지만 저장된 cs:rip이 원 호출 명령을 가리킨 경우 두 개의 두 개의 복귀 주소 복사본이 스택에 저장되고 모든 지옥은 느슨해집니다.

이제 질문에 실제로 대답하기 위해 : OS가 예외가 발생했다고 rIP 값에 따라 달라집니다. 64 비트 코드를 가리키는 경우 스택에 cs : eip가 있어야하며 32 비트 코드를 가리키는 경우 안전하게 푸시되지 않았다고 가정 할 수 있습니다.