漏洞分析C#反編譯軟件Reflector 11.1.0.2167(最新版)(附補丁下載)


本文為原創作品,轉載請注明出處,作者:Chris.xisaer E-mail:69920579@qq.com

 

補丁下載地址:https://github.com/hansiyuan1983/Reflector-path/releases

程序下載地址:

官方下載:

.NET Decompiler: Decompile Any .NET Code | .NET Reflector (red-gate.com)
https://www.red-gate.com/products/dotnet-development/reflector/

1.關於C#的反編譯軟件xx,其實非常簡單。我會在下面的教程加以說明。希望有需要的同學參考技術要點,不要用於商業目的。

2.本次xx只是技術展示,不用於任何商業目的,如有需求請購買正版軟件。也希望官方盡快修復漏洞。

3.本文旨在技術交流不承擔任何法律連帶責任!

轉入正題!!

QQ群3244694

估計能看到這篇文章的人 因該知道什么是Refector.以及它的用處。這里我就不在贅述了。

本次xx的版本是目前此程序的最新版本 11.1 trial.版。xx方式是暴力xx。如果喜歡寫注冊機的朋友,我下面會告訴你他的注冊算法在那個文件中。你可以自己研究一下搞定他的注冊機制。

先來張圖沒xx的時候是什么樣子!

 

 

程序彈出一個模態對話框提示到期,並給出兩個按鈕。一個是激活一個是關閉程序。

當我們點擊激活的時候會彈出輸入激活KEY 和電子郵件地址的對話框。點擊另一個便是直接退出程序。

下面 開搞!

既然是C#的程序 自然是通過IL 中間語言翻譯器運行的程序。我們打開能反編譯此類程序的軟件,有很多。推薦兩個,一個是微軟自帶的ildasm(ilasm),另外還有一個就是ILSPY。這兩個你用哪個查看都可以。當然最好用的還是咱們下面要xx的這個Reflector。

我們用ILSPY打開目標軟件:

 

 

 

 

 

我們會發現Reflector有很多的類。可能有些朋友沒有學過C#(本人就是)。你就當C++看就行。我們當然要找到我們關心的類。什么是我們關心的?

這里我先說下破軟件的xx法很多,比如1.找到負責激活的函數研究其算法寫出相應的注冊機。2.直接跳過驗證程序或者更改驗證結果。3.直接屏蔽此模態對話框讓程序跳過檢測。等等吧。因為方法太多了我這里就不一一列舉的,喜歡xx的朋友們可以自己開闊思維。

那么對於這種基本直接源代碼給你到眼前的代碼。我們就沒什么可說的了。先看看源代碼里的哪些命名空間是我們需要的。

 

對就是這個名字空間 Licensing.從他的英文名字我們就能猜到 這是關於許可證相關的類的集合。

我們點進去看發現了幾個 類。第一個BouncerParms 是保鏢類的參數類。也就是負責監視我們對程序許可證做什么的類的一些參數的類。

第二個是版本信息類Edition. 這個公司在給版本信息的時候一共給了這么幾個:

internal enum Edition
{
None = 0,
Standard = 1,
VS = 2,
VSPro = 3,
Evaluation = 10
}

我們現在的TRIAL 就是None=0;

但是這個是無法修改的,因為修改也沒用。。。

繼續往下看 EndTrialScreen類 從名字就能看出來這是構建我們試用結束對話框那類,當我們試用結束后程序會初始化這個類,並加載對話框。這個對話框是模態的 也就是說他的存在我們不能使用程序的任何功能。

好現在回到剛才的問題:我們關心什么?

我們就是關心這個對話框。我們讓程序跳過調用這個類直接到下面正常程序的初始化就可以繼續使用這個Reflector。

下面我們點擊EndTrialScreen:

 

 

 

我們會看到這個類的完整定義是不是很贊?這可比反編譯C的程序簡單多了。

可以看到這個幾個方法 Reflector.Application.Licensing.EndTrialScreen.ActivateClick

private void ActivateClick(object sender, RoutedEventArgs e)
{
TheBouncer.EnterSerialNumber(new Win32Helper
{
Handle = new WindowInteropHelper(this).Handle
});
if (TheBouncer.Licence.Activated)
{
base.DialogResult = true;
}
if (TheBouncer.IsEvaluation)
{
base.DialogResult = true;
}
}

Reflector.Application.Licensing.EndTrialScreen.CloseClick

private void CloseClick(object sender, RoutedEventArgs e)
{
Environment.Exit(-1);
}

