|
論壇說明 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2006-05-30, 01:20 PM | #1 |
榮譽會員
|
軟體 - 一個註冊表項的粗略分析
[HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options]
註冊表的這個項大家可能還不太熟悉,因為這個主要是用來除錯程式用的,對一般用戶 意義不大。預定是只有管理員和local system有權讀寫,一般user只讀。 先做個實驗:在這個項下新增一個子項「test.exe」,再建一個字串值「Debugger」, 數值資料設為「cmd.exe /c echo」,隨便把一個EXE文件改名為「test.exe」,然後在命令 行調用「test.exe」,得到的螢幕輸出不是test.exe的輸出,而會是這樣: E:\>test test E:\>test.exe test.exe Windows NT系統在執行一個從命令行調用的可執行文件執行請求時,首先會檢查這是否 是一個可執行文件,如果是,又是什麼格式的,然後就會檢查是否存在: [HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ImageName] 如果存在,首先會試圖讀取這個鍵值: [HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ImageName] "Debugger"="debug_prog" 如果存在,就執行「debug_prog ImageName」,剛才的例子中,其實系統真正執行的是: cmd.exe /c echo test cmd.exe /c echo test.exe 如果「debug_prog」設為一個不在搜索路徑中的程式,會得到一個很有趣的提示:「系 統找不到文件 E:\test.exe」。而事實上test.exe就在當前目錄下,這裡所謂找不到的其實 是那個「debug_prog」。而只要設置了test.exe這個項,既使test.exe不存在,也不會提示 「系統找不到文件」,控制台上不會返回任何輸出。 系統在執行任何一個可執行程式時都會先檢查這個鍵值。這個特性可以被用來放置後門。 這一點,在以往的Windows 安全資料中尚未提到過。如果你有一個Windows 2000安全檢查列 表,請把它加進去。 這個項支持的值,在Windows 2000下我找到的有: ApplicationGoo Debugger PageHeapFlags DisableHeapLookAside DebugProcessHeapOnly PageHeapSizeRangeStart PageHeapSizeRangeEnd PageHeapRandomProbability PageHeapDllRangeStart PageHeapDllRangeEnd GlobalFlag BreakOnDllLoad 這些項的工作都只與文件名有關,與路徑無關。 其中,Debugger上面講過了。DisableHeapLookAside可以用來糾正一些應用程式執行時 的問題。從Windows NT SP4開始,Windows 系統使用了新的堆(heap)管理機制,新的動態 記憶體分配使得應用程式佔用更少的記憶體(也使寫Exploit更加困難:-)),但是也有些應用程 序在這種機制下無法正常執行,會掛起或出錯。這種情況下,以該文件名建一個項,並把 DisableHeapLookAside 設為「1」,會強迫系統對此應用程式不使用新的堆管理機制。(基 於一般系統的堆溢出 Exploit,在應用程式改變了執行方式後是不是會失效?那麼,對關鍵 程式使用這一手段,在某種意義上,也是一種抵禦溢出攻擊的方法。) 關於DisableHeapLookAside更多的訊息請參考微軟知識庫:Q252902,Q195008,Q195009。 有趣的是,Windows 2000在安裝的時候,就預設了這幾個文件名的DisableHeapLookAside: enc98.EXE f32main.exe prwin8.EXE ps80.EXE qfinder.EXE qpw.EXE ua80.EXE wpwin8.EXE 大概是微軟收到了有關這些應用程式執行異常的報告吧:-)。 BreakOnDllLoad 是用來除錯DLL的,譬如某個ISAPI。可以在DLL剛一裝入就設置中斷點。 可以參考Rick Strahl的《Debugging IIS5 ISAPI Applications with VC++》 ApplicationGoo我沒有找到相關資料,但從微軟預設的值來看,這個項裡存放的是文件 的版本訊息。我猜想是否用這個來匹配特定版本的文件。 剩下來的這幾個值雖然我知道它們是確實存在的,卻無法找到任何有關的資料,甚至在 MSDN裡也隻字未提,還好它們的名稱基本上已經把用處說清楚了:-),都是用來控制heap 的。 希望這幾個值對正在埋頭研究Windows堆溢出的朋友們能有一點點幫助。 附加訊息: 在XP中,這個項下面還支持ShutdownFlags這個值。下面是微軟的描述: Leak Detection when the Process Is Exiting Leak detection is made every time a process is cleanly exiting. It doesn't work if the process is terminated with TerminateProcess() or TerminateThread() / ExitThread() for the last thread in the process; but for most applications this is not a problem. To enable leak detection when the process is exiting, set the registry key as follows: [HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ImageName] "ShutdownFlags"="3" |
送花文章: 3,
|