轉:Thunk 和DEP

來源:互聯網
上載者:User

 

轉自:http://blog.csdn.net/yaosan/archive/2008/06/10/2533545.aspx

 

 

前幾天部落格中說ATL用thunk進行訊息分發。當時覺得很彆扭:堆棧,堆上的記憶體能執行?不是程式碼片段也能執行嗎?保護位什麼時候設定的?後來沒深究,以後得改改這毛病了,不能把疑問留一邊,一定得正視了!

早上起來看雙杯獻酒給我的評論提示我一個上述網址有答案,先謝謝他了!

 

 


Thunk 和DEP 

什麼是 Thunk 

Thunk 技術就是將一段機器碼對應的位元組儲存在一個連續記憶體結構裡,然後把其指標強制轉換成函數, 即用作函數來執行。 


什麼是 DEP 

資料執行防止 (DEP) 是一套軟硬體技術,能夠在記憶體上執行額外檢查以協助防止在系統上運行惡意代碼。在 Microsoft Windows XP Service Pack 2 、 Microsoft Windows Server 2003 Service Pack 1 、Microsoft Windows XP Tablet PC Edition 2005 和 Microsoft Windows Vista 中,由硬體和軟體一起強制實施 DEP 。 


DEP 的主要優點是可以協助防止資料頁執行代碼。通常情況下,不從預設堆和堆棧執行代碼。硬體實施 DEP 檢測從這些位置啟動並執行代碼,並在發現執行情況時引發異常。軟體實施 DEP 可協助阻止惡意代碼利用 Windows 中的異常處理機制進行破壞。 


硬體實施 DEP 是某些 DEP 相容處理器的功能,可以防止在已標記為資料存放區區的記憶體地區中執行代碼。此功能也稱為非執行和執行保護。 Windows XP SP2 還包括軟體實施 DEP ,其目的在於減少利用 Windows 中的例外處理機制的情況。 


我在使用 Thunk 過程 

  

前些天看VCKBAE 上有好多Thunk 的代碼, 就用在項目上了, 程式在我電腦上測試一切正常, 放在伺服器上(Microsoft Windows Server 2003 Service Pack 2) 一開啟, 就掛了, 百思不得解, 在伺服器上裝上VC, 開始調試, 問題找到了Thunk 出了問題, 


找找找, 找了2 天的資料才發現了問題, 在windows xp sp2 上預設是” 僅為基本 Windows 程式和服務啟用 DEP “ 在Microsoft Windows Server 2003 Service Pack2 上預設是”為除下列選定程式之外的所有程式和服務啟用 DEP “ 


在哪裡查看DEP 設定呢? 


我的電腦-> 屬性-> 進階-> 效能-> 設定-> 資料執行防止( 見) 

, 如果 看到” 您的電腦的處理器不支援基於硬體的 DEP 。但是,Windows 可以使用 DEP 軟體協助保護免受某些類型的攻擊。” 就是勾上 ”為除下列選定程式之外的所有程式和服務啟用 DEP “ Thunk 程式也能跑的好好的, 不過, 新的CPU 都是支援硬體DEP 的. 

轉回上面, 我在 Microsoft Windows Server 2003 Service Pack2 以 改成”僅為基本 Windows 程式和服務啟用 DEP ”,Thunk 程式運行正常. 


問題解決了嗎 ?     


當然還沒有解決, 我知道WTL 也用了Thunk 技術, 於是, 用WTl 產生一個Dialog 程式, 在Microsoft Windows Server 2003 Service Pack2 上, 把DEP 設定成回預設的, 運行一下Wtl 的 Dialog, 可以跑起來, 同樣是用Thunk, 這是什麼原因呢, 看ATL 代碼, 原來在這裡 


    result = IsProcessorFeaturePresent( 12 /*PF_NX_ENABLED*/ ); 

  確定處理器的特性 

  如果result 返回True 

          thunkPage = (PATL_THUNK_ENTRY)VirtualAlloc(NULL, 

              PAGE_SIZE, 

              MEM_COMMIT, 

              PAGE_EXECUTE_READWRITE); 


  用VirtualAlloc[PAGE_EXECUTE_READWRITE] 來分配Thunk 代碼的記憶體, 

  到這裡問題解決了. 

  附件代碼  Tunk 代碼在 CallBackTemplate.h 和 CallBackTemplate.cpp 檔案裡 


本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/yaosan/archive/2008/06/10/2533545.aspx

 

下面補充一下:

上述虛擬碼的真實代碼上一下:(Allocate a new page of executable memory !!!)

