題:
在Olly或CFF Explorer中修補.Net 4.0二進製文件
4r4r4r
2013-06-14 22:07:23 UTC
view on stackexchange narkive permalink

我遇到了用C#.net 4.0編譯的挑戰。我可以在Reflector中看到源完全正常。我想更改來源。我想我是通過修補二進製文件中的某些字節來完成此操作的。

我面臨的問題是在Ildasm.exe中加載二進製文件時,我無法將這些ID_xxxx地址轉換為RVA或在CFF中找到它們的相應字節資源管理器。以這種方式修補.net exe的典型方法是什麼?我閱讀了lena的一些教程,因此通常我會將其加載到Olly中,並且嘗試了此操作,但我看不到任何有用的代碼,大多數操作似乎發生在各種Windows .dll中,而不是在.exe中。

如果有人可以提供建議或為我提供指導,我將不勝感激。謝謝。

更具體地說,我想在try塊內修補一個調用。 Ildasm.exe報告IL_0039的地址(在CFF中不對應)
有點離題,但是在不混淆程序集的情況下通常要做的是:使用ildasm來反彙編程序集,根據需要修改IL並使用ilasm重新組裝。
是的,聽起來不錯。找不到任何教程,也找不到如何從Ildasm.exe進行修改的方法,請您多說明一點嗎?
另外,我正嘗試打個電話。有問題的字節為2885。我知道28字節表示“呼叫”。我嘗試將它們更改為00,我認為這是該語言的NOP(正常為90字節),但是它搞砸了。
我讓您知道如何自己撥打電話!
三 答案:
Remko
2013-06-15 18:52:05 UTC
view on stackexchange narkive permalink

有一個名為 Reflexil的Reflector插件,它使修補.NET二進製文件非常容易。

Reflexil是一個程序集編輯器,並作為Red Gate的Reflector和Telerik的JustDecompile的插件運行。 Reflexil使用的是由Jb Evain編寫的Mono.Cecil,並且能夠操縱IL代碼並將修改後的程序集保存到磁盤。 Reflexil還支持C#/ VB.NET代碼注入。

最近我舉了一個例子,在我的博客上做了寫文章

不錯的文章。我認為Reflexil絕對是完成工作的最簡單方法,但也知道如何做其他方法也很好。
dna
2013-06-15 01:31:39 UTC
view on stackexchange narkive permalink

請考慮以下.NET 4.5控制台應用程序:

 使用系統;命名空間ReversingMSIL101 {類程序{static void Main(string [] args){if(args.Length > 0 && args [0] ==“秘密”)Authenticated(); else Anonymous(); } private static void Authenticated(){Console.WriteLine(“人民的金子!”); } private static void Anonymous(){Console.WriteLine(“給他們銅幣...”); }}}  

編譯並打開Ildasm。我們將從加載可執行文件(文件->打開)開始。完成後:將其轉儲(文件->轉儲)。 Ildasm會在一個充滿複選框的對話框中進行響應,因為我們需要盡可能多的信息,請檢查所有內容!

現在讓我們看一下我們反彙編的IL指令,啟動您喜歡的編輯器並打開以前的生成的轉儲。我們對 if 語句特別感興趣,因為它控制所提供的 password 是否正確;請注意,您可以使用生成的註釋輕鬆地找到它。

  // 000009:if(args.Length > 0 && args [0] ==“ Secret”)IL_0001:/ * 02 | * / ldarg.0IL_0002:/ * 8E | * / ldlenIL_0003:/ * 69 | * /轉換為i4IL_0004:/ * 16 | * / ldc.i4.0IL_0005:/ * 31 | 12 * / bless IL_0019IL_0007:/ * 02 | * / ldarg.0IL_0008:/ * 16 | * / ldc.i4.0IL_0009:/ * 9A | * / ldelem.refIL_000a:/ * 72 | (70)000001 * / ldstr“ Secret” / * 70000001 * / IL_000f:/ * 28 | (0A)000011 * /調用bool [mscorlib / * 23000001 * /] System.String / * 01000013 * / :: op_Equality(string,string)/ * 0A000011 * / IL_0014:/ * 16 | * / ldc.i4.0IL_0015:/ * FE01 | * / ceq
