2009-08-11 69 views
3

將/ TSAWARE鏈接器標誌添加到我的項目之一(Visual Studio 6)後,我驚訝地發現PE文件(.idata)中有一個新節。如果我不設置標誌,則導入將合併到.rdata中。/TSAWARE鏈接器標誌對PE可執行文件做了什麼?

爲了說明 「問題」,我們開始了一個簡單的控制檯程序:

#include <stdio.h> 
int main() 
{ 
    printf("hello world\n"); 
    return 0; 
} 

和編譯:cl /Og /O1 /GF /WX /c main.c

然後用

  • link /MACHINE:IX86 /SUBSYSTEM:CONSOLE /RELEASE /OUT:a.exe main.obj
  • link /MACHINE:IX86 /SUBSYSTEM:CONSOLE /RELEASE /OUT:b.exe /TSAWARE main.obj
  • 鏈接

讓我們比較DUMPBIN輸出:

Dump of file a.exe 

File Type: EXECUTABLE IMAGE 

    Summary 

     4000 .data 
     1000 .rdata 
     5000 .text 

Dump of file b.exe 

File Type: EXECUTABLE IMAGE 

    Summary 

     4000 .data 
     1000 .idata 
     1000 .rdata 
     5000 .text 

所以,出於某種原因,鏈接器決定進口不能合併。

但是,如果我們運行editbin /TSAWARE a.exe,則只有PE可選標題中的DLL特徵字段發生更改。

任何人都可以解釋這一點嗎?這是鏈接器中的錯誤還是可以通過editbin更改可執行文件最終不能在某些系統上工作?

回答

4

只有一個猜測:在終端服務器系統上,您希望圖像儘可能寫入幾頁。如果沒有修改與圖像對應的內存頁面,則可以將單頁物理RAM映射到使用該圖像的eash會話中。如果修改了映像中的頁面,則系統必須對所有會話中的每個頁面實例執行寫入時複製操作,並使用不同的物理內存塊來表示每個會話中的頁面。

由於如果導入的DLL必須重新定位,通常需要修正映像的導入,因此導入的頁面經常會被修改,因此無法參與會話之間的共享。如果鏈接器將導入與其他通常未修改的數據合併,則可能會不必要地增加寫入時複製頁面的數量。

這可能是一種優化,有助於減少跨會話複製的頁面數量。

就像我說的那樣 - 這純粹是一種猜測。

+0

這也是我的猜測,除非有人從MS回覆,我想我們永遠不會知道。 – Anders 2009-08-31 16:48:23

+1

根據Microsoft自己的文檔,/ TSAWARE鏈接程序標誌將EXE PE標誌設置爲禁用C:\ Windows主目錄重定向,註冊表重定向和其他TS環境攻擊,旨在保護您在運行不支持TS的應用時一個TS環境。 – 2011-11-21 17:54:18

1

來自@WarrenP的評論是正確的。按照MSDN documentation

的/ TSAWARE選項在程序圖像的可選頭中IMAGE_OPTIONAL_HEADER DllCharacteristics場設置一個標誌。當 設置此標誌時,終端服務器不會對 應用程序進行某些更改。

當一個應用程序是不是終端服務器感知(也稱爲 遺留應用程序),終端服務器做某些修改 遺留應用程序,使之在多用戶環境 正常工作。例如,終端服務器將創建一個虛擬的 Windows文件夾,這樣每個用戶將獲得Windows文件夾而不是獲取系統的Windows目錄的 。這使用戶可以訪問他們自己的INI文件 。此外,終端服務器會針對傳統應用程序對註冊表進行一些調整 。這些 修改會減慢終端 服務器上傳統應用程序的加載速度。

如果應用程序是終端服務器可識別的,它不能依賴 INI文件,也不能在安裝過​​程中寫入HKEY_CURRENT_USER註冊表。

如果您使用/ TSAWARE並且您的應用程序仍然使用INI文件,則 文件將由系統的所有用戶共享。如果這是可接受的 ,則仍然可以將應用程序與/ TSAWARE鏈接; 否則你需要使用/ TSAWARE:NO。

這裏只暗示了一件事情,那就是隻有對於不知道TS的進程啓用了影子鍵。

+2

這個問題與修改後的鏈接器行爲有關,超出了文檔描述的範圍 – 2012-12-21 04:14:42

相關問題