얼마 전 Windows 7 RC 버전이 공개가 된 이후부터 Windows 7 관련 뉴스 및 정보들이 많이 보이는군요..

올 연말부터 Windows 7 정식 출시할거라는 기사도 종종 보이구요..
(정말 그때 출시할지는 그때가 되어봐야 알겠지만요... )

덕분에... 살포시 덮어두었던 "Windows 7 에 대한 호환성" 문제를 다시 펼쳐서..

살펴보고는 한숨만 푹푹.. 내쉬고 있는 중입니다.


일반적으로 실행파일들은 Windows 2000 이상에서 돌아가면..

특별한 예외가 없는 한 XP, 2003, Vista, Windows 7 까지 무난히 잘 돌아갑니다..

그래서 나름 가벼운 마음으로 OS 호환 테스트용 파일을 Windows 7 에서 돌려봤답니다.

헉~! Vista 까지 무난하게 동작하던 파일이 Windows 7 에서는 실행이 되지 않더군요...;;;

-0- 빠르든 늦든 언젠가는 해결을 해야되는 문제기에 바로 원인 분석에 들어갔습니다..

Windows 7 에서 OllyDBG 띄워놓고 테스트용 파일을 한스텝씩 실행시켜 봤는데....

이런;;; 특정 API 의 주소를 읽어오지를 못하더군요;;..


테스트용 파일의 특성상 PEB -> Ldr 의 LDR_MODULE 구조체를 참조하여..

KERNEL32.DLL 이 매핑된 주소를 구해와서 EXPORT Table 을 직접 뒤지도록 해뒀는데...

Windows 7 에서는 KERNEL32.DLL 이 있어야 될 위치(?)에 KERNELBASE.DLL 이란 놈이... 들어가있네요;;
( KERNEL32.DLL 는 분명히 따로 존재하는데, 그럼 KERNELBASE. DLL 은... 뭘까요..? =ㅂ=;;; )


Windows 7 에는KERNELBASE.DLL 이 있다!


원래라면 KERNEL32.DLL 에서 뒤져야할 함수를 KERNELBASE.DLL 에서 뒤지다보니..

결국 찾지를 못했고..;; 이것 때문에 실행이 안된거였습니다..;;;;



Windows 7 의 KERNEL32.DLL



KERNEL32.DLL 을 살펴보면 중간에 Import 된 함수들이 많이 보이는데...

이 함수들은 거의 KERNELBASE.DLL 이 가지고 있는 함수들입니다.

대충 정리해보면...

"기존의 KERNEL32.DLL 이 가지고 있던 함수들 중 일부가 KERNELBASE.DLL 로 옮겨가고.. 
  KERNEL32.DLL 에서는 KERNELBASE.DLL 로 포워딩을 한다"


정도가 되려나요..;;
( 아!! 참고로 KERNEL32.DLL 말고도 ADVAPI32.DLL 의 일부가 KERNELBASE.DLL 로 옮겨졌습니다.. )


2000 / XP / 2003 Server / Vista 까지 Only KERNEL32.DLL 만 있었고...

PEB 를 참조해서, KERNEL32.DLL 위치 구하던 것도 Vista 까지 두루 잘 먹혔는데..

갑.툭.튀 KERNELBASE.DLL 덕분에 코드 수정이 불가피 하게 되었답니다;;.. oTL;;;

아.. 이거 고민을 좀 해봐야겠네요;;..
신고