發表文章

目前顯示的是有「Loader」標籤的文章

Windows Shim (ACT) 在 Windows10 下禁止 Inject Dll 系統實作細節原因

圖片
前言 如果你對 Windows Shim (ACT) 不熟是什麼,建議你可以先參考這篇: 详解Windows Shim的攻防利用 ,這篇很不錯的介紹了 Windows Shim 相容性工具如何被惡意濫用進行攻擊。另外還有一篇俄羅斯的文章介紹的也不錯: shim handlers 。 前陣子在做一份玩具需要做到對單一 Process 每次開機重啟都能穩定 hook 住固定 API 作檢測,第一個想到最穩定的做法當然是 TMD 幫該執行程式打一層補丁 (Shim) 指定該 Process 每次開機重啟都會加載我的 *.dll,接著就可以做熱修復(Hot Patch)這做法很漂亮,一個簡單 *.sdb 就能簡單起到穩定的 *.dll 同一 Process 穩定注入,不過... 對,Windows 10 不給玩這招了,你在 Windows 10 下打上 Inject Dll 的補丁是會被無視的 QQ,最近時間比較充裕 並沒有,只是突然很想知道為什麼不給這樣搞  花了大概一小時的時間把 Windows 7 與 Windows 10 的 Loader 實作細節分析完畢,然後就大概摸出了問題點在哪...囧。 PE Loader (at ntdll.dll) on Windows 7 如果你跟我一樣吃飽太閒(不過其實打這篇文章的時候我好餓喔...好想吃滷肉飯)翻一下 ntdll.dll 的實作你應該可以看到一支 *.exe 被執行起來後,要開始做程式必備初始化的修復動作,這些步驟可以看到在 ntdll!LdrpInitializeProcess 內實作: 如果你有開 IDA Pro 的話上下捲捲捲就可以看到這個函數內在初始化 Process 時候,會按造順序分配堆疊必備的記憶體空間、分配各區段對應在虛擬地址上、修正重定向、最後修正了引入函數表(IAT, Import Address Table)而這幾大修正步驟過程中,根據 Shim 的需求可能會需要在載入 DLL 之前、期間、之後,各階段插入不同的行為來完成打補釘的行為。 每次要讓 Shim 機制介入打補釘時,就會呼叫 ntdll!LdrpLoadShimEngine 函數來載入 Shim 引擎,如果完成該階段的目標後,就會呼叫 ntdll!LdrpUnloadShi...