史萊姆論壇

返回   史萊姆論壇 > 教學文件資料庫 > 作業系統操作技術文件
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


 
 
主題工具 顯示模式
舊 2006-05-30, 01:20 PM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 軟體 - 一個註冊表項的粗略分析

[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"
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
 



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 03:02 AM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1