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= 잠수해제 신호탄으로 간단한 팁하나 올려봤습니다~~ :)ㅋ

YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. BlogIcon window31 2008.11.10 01:31  댓글주소  수정/삭제  댓글쓰기

    6.0에서는 FS:[0] 아쥬 잘됨...

  2. BlogIcon vbdream 2008.11.25 19:09  댓글주소  수정/삭제  댓글쓰기

    VC++ 6.0 SP6 에서 컴파일시에도 마찬가지 현상이 발생하더군요.

  3. Noname 2009.03.27 09:18  댓글주소  수정/삭제  댓글쓰기

    문제는 한개의 명령으로 표현할 수 있는 부분을 굳이 레지스터 어드레싱을 사용하면서 오버헤드를 만든다는 것이지요.
    컴파일러 경고를 하나 없애기 위해서 실행되는 인스트럭션을 한개 추가하는것은 바람직한 행위로 보이지 않습니다.

    • BlogIcon XeroNic(HS) 2009.03.27 11:06 신고  댓글주소  수정/삭제

      넵.. 맞습니다. ^^
      사실 컴파일러에서 띄워주는 저런식의 경고야..;
      #pragma 로 무시해버려도 되니까요..

      어디까지나 저런식의 우회코딩으로도 표현이 가능하다는 팁일뿐..
      큰 의미는 없습니다..

  4. HooKi 2012.03.06 09:33  댓글주소  수정/삭제  댓글쓰기

    휴리스틱한 코드..^^
    많은 보안 시스템들이 저런 휴리스틱한 코드들에 우회되곤 했죠 ~

    좋은 아이디어 잘 보고 갑니다 ~~ !!