2012-10-11 43 views
7

我試圖反編譯爲我的Windows商店應用到C#ComboBox控件,但沒有代碼。相反,所有的屬性都是調用一個單獨的程序集,看起來像。如何找到真正的代碼存在的地方,以及如何閱讀C#中的方法體?我不能閱讀組裝,這樣就會對我沒什麼好反編譯.winmd文件包含什麼,但外部調用

回答

1

所以我找到了組裝。您只需搜索系統上的.dll文件(例如Windows.XAML.UI.Controls.dll),但無法將其反彙編到C#中。原來有針對WinRT的組件沒有C#反編譯器(至少,當我看到最後)

+0

如果想查看彙編代碼,IDA應該可以工作。 – sarvesh

+0

@iaimtomisbehave提醒我,我忘記提及的是尋找C#代碼,而不是彙編代碼。我沒有嘗試去反彙編,也不能說是否有效。我編輯了這個問題來反映這一點。 – CamronBute

14

如何反向工程的WinRT內部的一些注意事項。
引擎蓋下,WinRT是純粹的COM。你想看看你的機器上的第一個地方是

C:\Program Files (x86)\Windows Kits\8.0\Include\WinRT 

這個目錄包含IDL文件,或Interface Description Language。 IDL是描述COM類型的起點。對於ComboBox快速搜索將讓你找到Windows.UI.Xaml.Controls.IDL併爲ComboBox類型聲明:

[marshaling_behavior(agile)] 
    [threading(both)] 
    [static(Windows.UI.Xaml.Controls.IComboBoxStatics, 0x06020000)] 
    [version(0x06020000)] 
    [composable(Windows.UI.Xaml.Controls.IComboBoxFactory, public, 0x06020000)] 
    runtimeclass ComboBox : Windows.UI.Xaml.Controls.Primitives.Selector 
    { 
     [default] interface Windows.UI.Xaml.Controls.IComboBox; 
     [overridable] interface Windows.UI.Xaml.Controls.IComboBoxOverrides; 
    } 

這是有點可讀原來的樣子,象在C#中的接口聲明。如果您之前曾使用COM進行過修飾,那麼您將會看到來自原始IDL語法的新屬性。額外的東西,以幫助語言投影內置到您的運行時支持庫中,以創建WinRT支持實現繼承,泛型和靜態類成員的錯覺,這是純粹的COM沒有的功能。

這些IDL文件由midlrt.exe編譯成是一樣的編譯器的工具一起使用的機器可讀的格式。您已經知道該格式,midlrt.exe的輸出是.winmd文件。與舊的類型庫類似但增強得多,底層格式採用從.NET's assembly manifest format。因此,反編譯.winmd文件並不有用,因爲您的計算機上已有源代碼;)

正如COM中常見的一樣,註冊表用於查找包含COM服務器代碼的可執行文件。開始regedit.exe並導航至HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId。您可以找到應用程序可以創建的所有WinRT類型的列表。該Windows.UI.Xaml.Controls.ComboBox關鍵是一個你感興趣的注意DllPath值,指向包含代碼的DLL:我的機器上C:\Windows\System32\Windows.UI.Xaml.dll。 CLSID值是熟悉的COM類guid,用於請求類工廠創建實例。

這就是你撞到牆的地方;該DLL包含像大多數COM服務器一樣的本地代碼。用C++編寫並編譯爲機器碼。相當反編譯,它是一個18兆字節的怪物。