.Net Reactor 是一款比較不錯的混淆工具,比VS自帶的那個好用很多,一直以來也陪伴著我們的成長,雖然沒有完美的混淆工具,不過也算還是不錯的,至少能在一定程度上對DLL進行一定的保護處理,
不過最近客戶反映我們在混合框架洗掉操作的時候,沒有如期的實作洗掉操作,由于混合框架是基于Web API / WCF這樣的分布式開發方式,因此和普通跟蹤的方式有所不同,針對Web API的使用是比較廣泛的在云端實作資料集中管理的一種方式,相對普通的除錯來說,難度增加了一些,需要在服務端(本篇主要是Web API操作)進行除錯,以及在客戶端界面進行聯合除錯處理,
本篇隨筆主要介紹如何在碰到基于分布式處理資料的介面的時候,對錯誤問題的分析和逐步縮小范圍的方式進行排查,最終解決問題的分析處理程序,
1、定位問題的發生
在我們出現問題的時候,往往需要定位在那個部分出現了錯誤,首先我們在客戶端和服務端都需要進行跟蹤除錯,首先我們需要在Web API 層跟蹤對應的控制器操作是否獲得對應要洗掉記錄的ID值,
我們前面功能測驗的時候,發現所有洗掉操作都出現了無法洗掉的問題,因此很可能是沒有傳遞ID值,或者轉換程序中出現了問題,
我們服務器端的洗掉操作介面如下所示,
/// <summary> /// 根據指定物件的ID,從資料庫中洗掉指定物件(用于整型主鍵) /// </summary> /// <param name="key">指定物件的ID</param> /// <returns>執行成功回傳<c>true</c>,否則為<c>false</c>,</returns> [HttpPost] public virtual CommonResult Delete(KeyInfo keyInfo, string token, string signature, string timestamp, string nonce, string appid) { //檢查用戶是否有權限,否則拋出MyDenyAccessException例外 base.CheckAuthorized(AuthorizeKey.DeleteKey, token, signature, timestamp, nonce, appid); CommonResult result = new CommonResult(); try { if (keyInfo != null) { result.Success = baseBLL.Delete(keyInfo.id); } } catch (Exception ex) { LogTextHelper.Error(ex);//錯誤記錄 result.ErrorMessage = ex.Message; } return result; }
其中的KeyInfo類是我們定義的一個物體類,定義代碼如下所示,
/// <summary> /// 用于洗掉的ID物件 /// </summary> [Serializable] public class KeyInfo { /// <summary> /// ID主鍵 /// </summary>public object id { get; set; } }
我們在除錯Web API控制器的時候,無法獲得KeyInfo引數的值,如下界面所示,

那么可能KeyInfo無法被反序列化,又或者是KeyInfo沒有傳遞過來,我們跟蹤對應的介面,方向本來應該在客戶端POST提交的ID資訊,無法提交過來,

這個是針對客戶端提交操作的抓包處理,本來想用Fiddler來抓取的,不過Fiddler好像無法直接抓取localhost的請求包體,通過代理設定沒有處理成功,改用以前用的很順手的 HttpAnalyzer,直接運行就可以抓取了,非常方便,
通過上面的操作,我們發現資料沒有提交到控制器里面,因此排除Web API控制器反序列化物件的時候丟掉值的可能,而是客戶端根本沒有提交資料過來,
2、定位具體的值丟失位置
那么我們回到對洗掉操作的統一處理方法里面看看,有Delete和Delete2操作類似,分別對應不同型別處理,

我們發現這里的處理,是直接把ID傳遞過來構建一個匿名物件,然后序列化為JSON字串提交給Web API控制器處理的,在界面上主要就是通過統一呼叫進行洗掉的,傳遞ID給對應介面進行處理的,
以權限系統模塊,用戶洗掉操作為例,它的界面端處理代碼如下所示,

以上代碼我增加了一行用來記錄是否獲得ID的內容的,通過日志記錄,可以看到有ID傳遞給介面處理了,

這樣看到,問題出現在介面的處理里面,也就是可能由于我對DLL采用了混淆操作,導致的匿名類決議出現了問題了,
我們首先重寫一下具體類的洗掉介面操作,跟蹤一下問題,

為了有效驗證我們的問題出現在這里,我們對比勾選和取消了紅色勾選,編譯后的代碼進行測驗,

對比處理結果,我們可以看到混淆前后,介面獲得的資料不同,因此可以知道是混淆導致匿名類處理出現了問題,

于是,我們對所有相關的DLL,取消對應的這個混淆選項,運行可以得到正確的結果,

以上就是我們對這個.Net Reactor混淆導致匿名類處理出現的問題處理分析,其中主要涉及到了客戶端localhost地址的本地抓包處理,采用了比較方便易用的HttpAnalyzer來分析是否資料提交有問題,還是資料決議出現問題,定位問題的邊界,然后逐步對界面和介面部分進行分析,
由于對DLL混淆導致的錯誤問題,一般來說不易推斷,所以盡可能多的列出可能影響的因素,逐一測驗解決,慢慢縮小范圍即可獲得解決問題的辦法,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/4901.html
標籤:WinForm
上一篇:(七十八)c#Winform自定義控制元件-倒影組件-HZHControls
下一篇:C#中的一些對話框問題處理
