nativecompile保護的dotNet本地程式還原成dotNetIL程式集
前面討論了 .Net 保護中的 native compile 方式 。
提到了 native compile的兩種方式 偽編譯 和 ngen 編譯。仍然沒有像C++那樣的完全native的編譯。
這裡要討論的就是 ngen編譯 生成的 ni 檔案。
前面討論時我們提到了fetion框架中的 fetionvm.srm檔案。
注意到它是使用了ngen編譯保護模式。
Remotesoft在評論中予以了證實,今回就以 fetionvm.srm這個檔案為例,嘗試ni檔案的還原。
首先用reflector直接開啟這個 srm檔案。
這個檔案裡面就只有一個
[STAThread]
public static void Main(string[] argv)
{
}
空函式 ,再沒有其它內容。很明顯這只是一個殼,而且後設資料和原始的也肯定不一樣。
但是它配合ni檔案能夠正常執行,顯然有一個地方應該會包含原始的後設資料。
srm檔案只有2k大小,應該沒有可能隱藏原始的後設資料。
在前面已經確認了原始後設資料就隱藏在 ni 檔案中。理論上說ni檔案應該有個地方記錄原始後設資料的rva和size,由於對 ni 檔案的格式不是完全清楚,所以這裡採用暴力搜尋的模式確定原始後設資料的rva。
用編輯器(如UE)開啟檔案
CWINDOWSassemblyNativeImages_v2.0.50727_32FetionVM6e39d95b1cb7d342a0ad2b892350dc65FetionVM.ni.exe
搜尋 BSJB ,
我們會發現有兩個結果,其中一個就是目前cli header中指定的metadata。推測另外一個就是原始的後設資料,在檔案偏移的0x3000處。
根據後設資料結構計算出這個原資料的大小是 0x0970。
把它提取出來檢視其結構為:
namespace FetionVM
{
internal static class Program
{
private static string GetTimeString(DateTime dateTime);
private static void Log(string message);
[STAThread]
private static void Main(params string[] args);
}
}
看到這樣的結構基本上可以肯定它就是原始的後設資料了。
後設資料有了,只能得到程式的型別結構,還是無法獲取到方法體的程式碼。
前面推測ni 檔案也包含了 原始的IL程式碼,今回就做個測試,
通過強制放法重新Jit編譯,然後在Jit層進行捕獲,得到了想要的IL程式碼。
強制方法重新Jit最簡單的方式是使用profile api。
這個程式集很簡單,經過手動還原,可以得到如下:
internal static class Program
{
// Methods
private static string GetTimeString(DateTime dateTime)
{
return (dateTime.ToLongTimeString() + “:” + dateTime.Millisecond);
}
private static void Log(string message)
{
try
{
File.AppendAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, “VMDotNet.log”), “[” + (DateTime.Now.ToString() + “] ” + message + ”
“));
}
catch
{
}
}
[STAThread]
private static void Main(params string[] args)
{
if (args.Length != 0)
{
string path = args[0];
if (!File.Exists(path))
{
Log(“未找到要執行的程式 ” + path);
}
else
{
string assemblyFile = path;
if (path.IndexOf(@””) > 0)
{
Environment.CurrentDirectory = Path.GetDirectoryName(path);
assemblyFile = Path.GetFileName(path);
}
AppDomainSetup info = new AppDomainSetup();
info.PrivateBinPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, “System”);
AppDomain domain = AppDomain.CreateDomain(Path.GetFileNameWithoutExtension(path), AppDomain.CurrentDomain.Evidence, info);
try
{
string[] destinationArray = new string[args.Length – 1];
Array.Copy(args, 1, destinationArray, 0, destinationArray.Length);
domain.ExecuteAssembly(assemblyFile, AppDomain.CurrentDomain.Evidence, destinationArray);
}
catch (Exception exception)
{
Log(“執行程式 ” + path + ” 出現錯誤!” + exception.Message);
}
}
}
}
}
到這裡我們可以確定,在ni 檔案中包含了原始的後設資料和原始的IL程式碼。所以理論上ni檔案是可以被還原的。
不知道除了Jit層捕獲,是否還可以使用net2.0中的反射獲取方法體程式碼?
有興趣可以自己試試。
需要注意的是這些測試需要在那個虛擬框架中進行,另外看Main函式的程式碼,我們會注意到程式中至少包含兩個應用程式域。
相關文章
- .Net保護中的nativecompile方式Compile
- Systemd設定程式保護
- 保護你的 PL/SQL 程式碼!SQL
- 常見dotNet加密保護工具分析介紹加密
- 可信前端之路-程式碼保護前端
- 程式猿怎麼保護眼睛
- 怎樣保護java程式碼???Java
- .net程式混淆、安全、保護、加密加密
- 關於pl/sql的程式碼保護SQL
- BASH的保護性程式設計技巧程式設計
- java 多執行緒 程式保護Java執行緒
- 程式設計師如何保護自己的眼睛程式設計師
- 程式設計師,請保護好你的 API!程式設計師API
- 保護企業系統中的程式碼安全
- Aerial for Mac鳥瞰螢幕保護程式Mac
- 程式碼伺服器安全保護(二)伺服器
- 使用Wrap加密,保護Oracle程式原始碼加密Oracle原始碼
- 金鋒螢幕保護程式2.0破解
- 5個常用Java程式碼混淆器 助你保護你的程式碼Java
- 基礎:全面保護你的Java程式安全(中)(轉)Java
- CatFly【彙編程式碼還原】
- 前端核心程式碼保護技術面面觀前端
- Mac簡單時鐘螢幕保護程式Mac
- 如何保護Java程式 防止Java反編譯Java編譯
- 用VB製作螢幕保護程式 (轉)
- 利用VB編寫螢幕保護程式 (轉)
- 「最新」冰點還原精靈Deep Freeze for mac(系統保護軟體)完全版 「系統還原工具」Mac
- 【SQL Server】本地備份和還原SQLServer
- 保護C#程式碼的藝術:深入淺出程式碼混淆技術C#
- 程式設計師生活之保護好自己的頸椎程式設計師
- 小程式成為本地生活服務的“功守道”
- 想還原沒掉了的檔案 快點開啟Windows7系統保護吧Windows
- python程式程式碼這樣加密保護,你覺得可以嗎?Python加密
- 雲應用程式如何加強隱私保護
- j2ee 源程式保護 誰做過?
- 讓應用程式禁止Windows螢幕保護 (轉)Windows
- 程式碼混淆工具ipaguard:如何使用ipaguard保護和混淆iOS應用程式程式碼iOS
- BayMaxProtector-集崩潰保護與頁面降級於一體的大白保護機制