1. 程式人生 > 其它 >Dotfuscator混淆後不能執行的問題

Dotfuscator混淆後不能執行的問題

是這樣的,在開發一個軟體後,想用程式碼混淆工具進行混淆,在試用了ConfuserEx,DotNETReactor,MaxtoCode,Dotfuscator等工具後,發現一個問題,再混淆之後,程式無法執行,會報錯。如下圖:

這下好了,由於考慮到並未引用其它程式集,該程式都在一個程式集下,那麼估計多半是程式碼導致。因為混淆工具大部分功能是依靠反射,將原始碼獲取後重新整理,進行的是名稱或是字串混淆;而流程混淆理論上在同一個程式集下的程式,因為並不含本程式集外的流程,即便混淆改變也通常是不會導致報錯的。

所以,解決之道就是:第一步找到會引發報錯的程式碼位置,第二步混淆的時候將其排除在外就可以了。

這裡有了思路,於是開始找報錯位置。實際操作,其實還有一步要先操作,就是確定哪些混淆工具支援排除項,簡單操作試了下,覺得Dotfuscator可以,於是就採用了這個軟體,通過排除法來確定混淆出錯的程式碼位置,使用方式參考這個連結Dotfuscator使用。這裡一個個排除比較麻煩,於是想到有個大問題:反射可不可以混淆?理論上。。。應該可以的,不過,好象也聽過反射混淆後不能執行的案例。由於本專案採用了反射,因此首先懷疑是反射導致。

查詢所有用反射的地方,選擇其中一個排除混淆,看前後混淆結果對比。起初試了幾個,發現沒有什麼差別,都可以,再多試了幾次之後,發現了有的地方不同,從而確定了反射可能會導致混淆失敗的結論。

其出錯程式碼在這句:

return Image.FromStream(Assembly.GetExecutingAssembly().GetManifestResourceStream(MethodBase.GetCurrentMethod().DeclaringType.Namespace + "." + imagePath));
於是採用最小化排除的方式,進入rename後exclude中排除含有此程式碼的方法來混淆

實測依然有問題,點選執行依然報錯。用反編譯工具檢視此方法函式程式碼如下:

public static Image ᜀ(string A_0)
{
return Image.FromStream(Assembly.GetExecutingAssembly().GetManifestResourceStream(MethodBase.GetCurrentMethod().DeclaringType.Namespace + ᜋ.b("ᴲ", 11) + A_0));
}
發現方法名已經混淆了,看來是沒有排除成功。接著如下圖多勾選上級的類名稱,然後點選混淆,驚喜的是,這次成功執行!原因嘛應該是該方法為靜態方法,呼叫該方法會引用類名稱,所以上級的類名稱也要勾選。

至此問題得以解決,檢視反編譯的程式碼,可以看到函式方法名得以排除,看來排除成功了,所以混淆後能夠執行。

總結經驗:經實際除錯發現,反射確實可能導致混淆失敗,例如上面通過反射要再次獲取方法,而單純獲取程式集的資訊是不會導致失敗的。在混淆的時候,記得進行排除,排除的時候還要指定該類的此方法,例如上面既勾選類名,又勾選方法,就可以了。更深層次的原因,推測可能是程式集資訊和程式集本身是同一層;而程式碼中用反射獲取方法,外部再用反射混淆就是兩層了,所以會失敗。

另外一點需要注意的是,請用相同版本生成的exe來開啟,例如我用VS2010開發的基於.net framwork4.0的軟體,用VS2019開啟並生成exe,在Dotfuscator4.9中開啟就會報錯,startIndex不能大於字串長度,同理改為net framwork4.5生成軟體也會報此錯

解決方式就是用VS2010重新生成,之後在Dotfuscator4.9中開啟就沒有問題了。理解起來就是,你是用什麼環境創造的,就應當用同樣的環境混淆(偽裝)它。
————————————————
版權宣告:本文為CSDN博主「習明然」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/u014650759/article/details/90448074