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層也許就是下次的主要內容了。