.Net 7 的AOT的程序比託管代碼更容易破解?

楔子

.Net 7的一個重要功能是把託管的源碼編譯成Native Code,也就是二進制文件。此舉看似增加了程序反編譯難度,實際上是減少了程序的破解難度。本篇在不觸及整個程序架構的前提下,以簡單的例子來修改Native AOT exe文件的輸出字符串。



例子

Console.WriteLine("Hello, World!");
Console.ReadLine();

搞一個簡單的HelloWorld example,來舉例下非常簡單的破解之道。



UltraEdit

這裏需要用到一個16進制的編輯器工具:UltraEdit.這個東西可以去搜索引擎搜索下就可以得到。
把以上簡單的代碼編譯成Native AOT文件之後,生成一個exe文件。把這個exe文件拖到UltraEdit裏面去。



破解

image

下拉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!。如下圖所示。

沒修改前:
image

修改後
image



原理

它的原理也非常簡單,只要看下.Net 程序的Console.WriteLine函數的參數地址是多少,一般在彙編層面是用RCX寄存器來表示。所以你只要找到RCX寄存器的地址,注意它在哪個Section,進行相應的計算就可以找到字符串Hello World在二進制文件裏面的地址。進而進行修改。



結尾

這種修改還有很多地方,比如修改函數的跳轉,修改功能性的缺失,修改整個程序的架構。整個程序像個篩子。

作者:江湖評談
image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章