.NET / C# 逆向作業規範
ACTION REQUIRED(讀完立刻執行)
NOW: 用 DIE/file/CLR 頭確認目標是 .NET 託管(否則 SWITCH 到ida-reverse//reverse-engineering/)NOW: 若疑似混淆 → 先de4dot脫殼,產出*-clean.exe,保留原始樣本NEXT: dnSpyEx(或 dnSpy MCP /ilspycmd)靜態:C# 瀏覽 + IL 視圖看關鍵判斷ACT: 需要明文/C2 時動態除錯;需要改邏輯時 IL patch 優先於 C# 重編譯- 階段結束給使用者 3–6 項下一步選單(含匯出報告)
適用範圍
當任務屬於以下場景時優先使用本 skill:
- 辨識並逆向 .NET / C# 編譯產物(託管 PE / .exe / .dll)
- 分析紅隊 Sharp* 工具鏈(Rubeus、SharpHound、SharpShell 等)
- 脫混淆 ConfuserEx / SmartAssembly / Babel / Eazfuscator / .NET Reactor 等殼
- 逆向 .NET loader / info-stealer / RAT 的解密與 C2 邏輯
- 對 C# 程式做 patch(改判斷、改常數、keygen)
- 分析 IL2CPP 之前的 Mono/Unity 託管層(注意:IL2CPP 編譯後是 native,走
reverse-engineering/+ seed-014)
如果目標是純 native 二進位(C/C++/Go/Rust 編譯、無 CLR),請改用 reverse-engineering/、ida-reverse/ 或 radare2/。
核心原則
- 先辨識再下手:先確認是 .NET 託管程式(PE 頭 CLR +
#~/#Strings流 + mscoree_CorExeMain),再決定走 dnSpy 而非 IDA - IL 優先於 C#:dnSpyEx 的 C# 反編譯器會丟失/扭曲資訊(編譯器生成的狀態機、async/await、yield),關鍵判斷與 patch 必須切到 IL 編輯器,C# 視圖只用於快速瀏覽
- de4dot 先行:遇到混淆器先
de4dot脫一輪再做靜態分析,否則字串/控制流全是亂的 - MCP 聯動:環境裡若註冊了 dnSpy MCP(
dnspy_*工具),優先走 MCP 面做 decompile / IL inspection,避免來回切 GUI - 證據化輸出:脫混淆產物、提取的設定/C2/key、patch diff 都要落盤
工具鏈映射
| 能力 | 首選 | 備註 |
|---|---|---|
| 反編譯 + 除錯 + patch | dnSpyEx | 王牌,唯一帶 IL 編輯器的 GUI;老 dnSpy 已停更,用 Ex 分支 |
| 輕量 CLI / headless 反編譯 | ILSpy (ilspycmd) | 適合批次、腳本化、Linux/macOS |
| 脫混淆 | de4dot | ConfuserEx 全家桶、SmartAssembly 等主流殼的預設解 |
| 混淆器辨識 | Detect It Easy (DIE) / file | 先判斷殼類型再決定 de4dot 參數 |
| 程式化操作 IL | dnlib | 寫 C# 腳本批次改 metadata / 字串解密器 |
| AI 直接操作 | dnSpy MCP | dnspy_decompile / dnspy_inspect_il 等工具面 |
前置:Windows 主機裝 dnSpyEx + de4dot(choco 或 release);Linux/macOS 用
ilspycmd+dotnet runtime。詳見references/sharp-tools.md的安裝矩陣。
六階段工作流
1. Identify(辨識 .NET)
確認目標是託管程式,別把 native PE 當 .NET 分析:
# Windows
file target.exe # "PE32 executable ... for MS Windows" 不夠
# 關鍵:看有沒有 CLR
powershell -c "[System.Reflection.AssemblyName]::GetAssemblyName('target.exe')"
# 或
dnSpyEx 直接拖進去 —— 能打開就是託管
# 通用
strings target.exe | grep -iE "mscoree|_CorExeMain|mscorlib|System\\."
.NET 辨識標誌:
- PE 頭
Data Directory[14](CLR Runtime Header) 非零 mscoree.dll導入 /_CorExeMain入口#~、#Strings、#US、#GUID、#Blobmetadata 流mscorlib/System.Private.CoreLib字串
NativeAOT 例外: 編譯成 native,沒有 CLR 頭,但有 System.Private.CoreLib 字串和重構過的類型元資料 —— 這類走 reverse-engineering/(IDA/r2),本 skill 僅做辨識提示。
2. Detect(檢測混淆器)
# DIE 快速辨識
diec target.exe # Detect It Easy CLI
# 或拖進 dnSpyEx,看是否大量亂碼類名 / 控制流變形
常見混淆器 → 脫殼策略(詳見 references/obfuscators.md):
| 混淆器 | 特徵 | de4dot 處理 |
|---|---|---|
| ConfuserEx (1.0.0 / 2.x) | <module> anti-tamper、控制流變形、字串加密 | de4dot target.exe 通常自動辨識 |
| SmartAssembly | circular/string encoding、資源壓縮 | de4dot target.exe |
| Babel.NET | 方法體加密、控制流 | de4dot target.exe |
| Eazfuscator.NET | 字串/資源加密 | de4dot,部分版本需手動 |
| .NET Reactor | anti-tamper + necrobit | de4dot,新版可能失敗需手動 |
3. Deobfuscate(脫混淆)
# de4dot 預設自動辨識大多數殼
de4dot target.exe -o target-clean.exe
# 指定類型(自動辨識失敗時)
de4dot --type cfze target.exe # ConfuserEx
de4dot --type sa target.exe # SmartAssembly
# 多層混淆 / de4dot 報 unknown
de4dot --detect target.exe # 看它辨識成什麼
# 可能要先 patch anti-tamper 再 de4dot(見 references/obfuscators.md)
產出:target-clean.exe,後續分析用它。保留原始樣本做對照。
4. Static Analyze(靜態分析)
dnSpyEx 載入脫殼後樣本:
- C# 視圖:快速瀏覽類結構、方法簽章、字串(用於定位)
- IL 視圖:關鍵判斷、加密邏輯、狀態機必須看 IL(右鍵 → Edit IL 或 IL 視圖)
- 找入口:
Main/Startup/ 模組初始化器 (Module .cctor) - 找關鍵邏輯:搜
flag、password、verify、check、encrypt、http、Config
定位字串 → 反向參照 → 找到使用它的方法 → IL 視圖看判斷邏輯
5. Dynamic(動態除錯)
dnSpyEx 除錯器:附加處理序 / 啟動除錯,在關鍵方法下中斷點,觀察執行時期:
- 解密後的明文字串(很多混淆器的字串在執行時期才解密)
- C2 位址、設定解密結果
- 異常驅動的控制流(anti-debug 常用
try/catch隱藏真實路徑)
.NET 動態除錯比 native 友好得多 —— 能直接看到物件值、字串內容。優先動態而非死磕靜態。
6. Patch(按需修改)
dnSpyEx → 右鍵方法 → Edit Method (C#) 或 Edit IL
- 改判斷:ldc.i4.0 → ldc.i4.1(false→true)
- 改常數:直接編輯字串/數字
- 刪除校驗:nop 掉整段
File → Save Module → 取代原檔案
IL patch 可靠性 > C# patch:C# 重編譯可能失敗(缺參照、語法不對),IL 編輯幾乎不會失真。詳見 references/common-workflow.md。
觸發場景路由
使用者說這些時進入本 skill:
- ".NET / C# 二進位逆向" / "C# 程式反編譯"
- "dnSpy 分析" / "dnSpyEx patch"
- "ConfuserEx / SmartAssembly / Babel 脫混淆 / 脫殼"
- "Sharp* 工具分析"(Rubeus / SharpHound / SharpShell)
- ".NET malware / loader / info-stealer 逆向"
- "C# 程式 patch / keygen / 修改判斷"
何時切出
- IL2CPP 編譯的 Unity 遊戲 →
reverse-engineering/+seed-014_unity-il2cpp-reverse.md(IL2CPP 是 native,不走 dnSpy) - NativeAOT 產物 →
reverse-engineering/(同上,native) - 純 native PE(無 CLR)→
reverse-engineering//ida-reverse/ - 需要符號/函數批次遷移到別的版本 →
binary-diff/ - 需要畫攻擊路徑 / 呼叫鏈圖 →
diagram-generator/
路由上下文
上游入口: skills/SKILL.md(總控)、routing.md
下游出口:
- IL2CPP / NativeAOT(native)→
reverse-engineering/ - 深度 native .so/.dll 段分析 →
ida-reverse//radare2/ - 需要 AI 直接操作 dnSpy → 註冊並聯動 dnSpy MCP(見
references/sharp-tools.md)
同級關聯模組:
reverse-engineering/languages-compiled.md(.NET 簡介指向本模組)apk-reverse/(Xamarin/MAUI Android 逆向可切回本模組看 C# 層)
參考文件
- references/obfuscators.md — ConfuserEx / SmartAssembly / Babel / Eazfuscator / .NET Reactor 脫混淆詳解 + anti-tamper 繞過
- references/common-workflow.md — 完整工作流、IL patch 可靠性、字串解密器提取、狀態機辨識
- references/sharp-tools.md — 紅隊 Sharp* 工具分析、工具安裝矩陣、dnSpy MCP 整合、社群資源索引
任務完成自檢
- 是否確認過 CLR / 託管身份(或已 SWITCH 出本 skill)?
- 混淆樣本是否先 de4dot / 等價脫殼再深分析?
- 關鍵邏輯是否用 IL 視圖驗證(而非只看 C# 偽程式碼)?
- 產物(clean 樣本 / 設定 / patch diff)是否落盤且可複現?
- 是否提供了下一步選單或報告出口?