증분링크(incremental link)는 바이너리를 가능한 빠르게 링크하고자 함수 호출시 직접적인 주소를 참조하지 않고 별도의 테이블(ILT, 증분링크테이블)로 관리를 하여 함수가 수정되어 크기가 변하여도 모든 CALL 명령을 찾아 수정을 가하는게 아니고 테이블만 변경할수 있도록 하여 링크 속도를 높인다.
ILT 테이블 예
@ILT+0(_wmain):
00401005 jmp wmain(401070h)
@ILT+5 (??_GCResString@@UAEPAXI@Z)
0040100A jmp CResString::'scalar deleting destructor' (401B40h)
증분링크시 추가적인 패딩데이타가 실행파일에 추가되어 용량이 커진다.
/INCREMENTAL:yes 또는 no로 설정할수 있고 이와 관련된 정보는 .ilk에 저장되어 사용된다.
디버그 모드에서 실행중 수정하면서 진행하려면 증분링크로 빌드되어야 한다. (VS에서는 /DEBUG 시 자동적으로 /INCREMENTAL 이 지정된다.)
그외에 /OPT:REF /OPT:ICF 를 선택하면 증분링크는 무시되고 비증분링크를 수행한다.
API Hooking시 증분링크에 대한 체크가 필요하다.
// 증분 링크 체크
// Microsoft Visual C++은 실행중에도 코드를 수정할 수 있게끔
// 증분 링크를 사용하여 함수의 주소가 실제 함수를 가리키지 않고, 실제 함수로 jmp 하는 명령의 주소로 되어 있다.
// 참고: System DLL일 경우에 무시
if ((DWORD)fnApi < 0x80000000 && *(PBYTE)fnApi == 0xE9)
{
fnApi = (PROC)((int)(fnApi) + (*(int *)((PBYTE)fnApi+1)) + 5);
}
'scrap' 카테고리의 다른 글
SVN 사이트 (0) | 2010.03.18 |
---|---|
Visual Studio 단축키 (0) | 2010.03.18 |
윈도우 가상 드라이버 생성 (0) | 2010.03.18 |
Gentoo Linux 설치 (0) | 2010.03.18 |
WSS / MOSS Sp2 설치 (1) | 2010.03.18 |