반응형

C/C++ 로 개발을 하다보면 '인라인 어셈블리' 를 사용하게 되는 경우도 있습니다.

SEH 를 '인라인 어셈블리' 로 구현하면 보통은~ SEH 를 등록하는 코드가 아래의 예제코드처럼 됩니다.

int main()
{
    ...
    __asm {
        push    _SEH_Handler
        PUSH    DWORD PTR FS:[0]
        MOV     DWORD PTR FS:[0], ESP    // C4733
    }
    ...
}


이렇게 코드를 작성하고 컴파일을 해보면...

VC++ 7.1 에서는 "MOV DWORD PTR FS:[0], ESP" 코드에서 'C4733' 경고가 발생합니다;;;
( 테스트를 해보지는 못했지만 6.0 에서는 왠지 그냥 넘어갈 것 같고.. 7.0, 8.0 등에서는 7.1 처럼 경고가 발생할 듯한;;; )

"인라인 asm 이 'FS:[0]'에 할당되었습니다. 처리기가 안전한 처리기로 등록되지 않았습니다" 요런 메시지와 함께~;;;

그냥 간단하게 생각하면 'FS:[0]' 에 값을 임의로 넣으려고 해서 경고가 발생했다~~ 라고나 할까요..;
( 참고 페이지 : http://msdn.microsoft.com/ko-kr/library/ha52ak6a(VS.80).aspx )

=0=;; 동작하는데는 별다른 이상이 없는듯 하지만 경고 메시지가 뜨는게~~ 은근히 거슬립니다~

그래서~~ 어셈코드를 아래와 같이 살짝 변경해봤더니 :) 경고가 사라지더군요~~ㅋ

int main()
{
    ...
    __asm {
        push    _SEH_Handler
        XOR     EAX, EAX
        PUSH    DWORD PTR FS:[EAX]
        MOV     DWORD PTR FS:[EAX], ESP
    }
    ...
}

컴파일러는 소스코드를 파싱하면서 오류를 찾을테고~

그러면 'FS:[0]' 요렇게만 사용하지 않으면 될 것 같아서...

"XOR EAX, EAX" 로 EAX 를 0 으로 만든 다음~~ 'FS:[0]' 대신 'FS:[EAX]' 로 ~~ 샤샤샥~!! :)


실제 코드가 실행될 때는... "MOV DWORD PTR FS:[0]" 이나...

"XOR EAX, EAX" -> "MOV DWORD PTR FS:[EAX]" 이나 동작은 동일하거든요..
( 한 스텝에 할 수 있는 걸 두 스텝으로 나눠서 한다는 차이는 있겠지만요... )

공개된 소스들을 뒤져봤더니 SEH 를 '인라인 어셈블리'로 구현할 때...

이 방법으로 경고를 피한 경우도 많이 있더군요~~ㅋ

=0= 잠수해제 신호탄으로 간단한 팁하나 올려봤습니다~~ :)ㅋ

반응형
AND