PVOID<br />__AllocStdCallThunk_cmn (<br /> VOID<br /> )<br />/*++<br />Routine Description:<br /> This function is called by ATL to allocate a thunk structure from<br /> executable memory.<br />Arguments:<br /> None.<br />Return Value:<br /> Returns a pointer to a thunk structure on success. Raises an exception<br /> on failure.<br />--*/<br />{<br /> PATL_THUNK_ENTRY lastThunkEntry;<br /> PATL_THUNK_ENTRY thunkEntry;<br /> PVOID thunkPage;<br /> //<br /> // Perform initialization if this is the first time through.<br /> //<br /> if (__AtlThunkPool == NULL) {<br /> if (__InitializeThunkPool() == FALSE) {<br /> goto outOfMemory;<br /> }<br /> }<br /> if (ATLTHUNK_USE_HEAP()) {<br /> //<br /> // On a non-NX capable platform, use the standard heap.<br /> //<br /> thunkEntry = (PATL_THUNK_ENTRY)HeapAlloc(GetProcessHeap(),<br /> 0,<br /> sizeof(ATL::_stdcallthunk));<br /> if (thunkEntry == NULL) {<br /> goto outOfMemory;<br /> }<br /> return thunkEntry;<br /> }<br /> //<br /> // Attempt to pop a thunk structure from the list and return it<br /> //<br /> thunkEntry = (PATL_THUNK_ENTRY)__AtlInterlockedPopEntrySList(__AtlThunkPool);<br /> if (thunkEntry != NULL) {<br /> return &thunkEntry->Thunk;<br /> }<br /> //<br /> // The thunk list was empty. Allocate a new page of executable<br /> // memory.<br /> //<br /> thunkPage = (PATL_THUNK_ENTRY)VirtualAlloc(NULL,<br /> PAGE_SIZE,<br /> MEM_COMMIT,<br /> PAGE_EXECUTE_READWRITE);<br /> if (thunkPage == NULL) {<br /> goto outOfMemory;<br /> }<br /> //<br /> // See if another thread has replenished the pool while we were off<br /> // allocating memory. This does not close the window but makes it much<br /> // smaller.<br /> //<br /> // The volatile reference moves the overhead of making the page present<br /> // outside of the window.<br /> //<br /> *(DWORD volatile *)thunkPage;<br /> thunkEntry = (PATL_THUNK_ENTRY)__AtlInterlockedPopEntrySList(__AtlThunkPool);<br /> if (thunkEntry != NULL) {<br /> //<br /> // The pool has been replenished. Free the page and use the thunk<br /> // entry that we just received.<br /> //<br /> VirtualFree(thunkPage,0,MEM_RELEASE);<br /> return thunkEntry;<br /> }<br /> //<br /> // Create an array of thunk structures on the page and insert all but<br /> // the last into the free thunk list.<br /> //<br /> // The last is kept out of the list and represents the thunk allocation.<br /> //<br /> thunkEntry = (PATL_THUNK_ENTRY)thunkPage;<br /> lastThunkEntry = thunkEntry + ATL_THUNKS_PER_PAGE - 1;<br /> do {<br /> __AtlInterlockedPushEntrySList(__AtlThunkPool,&thunkEntry->SListEntry);<br /> thunkEntry += 1;<br /> } while (thunkEntry < lastThunkEntry);<br /> return thunkEntry;<br />outOfMemory:<br /> return NULL;<br />} 

XP協助文檔裡面關於DEP有如下描述:

 

瞭解資料執行防止


資料執行防止可協助保護您的電腦免受病毒和其他安全威脅的破壞。這些病毒和威脅嘗試從受保護的記憶體位置運行(執行)惡意代碼來發起攻擊,而只有
Windows
和其他程式才應使用這些位置。這種威脅通過接管程式正在使用的一個或多個記憶體位置來執行破壞操作。之後,它會進行傳播,從而破壞其他程式、檔案乃至您的電子郵件連絡人。

與防火牆或防毒程式不同,DEP 無法協助防止有害的程式安裝在電腦中,而是對您的程式進行監視,確定它們是否能夠安全地使用系統記憶體。要執行監視操作,DEP
軟體既可以獨立運行,也可以與相容微處理器協作,將某些記憶體位置標記為“不可執行”。如果程式嘗試從受保護的記憶體位置運行代碼(無論是否為惡意代碼),DEP
均將關閉程式並向您發送通知。

DEP 可以利用軟體和硬體支援。要使用 DEP,您的電腦必須運行 Microsoft Windows XP Service Pack 2
(SP2) 或更高版本,或者 Windows
Server 2003 Service Pack 1 或更高版本。DEP 軟體獨立運行時可協助防禦某些類型的惡意代碼攻擊,但要充分利用 DEP
可以提供的保護功能,您的處理器必須支援“執行保護”功能。執行保護是一種基於硬體的技術,用於將記憶體位置標記為“不可執行”。如果您的處理器不支援基於硬體的
DEP,則最好將其升級為能夠提供執行保護功能的處理器。

再次運行被 DEP 關閉的程式是否安全?

安全,但前提是您要針對該程式啟用 DEP。Windows
可繼續檢測企圖從受保護記憶體位置執行代碼的嘗試,並能夠協助防止攻擊。如果啟用 DEP 後程式無法正常運行,您可從軟體發行商處擷取與 DEP
相容的程式版本,從而降低安全風險。有關 DEP 關閉程式後應如何操作的詳細資料,請單擊“相關主題”。

如何確定我的電腦上是否啟用了 DEP?

  1. 要開啟“系統屬性”,請依次單擊“開始”、“控制台”,然後雙擊“系統”。
  2. 單擊“進階”選項卡,之後單擊“效能”下的“設定”。
  3. 單擊“資料執行防止”選項卡。

注意

  • 預設情況下,DEP 只針對基本 Windows 作業系統程式和服務啟用。要使用 DEP
    協助保護其他程式,請選擇“為下列程式之外的所有程式啟用 DEP”。 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.