IL_0017:/ * 2B | 01 * / brss IL_001aIL_0019:/ * 17 | * / ldc.i4.1IL_001a:/ * 00 | * / nopIL_001b:/ * 0A | * / stloc.0IL_001c:/ * 06 | * / ldloc.0IL_001d:/ * 2D | 08 * / brtrue.s IL_0027  

我讓讀者執行反轉和分析指令的任務。我們將繼續看最後一個。長話短說:如果第一個參數不是字符串“ Secret” ,我們將轉到該分支並以 IL_0027 結尾:

  IL_0027:/ * 28 | (06)000003 * /調用void ReversingMSIL101.Program / * 02000002 * / :: Anonymous()/ * 06000003 * /  

還不錯嗎?因此,我們將稍微調整最後一條指令,此外,將其替換為 brfalse.s

  IL_001d:/ * 2B | 08 * / brfalse.s IL_0027  

就這樣,我們完成了!保存文件並打開外殼,導航到包含IL轉儲的文件夾,然後發出 ilasm ReversingMSIL101.il 以便將轉儲重新組裝為可執行文件!

現在是時候驗證我們的工作:

  C:\ Users \ dna \ Documents \ Visual Studio 2012 \ Projects \ ReversingMSIL101 \ ReversingMSIL101 \ bin \ Debug>ReversingMSIL101.exe IdoNotKnowGold供人們使用! 
>
很棒的教程!感謝您抽出寶貴的時間來編寫它。我最終在http://resources.infosecinstitute.com/dot-net-reverse-engineering-part-2/使用了字節碼圖表。從那裡開始,這是一個奇怪的計劃,但是您可以重建ILDasm.exe中顯示的字節序列,並在十六進制編輯器中搜索它們並進行更改,但是如果未將它們更改為可接受的字節,則會使程序混亂。仍然沒有接到正確打no電話的電話,將繼續搜索。瘋狂的如何在這些.net程序中,您只能查看裸露的源代碼!
好吧,CALL指令是0x28 + <4個字節的令牌>,因此您必須總共NOP(0x00)5個字節。
經過一些測試,我發現根據調用的不同,您不能僅對5個調用字節本身進行nop。您必須先獲得ldloc和stloc調用,否則必須執行args推送,特別是如果函數看起來像.net中的Test(test1,test2(test3))。Testing()時,尤其如此。我不太喜歡這種中介語言。我也想知道如何在Olly中進行動態分析,我對此不太了解,我認為修補cmp / jnz會比這容易。
有道理,我完全忘記提及展開堆棧。好吧,我從來沒有在Olly中做到這一點,但是當他將MSIL方法編譯為本地指令時,您將不得不發現JIT。可能不那麼聰明,因為您會失去便攜性和時間,但這應該很有趣:)
Reflexil會自動處理某種類型的簽名例程,MS放置在其中以防止在更改此類字節時也需要進行地址尋址的補丁。
假設您說的是強命名程序集。 SN(http://msdn.microsoft.com/zh-cn/library/k5b5tt23(v=vs.71).aspx)是您的朋友!您可以註冊一個程序集以跳過驗證,使用新密鑰對其重新簽名或延遲對其進行簽名。這可能是Reflexil在後台執行的操作。
John.Rogers
2013-06-15 12:36:43 UTC
view on stackexchange narkive permalink

儘管dna的答案很好並且得到了很好的解釋,但對於現實世界中的可執行文件來說,這通常是不切實際的,除非它們非常簡單和簡短。轉儲某些內容,對其進行更改並進行“重新編譯”是容易出錯的,尤其是在混淆的程序集等中。

我建議您下載 Reflexil,它是 Reflector插件:您可以通過Reflector查看正在查看的功能的IL,以非常簡單的方式更改需要更改的內容,然後保存已修改的exe。因為您不是從頭開始轉儲和重建程序,所以這樣不容易出錯。另外,您可以通過這種方式將任何東西注入到程序集中,無論是類,新方法還是結構。

OP要求提供一個清晰的示例,在這種精確的情況下,依靠彙編程序更不會出錯!由於將在組裝過程中檢測到錯誤。注入部分很有趣,我通常依靠Cecil(http://www.mono-project.com/Cecil),因為它是開源的,可以讓您添加/刪除/修改部件中的任何內容並保存修補的內容!
提醒一下,Reflexil不僅適用於Reflector,還適用於ILSpy(開源)和JustDecompile。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...