1. 程式人生 > >.Net Reactor混淆導致匿名類處理出現的問題處理分析

.Net Reactor混淆導致匿名類處理出現的問題處理分析

.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混淆導致的錯誤問題,一般來說不易推斷,所以儘可能多的列出可能影響的因素,逐一測試解決,慢慢縮小範圍即可獲得解決問題的辦法。

&n