楔子
.Net 7的一個重要功能是把託管的原始碼編譯成Native Code,也就是二進位制檔案。此舉看似增加了程式反編譯難度,實際上是減少了程式的破解難度。本篇在不觸及整個程式架構的前提下,以簡單的例子來修改Native AOT exe檔案的輸出字串。
例子
Console.WriteLine("Hello, World!");
Console.ReadLine();
搞一個簡單的HelloWorld example,來舉例下非常簡單的破解之道。
UltraEdit
這裡需要用到一個16進位制的編輯器工具:UltraEdit.這個東西可以去搜尋引擎搜尋下就可以得到。
把以上簡單的程式碼編譯成Native AOT檔案之後,生成一個exe檔案。把這個exe檔案拖到UltraEdit裡面去。
破解
下拉UltraEdit到地址0046F09C處,可以看到:48 00 65 00 這四個byte。十六進位制的0x48和0x65是上面.Net程式輸出的語句的Hello, World! 前面的He兩個字串的ASSIC碼。
右鍵UltraEdit修改,把48 00 66 00修改成:49 00 66 00,如上圖所示。然後再開啟native AOT的exe檔案發現本來的Hello, World!變成了Ifllo, World!。如下圖所示。
沒修改前:
修改後
原理
它的原理也非常簡單,只要看下.Net 程式的Console.WriteLine函式的引數地址是多少,一般在彙編層面是用RCX暫存器來表示。所以你只要找到RCX暫存器的地址,注意它在哪個Section,進行相應的計算就可以找到字串Hello World在二進位制檔案裡面的地址。進而進行修改。
結尾
這種修改還有很多地方,比如修改函式的跳轉,修改功能性的缺失,修改整個程式的架構。整個程式像個篩子。
作者:江湖評談