客戶的一個緊急bug,我用了兩種方式進行 C# 反編譯修改原始碼
阿新 • • 發佈:2020-11-17
## 一:背景
### 1. 講故事
週五下午運營反饋了一個緊急bug,說客戶那邊一個資訊列表打不開,急需解決,附帶的日誌檔案也發過來了,看了下日誌大概是這樣的:
``` C#
日期:2020-11-13 12:25:45,923 執行緒ID:[3924] 日誌級別:INFO 錯誤類:xxx property:[(null)] - 錯誤描述:應用程式出現了未捕獲的異常,Message:該字串未被識別為有效的 DateTime。;
StackTrace: 在 System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles)
在 System.Data.ConstNode..ctor(DataTable table, ValueType type, Object constant, Boolean fParseQuotes)
在 System.Data.ExpressionParser.Parse()
在 System.Data.DataExpression..ctor(DataTable table, String expression, Type type)
在 System.Data.Select..ctor(DataTable table, String filterExpression, String sort, DataViewRowState recordStates)
在 System.Data.DataTable.Select(String filterExpression)
```
從異常資訊可以看到,大概就是 DataTable.Select 的時候丟擲了異常,通過呼叫堆疊追查了下程式碼大概是這樣的。
``` C#
public Task QueryDataTable()
{
var dt = new DataTable();
dt.Columns.Add(new DataColumn("SendTime"));
dt.Rows.Add(dt.NewRow()["SendTime"] = "2020/11/14");
var where = $" SendTime < #{DateTime.Now.ToString()}#";
var query = dt.Select(where).CopyToDataTable();
}
```
大坑就在這裡,絕大多數時候過濾 DataTable 可以採用這樣的寫法 : `SendTime < #2020/11/5#`,但是客戶在新加坡,全英文作業系統,而且時間格式也不知道設定成啥樣了,我估計時間格式包含了類似的 #,正好又遇到了前後綴 `#` ,拆分上就出錯了,導致了經典的 `該字串未被識別為有效的 DateTime` 異常被丟擲。
這個 bug 改起來還是很簡單的,將 # 換成 ' 即可,也就是: `SendTime < '2020/11/5'`,如果一切順利的話,文章就應該到此為止了,可恰恰上天捉弄,因為是緊急bug,研發老大 & 專案實施 都請假了,我一個人還真搞不定,也不知道給了客戶哪一個 release 版,不想節外生枝,為了先解決這個問題,我想到了一個好辦法,反編譯修改,這是代價最小的,也能最快的搞定。
## 二:使用 dnspy 反編譯修改程式碼
### 1. 使用 dnspy 的 編輯方法 模式
為了更好的理解通過 dnspy 修改,先來聊一聊 dnspy 最便捷的修改 dll 的方式:`編輯方法`,這種方式非常方便,無需理解 IL 程式碼,為了演示,我舉一個簡單的加法運算。
``` C#
static void Main(string[] args)
{
var i = 10;
var j = 20;
Console.WriteLine($"{i}+{j}={i + j}");
Console.ReadLine();
}
```
![](https://img2020.cnblogs.com/other/214741/202011/214741-20201117122600702-1229479100.png)
接下來將 `var i= 10` 改成 `var i=100` 的步驟為:
* 右鍵 `編輯方法`
* 彈框修改 `var i=10 ` -> `var i=100`
* 點選右下角 `編譯`
* Ctrl + Shift + S 全部儲存
* 彈出框中 選擇 `確定`
截圖大概如下:
最後 bin 目錄下的 exe 就被成功修改了,雙擊之後就能看到你的成果啦!
![](https://img2020.cnblogs.com/other/214741/202011/214741-20201117122602647-1585478884.png)