[WinAPI] Compile-Option (Incremental Linking)

출처 : http://dstein.egloos.com/2335201

첫째. Debug모드일 경우 기본으로 설정되는 컴파일 옵션을 변경하여 코드 전체에 대해 적용하는 방법
C/C++ ->Code Generation의 Basic Runtime Checks의값을 Both (/RTC1, equiv. to /RTCsu)에서 Default로 변경한다.

둘째, 컴파일 지시자를 사용하여 해당 코드에 대해서만 적용하는 방법



또 하나 주의해야 할 사항이 있다.
WriteProcessMemory로 코드를 리모트 프로세스에 쓰기위해 쓸 코드의 주소를 얻어야 하는데.. Debug모드일 경우 이 코드의 주소가 실제 주소가 아닌 해당 코드 주소를 가리키는 JMP문으로 기록되어 있는 경우가 존재한다.
이는 Debug모드일 경우 Link옵션이 Incremental Linking으로 설정되어 있어서 그렇다. 모두 알고 있겠지만 Incremental Linking은 링크 시간을 단축하기 위해 링크시점에 모든 코드의 호출 주소를 변경하지 않고 변경된 코드의 주소만 JMP문으로 변경하는 기능을 수행한다. 따라서 WriteProcessMemory로 기록하는 내용이 실제 코드의 내용이 아니라 JMP문에 해당하는 다른 내용의 코드가 기록된다.

단 해당함수가 static으로 구현되어 있을경우 Incremental Linking으로 설정되어 있더라도 실제 함수의 주소가 코드에 설정된다.
(위의 샘플소스를 보면 static으로 선언되어 있음.)

이설정은 Project의 Linker->General의 Enable Incremental Linking을 NO로 설정하여 해결 할 수 있다.

댓글

이 블로그의 인기 게시물

[WinAPI] 모달리스 다이얼로그 설명

[WinDbg] Debugging a stack overflow

[WinDbg] first-chance, second-chance Exception