Windows 7에서의 커널 변경

아래 포스트들은 Windows 7 에서 커널이 변경된 것에 대한 글들 입니다.

 

Windows 7 에서 kernel 이 변경되었습니다. 아래 블로그에 따르면 api-ms-win-core….dll 과 같은 파일들이 많이 추가되었다고 합니다. Dependency walker를 사용해서 Advapi32.dll을 열어 보면 API-MS-Win-Core… 과 같은 dll 들을 많이 Import 하고 있는 것을 보실 수 있습니다. 그리고 이 dll 들이 advapi32에서 export 하고 있는 것과 동일한 함수들을 export 하고 있는데 실제로 함수의 내용을 보면 단순히 return 하는 것으로 되어 있습니다. adapi32 의 코드를 확인해 보면 api-ms-win-core 에서 Import 한 함수를 호출하는 것을 볼 수 있는데 실제로 WinDbg를 사용해서 Load 해보면 api-ms-win-core 들을 Import 했던 Import Table 의 Address 가 kernel32 의 것으로 변경되어 있는 것을 확인할 수 있습니다.

이러한 변화 때문에 분석/디버깅을 위해 만들어진 애플리케이션들이 오동작할 수 있습니다.

새로운 dll로 kernelbase.dll 이 있는데 Windows 7 이전에는 kernel32.dll 함수들이 ntdll.dll 함수를 호출하였습니다. Windows 7 부터는 kernel32 는 kernelbase를 호출하게 되고 kernelbase 는 ntdll을 호출하게 됩니다. 이러한 변화는 Windows 7 부터 Winwin kernel 이 적용되어서 라고 합니다.

Windows 7 Kernel Architecture Changes - api-ms-win-core files

https://www.nirsoft.net/articles/windows_7_kernel_architecture_changes.html

 

아래 포스트 에서는 Mark Russinovich 가 Winwin에 대해서 언급한 말을 정리한 것 입니다. Windows kernel 을 작게 만들기 위해 MinWin 이라는 것으로 API를 재 구성하였다고 하고 그 핵심에 kernelbase.dll 이 있다고 합니다. 이전의 kernel 은 아주 깊은 레벨의 함수에서 상위 레벨의 콜을 호출하는 코드가 많이 있었다고 합니다. (10 단계의 깊이까지 내려간 함수가 2단계의 깊이의 함수를 호출할 필요가 있었다고 합니다.) Winwin 에서는 이 함수들을 제 조정하여 커널을 다시 재 구성하였다고 합니다.

Robert McLaws: Windows Vista Edition

https://www.windows-now.com/blogs/robert/mark-russinovich-explains-minwin-once-and-for-all.aspx

 

함수 포인터를 얻기 위해서 보통 kernel32.dll의 GetProcAddress 와  LoadLibraryA 함수를 사용하는데 Windows 7 에서 kernelbase.dll 이 적용되면서 이 방식이 약간 변경되었다고 합니다.

Friday 19 June 2009 - Retrieving Kernel32's Base Address

https://www.harmonysecurity.com/blog/2009/06/retrieving-kernel32s-base-address.html