在部分win8、win10最新版專業版及家庭版中,MiniDumper引起程式執行失敗

SunkingYang發表於2018-01-30

 在2017年3月份初,有客戶在報有電腦程式載入不上,其他電腦執行正常故障,一直沒引起注意。最初以為是他們用家庭版,許可權太低的原因,就讓運維幫他們把系統換成專業版,主要是在win7升級win8或win10後,家庭版許可權確實被限制了不少,特別是寫登錄檔或者讀取登錄檔之類的操作,所以ocx外掛出現的問題就比較明顯。

 但在九月份去湖北出差,發現win10專業版,即使是提升到最高許可權,OCX外掛依然載入不上,通過幾番排查,發現是作業系統更新到最新後的問題,最後排查問題出在程式中使用minidumper來記錄程式崩潰時進行寫檔案的操作程式碼有問題,由於當時比較緊急,直接把相關dump程式碼遮蔽了,後面一直沒進行處理。

 直到最近發現現網又出現實時視訊崩潰,跟了好久也沒跟出來,不得不繼續啟用dump記錄,由於時間稍微寬鬆,所以徹底排查了翻,發現引起程式起不來的原因主要是在呼叫了DisableSetUnhandledExceptionFilter函式時引起,再往裡面跟由於

VirtualProtect(addr, size, PAGE_EXECUTE_READWRITE, &dwOldFlag);
WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);
VirtualProtect(addr, size, dwOldFlag, &dwTempFlag);

來看看msdn對VirtualProtect函式的介紹:

MSDN連結

BOOL WINAPI VirtualProtect(
  _In_  LPVOID lpAddress,
  _In_  SIZE_T dwSize,
  _In_  DWORD  flNewProtect,
  _Out_ PDWORD lpflOldProtect
);

lpAddress,要改變屬性的記憶體起始地址。

dwSize,要改變屬性的記憶體區域大小。

flNewProtect,記憶體新的屬性型別,設定為PAGE_EXECUTE_READWRITE(0x40)時該記憶體頁為可讀可寫可執行。

pflOldProtect,記憶體原始屬性型別儲存地址。

修改記憶體屬性成功時函式返回非0,修改失敗時返回0。

如果我們能夠按照如下引數佈置好棧幀的話就可以將shellcode所在記憶體區域設定為可執行模式。

 由此猜想可能是第三個引數是設定許可權的,將上述程式碼改為:

 

VirtualProtect(addr, size, PAGE_EXECUTE_READWRITE, &dwOldFlag);

 再次進行測試,發現程式已經能夠正常執行。由此可以得出結論其實還是作業系統許可權的問題,目前在win10家庭版:版本 10.0.16299.192,win10專業版:版本 10.0.16299.192,已經驗證正常。


相關文章