얼마 전 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;;;

아.. 이거 고민을 좀 해봐야겠네요;;..
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. BlogIcon jz 2009.05.13 17:09  댓글주소  수정/삭제  댓글쓰기

    LDR_MODULE에서 initialized order로 얻어오시다가 먼저 initialize되는 새로운 dll이 생겨서 문제가 난건가요?

    흠... 걍 GetModuleHandle( "Kernel32.dll" ); 하심이.. ㅋㅋ 파일 특성상 안되는건가요?

    아님 LDR_MODULE에서 얻은 imagebase를 pe 파싱해서 dll 이름을 얻으시면 될 것 같기도 하네요

    (Export directory의 dll name을 봐서용 ㅋ)

    고생많으심다. 저도 윈도7 궁금한데 왜 집에만 가면 드러눕고싶을까요 에휴 ㅋㅋ

    • BlogIcon XeroNic(HS) 2009.05.13 18:45 신고  댓글주소  수정/삭제

      넵.. 맞습니다.^^;; InInitializationOrderModuleList 참조하는데;;
      Vista 까지는 KERNEL32.DLL 이 로딩이 되었는데...
      Windows 7 에서는 KERNELBASE.DLL 이 로딩이 되더군요;
      덕분에 =0=;; ㅋㅋ.

      GetModuleHandle 을 쓰고싶지만..;;
      쓸수가 없는(?) 상황이거든요..ㅋ
      이름 파싱하는것도 충분히 시도해볼만하네요;;..
      어셈으로 코딩을 해야되는게 압박이긴 하지만ㅠ.ㅠ..

  2. BlogIcon ♥ LovelyJoeny 2009.05.18 15:36  댓글주소  수정/삭제  댓글쓰기

    그럼 GetModuleHandle 을 썼던 코드들은 7 에 호환을 시키려면 모두 수정해야한단거군효.ㅎ
    좋은 정보 감사합니당.

    곧 대대작업이 있을텐데, 참고해야겠어혈.0ㅂ0b

    아..왜 흥분되죠..-ㅂ-;;

    • BlogIcon XeroNic(HS) 2009.05.18 18:39 신고  댓글주소  수정/삭제

      아.. 글이 오해의 소지가 있었나봐요..^^;
      GetModuleHandle()과 Windows 7 호환성과는 무관합니다..

      GetModuleHandle() 을 쓸수 없는 상황에서
      KERNEL32.DLL 베이스 주소를 찾으려고 작성한 코드가 있는데,
      Windows 7 에서는 KERNELBASE.DLL 이라는 녀석이 새로 생긴 바람에,
      KERNEL32.DLL 주소 대신 KERNELBASE.DLL 의 주소를 들고오면서 문제가 됐던 거거든요;..

      즉, 제가 작성한 코드가 Windows 7 에서 문제가 터졌던거지..
      GetModuleHandle() 과는 무관하답니다~~^^;;;

      GetModuleHandle() 을 썼던 코드는 그대로 두셔도 될거에요~~^^;;;;

  3. BlogIcon newbie 2009.10.26 10:06  댓글주소  수정/삭제  댓글쓰기

    지나가다 Win 7 자료를 봤는데..이런 부분이 있었군요.. 비단 APP 단 뿐만 아니라, 커널 단에서도 고려해봐야 할 문제군요.. 이래저래 비스타부터 커널 레벨에 대한 프로그래밍의 개념을 바꿔야 하다니..OTL...

    OS 가 많아질수록 개발자만 피곤해지는군요..

    잘 보고 갑니다~!

  4. 가시복 2013.12.22 01:09  댓글주소  수정/삭제  댓글쓰기

    실례지만요... 프로그램을 잘 아실 것 같아 질문드리고 싶습니다.

    다름이 아니라, 트라인2 라는 액션게임을 실행할때.. 유독 실행파일이 APPCRASH를 일으켜
    KERNELBASE.DLL라는 파일 때문에 계속 실행할 수 없습니다.. 라고 뜨며 몇달전까지 아무런 문제없이
    실행되던 게임을 더이상 실행할 수 없는 일이 발생했는데...

    전 꾸준히 타이태니엄 백신을 쓰고 시시클리너로 꾸준히 청소를 해주고 바탕화면이나 폴더도 잘 정리하는 등 여러가지 깔끔한 생활을 하고 있었기에 더욱 분통이 터지는 일이었습니다.

    혹시나 DLL이 손상되어 그걸 덮어씌우면 되지 않나.. 라는 생각으로 복구시키려고 하지만 권한떄문에 덮어씌울수가 없다는 화면만 나와서 울상입니다. 이걸 어떻게 해결해야할지 모르겠습니다.. 혹시 잡히시는 부분이 있나요?

    전 윈도우7에 하드는 3테라, C드라이브는 SSD 120기가, 램은 16, 비디오카드는 지포스 680입니다...
    게임도 잘 안하는 편인데.. 가벼운 마음으로 즐기려는것도 못해서 슬픕니다..

    • BlogIcon XeroNic(HS) 2013.12.23 09:28 신고  댓글주소  수정/삭제

      직접 확인하지 않는 이상 정확하게 알 수는 없지만...
      잘 되다가 갑자기 안된다면 무언가 변경된 부분이 있을거라고 생각됩니다..
      사용하고 계신 백신 프로그램에서 감지하지 못하는 악성코드로 인해...
      시스템 파일 혹은 게임 파일의 일부가 변경 혹은 삭제되었거나...
      아니면 OS 업데이트 등으로 인해 시스템 파일이 변경된 부분이...
      게임과 충돌을 일으킨다거나...
      반대로 게임 파일들은 업데이트 되었는데 OS 업데이트를 하지 않아서(?)
      충돌이 발생했다거나...;;
      어디까지나 가능성일 뿐 확답을 드리긴 힘드네요..^^;;;

  5. 가시복 2013.12.23 20:58  댓글주소  수정/삭제  댓글쓰기

    어제새벽에 '데이터 실행 방지' 옵션을 통해 게임실행파일을 그 옵션에 추가시키고 틀더니 더이상 에러가 나지 않았덥니다. 이럴경우 어떤 이유가 있나고 보시나요? 문제가 해결되서 좋긴 좋은데.. 예쩐엔 이렇게 안해도 되었는데 이렇게 된 것을 알고 싶어집니다...ㅠㅠ

    • BlogIcon XeroNic(HS) 2013.12.24 10:49 신고  댓글주소  수정/삭제

      일단 게임이 정상적으로 실행되는 점은 축하드립니다~ :)
      하지만 '데이터 실행 방지' 설정 변경으로 해결이 된 것은 조금 의아하네요... @_@ ;;
      '데이터 실행 방지' 라는 것은 실행이 불가능한 메모리에서 코드가 실행되는 것을 막기위한...
      일종의 보안장치입니다..;;;
      보통은 필수 Windows 프로그램 및 서비스에만 적용되도록 설정이 되어있구요..

      그런데 이 설정을 모든 프로그램에 '데이터 실행 방지'를 사용하되~
      사용자가 지정한 프로그램만 "제외"하는 것으로 해결이 되었다면...
      이 상황을 반대로 풀어보면 가시복님께서 게임을 실행하려고 할 때~
      '데이터 실행 방지' 가 적용된 범위 내에서...
      실행이 불가능한 메모리에서 코드가 실행되었고 그래서 APPCRASH 가 발생했다..;;;
      라고 볼 수 있을 듯 합니다...

      실행이 불가능한 메모리에서 코드가 실행되는 건...;;
      1. 백신에서 감지하지 못한 악성코드가 메모리에서 실행이 되거나...
      2. 게임 파일을 보호하기 위한 실행파일 프로텍터가 걸려있거나...
      3. 스팀같은 게임 플랫폼 혹은 게임 메신저 등의 외부 프로그램이...
      게임 화면을 공유하기 위해 후킹을 하고 있다거나... 하는 정도의 가능성이 있습니다..

      2, 3 의 문제라면 해당 게임을 실행하는 대부분의 유저들에게 공통적으로 발생을 하겠지만..
      그게 아니라면 1 의 문제일 확률이 더 높습니다.
      물론, 악성코드가 아니라 정상적인 프로그램과 게임의 단순한 충돌 문제일 수도 있구요...

      PC 환경을 직접 확인하지 않는 이상 정확하게 파악하기는 힘드네요.. ^^;;;

  6. 가시복 2013.12.24 20:30  댓글주소  수정/삭제  댓글쓰기

    아..악성코드라... ㄷㄷ

    전 사실 타이타내임 2012를 쓰고 있고 가끔씩 프로세스클린과 cc클리너로 레지와 인터넷 익스플로러 찌꺼기들을 매일매일 정리하는 편입니담나.. 이 악성코드를 제거하려면 어떤 유틸리티가 좋은 지 추천드릴수 있을까요?

    • BlogIcon XeroNic(HS) 2013.12.25 10:04 신고  댓글주소  수정/삭제

      위의 댓글에서도 언급했지만...
      악성코드일 "가능성"이 있는 것일 뿐 일반 정상 프로그램과의 충돌일 수도 있습니다.
      그래서 섣불리 어떤 제안을 드리기는 힘듭니다..^^:;;
      다른 백신으로 돌렸는데 악성코드가 아니라면 감지는 안될테고...
      여전히 문제가 해결되지 않는 상태라면 그거야 말로 미안한일이니까요..^^;;

      다만 이것과 별개로 단지 프로그램 추천을 하자면...
      백신은 유료제품으로는 카스퍼스키, 노턴, 무료제품으로는 아바스트 추천합니다...

      다시 한 번 이야기 드리지만...
      악성코드 문제가 아닐 수도 있습니다.

  7. BlogIcon 김형달 2015.02.25 14:31  댓글주소  수정/삭제  댓글쓰기

    안녕하세요.
    kernelbase.dll 관련 에러때문에 서핑하다가 블로그를 발견하고, 메일로 문의 할려고 했는데, 메일주소를 못찾아서 댓글로 물어봅니다.

    회사에서 자동화툴을 만드는데, 여러가지의 exe들이 TASK SERVER (windows 2012 Server OS, 64비트)에서 동시 다발적으로 실행하게 해두었습니다.
    개별적으로 돌리면 잘돌아가는 툴들이, 동시에 돌리면 랜덤하게 에러가 나는데 cmd.exe쪽에서 팝업에러가 나는데, 에러메시지는 다음과 같습니다.
    Main 툴에서 cmd.exe명령어를 호출하여 각 툴들을 실행시키는데, 팝업발생시 어느툴을 실행하다가 팝업을 띄우는지를 알수가 없습니다. cmd.exe에서 죽었으므로..
    "cmd.exe - 응용프로그램 오류
    응용 프로그램을 제대로 시작하지 못했습니다. (0xc0000142). 응용프로그램을 닫을려면 [확인]을 클릭하십시요."
    확인을 누르면 아래와 같은 에러메시지가 나옵니다.
    ================================================
    Problem signature:
    Problem Event Name: APPCRASH
    Application Name: cmd.exe
    Application Version: 6.3.9600.17415
    Application Timestamp: 545042b1
    Fault Module Name: KERNELBASE.dll
    Fault Module Version: 6.3.9600.17630
    Fault Module Timestamp: 54b0e17a
    Exception Code: c0000142
    Exception Offset: 00000000000ec4a0
    OS Version: 6.3.9600.2.0.0.272.7
    Locale ID: 1042
    Additional Information 1: ac05
    Additional Information 2: ac0507478d1c5bd693cfc4fe3987e900
    Additional Information 3: ac05
    Additional Information 4: ac0507478d1c5bd693cfc4fe3987e900

    Read our privacy statement online:
    http://go.microsoft.com/fwlink/?linkid=280262

    If the online privacy statement is not available, please read our privacy statement offline:
    C:\Windows\system32\ko-KR\erofflps.txt
    =================================================

    관련해서 다른사람에게 물어보니
    정상적일때 EXE가 DLL을 로드할때는
    LoadedModule[0]=C:\Windows\System32\rundll32.exe
    LoadedModule[1]=C:\Windows\SYSTEM32\ntdll.dll
    LoadedModule[2]=C:\Windows\system32\KERNEL32.DLL
    LoadedModule[3]=C:\Windows\system32\KERNELBASE.dll
    LoadedModule[4]=C:\Windows\system32\USER32.dll
    순으로 로드를 하는데

    에러난 cmd.exe는 처음 두개DLL밖에 로드를 못해서 에러가 난다고 하는군요.
    관련하여 검색을 해보니 kernelbase.dll이 좀 불안정해서 잘 못만든(?) 32비트용 프로그램때문에 에러날수도 있다고 하네요.
    (저희가 만든툴은 32비트용도 있고 64비트용도 있습니다.)

    열심히 서핑을 하고 있는데, 여기가 가장 심도 깊게 이야기를 다룬곳이라서 초면이지만 문의드립니다.
    혹시 아시는부분 있으시면 조언주시면 감사하겠습니다.

    감사합니다.

    • BlogIcon XeroNic(HS) 2015.02.25 16:38 신고  댓글주소  수정/삭제

      음.. =_=
      사실 이 포스팅이 KERNELBASE.DLL 에러에 대한 내용을 설명한건 아닌데;;;
      에러 관련 문의 댓글이 달리네요.. ^^;;;;

      크래시 발생 원인은 딱 이거다... 라고 정해진게 아니라서
      직접 분석하지 않고서는 확인이 어렵습니다.
      알려주신 정보로는 어떤 부분이 문제가 되는지는...
      알 수가 없네요... (__) ;;

    • BlogIcon 김형달 2015.02.27 13:57  댓글주소  수정/삭제

      예... 긴 글 읽어주셔서 감사합니다. 현재 Python을 쓰고 있는데 psutil이라는 모듈이 GetModuleHandleA라는 함수를 호출하는데 Windows 7후부터는 이함수가 동작을 제대로 안해서 GetModuleHandleW를 사용해야한다는 얘기를 듣고 열심히 디버깅중입니다. 감사합니다.^^ 여기가 제가 본 블로그중 가장 심도깊은 블로그네요.