這兩個就是相關的兩個按鈕的 對應方法(函數);

第二個方法不用說就是退出程序。我們來看第一個方法。其中有一項條件判斷:

if (TheBouncer.Licence.Activated)
{
base.DialogResult = true;
}
if (TheBouncer.IsEvaluation)
{
base.DialogResult = true;
}
當程序的需可能是激活狀態的時候 對話框的值為真,當程序有評估版本值的時候對話框的值為真。注意這里的值為真並不是顯示不顯示對話框!

我們這里關心的就是這個Licence.Activated.方法。我們找到Licence類的對應方法中去看看!

在哪里呢?找不到啊。沒在Reflector的名字空間中。這個類是一個DLL 導入類 導入的DLL 是RedGate.Licensing.Client中。

我們進入到這個命名空間中的Lisence類:

 

 

 

我們可以研究一下這個類 :從這些方法的名字我們可以看出相應的功能。

第一個便是剛才提到的ACTived 是一個BOOL 類型的變量 記錄程序是否已經注冊。

另外比較有價值的是下面這些方法!

其中CreateNewXXX函數是關於如何生成注冊許可證算法的函數。有興趣的童鞋可以看一下,我列出一個:

public static Licence CreateTamperedLicence(string machineHash, int productCode, string productName, string displayName, int majorVersion, int minorVersion, DateTime utcNow, string location)
{
Licence licence = CreateNewTrialLicence(machineHash, productCode, productName, displayName, majorVersion, minorVersion, utcNow, 0, location);
licence.Status = TrialStatus.Tampered;
if (0 == 0)
{
licence.TrialLength = 14;
}
return licence;
}

通過機器硬件的哈希數值,產品代碼。產品名字 等等等弄出來的一個算法。。。是不是很復雜。。不關心了因為我們沒有打算做注冊機。。我們爆破。。

回到我們關心的話題,我們不希望產生那個提示對話框。我們還希望程序繼續運行。。。

在調頭來看一下在EndTrialScreen類下面。有個LicenceChecker類 我們進去看:

 

 

里面只有兩個函數。我們只關心一個 就是 CheckLicense:

public void CheckLicense(IServiceProvider serviceProvider)
{
try
{
TheBouncer.Parms = new BouncerParms(m_MainWindow?.Icon, "Thank you for trying .NET Reflector", ".NET Reflector is a class browser, analyzer, and decompiler for .NET code.", ".NET Reflector");
if (!TheBouncer.CheckLicence(m_MainWindow, Edition.Standard, serviceProvider))
{
m_InternalApplicationManager.Exit();
}
if (TheBouncer.Licence.Activated)
{
m_ProBanner?.Close();
}
m_InternalApplicationManager.UpdateTitleBar();
}
catch (Exception exception)
{
ILog logger = LogService.GetLogger(GetType().FullName);
logger.Fatal("Error checking Licensing", exception);
Environment.Exit(71);
}
}

我們看一下 這個就很清楚了 是驗證程序。當驗證沒有通過后 退出程序管理器。也就是退出程序。如果驗證是ACTIVATED的許可證,那么關閉廣告條執行程序管理器類的標題更新 並繼續初始化程序。這里就是我們要更改的第一個地方 我們看一下翻譯器翻譯過來的語言

 

 

 

這里你只需要懂一點IL 語法就可以。

這里我們要修改的就是程序的25行我們把

brfalse.s ->(32)call RedGate.licensing.Client XXXXXXXXXXXXXXX_LICENCE()

修改為

brtrue.s ->(32)call RedGate.licensing.Client XXXXXXXXXXXXXXX_LICENCE()

也就是說當我們沒有許可證的時候驗證通過!

當然這里只改這個雖然可以用但是還是會彈出對話框,必須手動關閉對話框才能繼續使用程序。

我們繼續尋找需要的就是連對話框你也不要出是話直接初始正常的程序 跳過驗證對話框。

我們來看這里

 

 

這就是我們開頭說的要關注的哪個保鏢類,他里面也有一個CHECKLICENCE 方法這個方法就是用來初始化提示我們試用已過期哪個模態對話框的,我們這里還是看他的翻譯程序:

 

 

 

這里我就不繼續說明我們怎么改了,留給童鞋們自己思考把。這里修改后我們就可以爽快的用Reflextor 。

破解后的程序:

 

本文為原創作品,轉載請注明出處,作者:Chris.xisaer E-mail:69920579@qq.com

QQ群3244694
————————————————
版權聲明:本文為CSDN博主「xsdn」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/xsdn123/article/details/122171076


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM