透過windows 8 應用程序分析OS API 之Kernel32.dll

    Metro UI 已經出來很久了,看了很多metro UI 的應用程序,不知道是不是MS藉助託管又下的一盤棋,主要分析三個問題。1. 是不是託管? 2.是不是win32 上進行了直接包裝?

1. 用visual studio 建立一個metro UI 的程序,編譯完畢,然後看看exe 到底張什麼樣子,首先看看exe 到底依賴那模塊庫,如果是託管,那麼一定依賴託管運行期,

從上圖我們可以直接看到,這個exe 似乎不是依賴 託管運行期,但是有導出函數,

熟悉COM的話對這幾個導出函數一定不會陌生,至少樣子上看起來想,那也就是說Ms之前說的基於COM 技術看來是真的。看來不但可以進程外,還可以進程內。

2.運行了一個cmd.exe 程序,我們可以用process xp 看到如下,

可以看到cmd.exe 已經再是原來的cmd.exe ,但是下面還是掛着一個conhost.exe , 這個exe 的功能是什麼?,這個conhost.exe  這個exe 使用了Com 進程外服務器的方式,並沒有提供導出函數。可以分析進程通信上下斷點。(這個部分放在下一篇中。。呵呵)。

  用windbg 將conhost.exe  掛起,我們在kernel32.dll 中的createprocess 上下斷點,因爲這個函數根據以前的MSDN在kernel32.dll 中,

我們透過cmd.exe 創建一個進程,看看怎麼樣,居然沒有攔截到, 看來問題不是那麼簡單,然後 KERNEL32!ReadFile 上下斷點,這次果然斷點有效果,如下圖,

直接走kernelbasse!createProcessW,  怎麼突然多了一個dll 出來,這個應該是Win 8 新引入的對kernel 的封裝,然後專門爲metro UI 提供底層支持吧,不過這些都是猜想,但是從上圖已經很明顯了,這個調用已經不再走kernel32了。 爲了驗證kernel base 是新提供的功能封裝,我們用Window32程序測試一下。

3. Win32 程序kernel 調用

HMODULE hMod = LoadLibrary(_T("Kernel32.dll"));
	if ( hMod != NULL )
	{
		FARPROC thisProc = GetProcAddress(hMod, "CreateProcessW");
		if ( thisProc )
		{
			printf("Address of CreateProcessW is 0x%x\n", thisProc);
			STARTUPINFO startinfo={sizeof(startinfo)};
			PROCESS_INFORMATION pi;
			PCreateProcess CreateProcessF = (PCreateProcess)(thisProc);
			BOOL bRet = CreateProcessF(
				NULL,
				_T("notepad.exe"),
				NULL,
				NULL,
				FALSE,
				0,
				NULL,
				NULL,
				&startinfo,
				&pi);


		}

		FreeLibrary( hMod );
第一個,我們就是要驗證kernel32.dll 還導出這個函數不,第二個我們看看kernel32.dll 是不是以後直接系統調用看下圖:


可以看到stack 現在在kernel32.dll 中,但是到了地址0x771243B1的jmp 語句,就出現了kernelbase.dll ,  那麼這個就是dll 中的函數導出,kernel32.dll僅僅是使用了dll 函數bind 技術,這樣看起來僅僅是MS 爲了兼容以前的Windows 程序不得不做的bind.

其實我們在windbg 上一可以看到,看下圖


可以看到上圖中,明顯是調用到kernelbase的readfile ,看來MS用kernelbase 來統一天下了。

要給老婆做飯了,不得瑟了。下次見。

kernelbase!會不會到nt層也許就是下次的主要內容了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章