VS.NET IDE重構程式碼外掛C# Refactory的破解

看雪資料發表於2015-11-15

標 題:VS.NET IDE重構程式碼外掛C# Refactory的破解  

發信人:jk

時 間:2003/08/05 10:14am 

詳細資訊:


VS.NET IDE重構程式碼外掛C# Refactory的破解
Jance

好幾年沒玩破解了,最近在候SIR的主頁(http://www.jjhou.com)上看到最近翻的一本書,《Refactoring》特

別感興趣。碰巧找到了個在VS.NET下的重構程式碼的外掛C# Refactory。試用下感覺挺方便的,於是就有了下面

這篇很隨意的破文。^_^

軟體:Xtreme Simplicity's C# Refactory外掛
開發公司:http://www.xtreme-simplicity.net/
軟體介紹:C# Refactory is a refactoring, metrics and productivity add-in for Microsoft Visual

Studio.NET。
開發語言:C# OR VB.NET
軟體限制:Nag、15天試用


破解工具:
1.Lutz Roeder's .NET Reflector(以下稱為Reflector)個人以為目前最好的免費.Net IL程式碼反編譯工具
2.Net Framework自帶的ildasm和ilasm

先安裝好C# Refactory,再到軟體主頁上申請一段啟用資訊,輸進去就能試用15天了。OK,在開始之前讓我們整

理下破解的思路,這樣在後面的破解過程就會有個很明確的目的。根據一般的經驗,這段啟用資訊應該會包含

過期的時間,啟用的型別,比如是試用的,還是正式的,等等。試想下,如果我們能解開這段資訊包含內容,

以及生成的方法,那麼我們就有可能(只是說有可能...:P)根據這個方法,生成能正式啟用的註冊資訊了。如

果能用這種方法破解的話,那就是最完美的了。思路是這樣的

Step 1 分析註冊啟用資訊->
Step 2 分析註冊啟用資訊的解碼過程->
Step 3 分析註冊資訊包含的內容->
Step 4 分析生成註冊資訊的方法->
此時就可以決定是否能生成這段註冊資訊了

好的,下面就隨著這個步驟,看看能否獲取生成啟用資訊的方法

Setp 1 分析註冊啟用資訊:
首先從啟用資訊來看,由兩部份構成,分別是id key和activation code,像我的分別是:
id key: CRL815527      
activation code:

wACIijzES9UtDvBet3HCN1gZPtFoFsNwA3wsFo8UiAH4WKexwixzGcgUAOHfjsblQDSkT8QqtoLnAA1wZqmtgkAH2ZrFsadmi

T0F8
看一下,看不出什麼名堂,:P那就過吧

Step 2 分析註冊啟用資訊的解碼過程:
這部份要有點耐心,要用Lutz Roeder's .NET Reflector反編譯軟體程式碼。Reflector可以把IL

Decompiler為C#或VB.NET,因為對C#比較熟悉,所以以下的程式碼都是用C#.最終你會找到下面這個關鍵的類:
---)RefactoryCommon.DLL裡的XtremeSimplicity.Common.Activation.ActivationKey
裡面有一些我們感興趣的東西:
private string Encode(string privateXmlKey, DateTime dateTime, string idkey, int flags)
private void Decode(string keyString, string idkey, [out] ref DateTime dateTime, [out] ref int

flags)
public bool Demo { get; }
public int Flags { get; }
public DateTime DateTime { get; }
這些程式碼差不多跟原始碼一樣,如果你懂點C#基礎知識的話,應該很容易就能讀懂.其中Encode就是生成activation

code的方法(Method),他有4個引數,分別是privateXmlKey包含RSA加密演算法裡的私鑰資訊;dateTime包含軟體過

期時間;idkey包含啟用資訊的id key,比如上面的CRL815527;flags可能是啟用型別標誌.從這裡我們可以知道,

如果要生成啟用資訊,我們必須知道privateXmlKey,而實際上作者不會把這個放到軟體裡的,軟體裡放的是Publi

cXmlKey,用來解開啟用資訊.這點,你可以慢慢找,反正你耐心點看看,就知道里面的這些過程.而這個也是採用RS

A之類的公開金鑰方式生成註冊資訊的優點,你基本上不能透過反彙編程式來知道註冊資訊的生成演算法,從而生成

註冊資訊.
到這我們知道,剛才想的這條路是走不通的.因為我們不可能得知privateXmlKey.
既然我們不能算出啟用資訊,那麼我們現在就要換種思路,退而求其次的方法是繞過程式檢查過期時間的程式碼,那

就是平常所說的暴破的方法,也就是直接修改程式程式碼的破解方法.

OK,也讓我們整理一下暴破的思路:
Step 1:Decompiler軟體,找到檢查啟用資訊的程式碼
Step 2:寫出修改檢查的程式碼,繞過這段程式
Step 3:用ILDASM Disassembler程式,然後把Step 2裡寫好的程式碼替換原來的
Step 4:用ILASM 把*.IL檔案assembler成*.DLL檔案
再把這個替換原來的.

如果一切順利,那我們就能成功破解了!:)
好了,思路有了,那就讓我們用Reflector來找這段程式碼.
如果你有耐心的話,那麼很快就會找到下面這個關鍵Method:

---)XtremeSimplicityCSharpRefactory.DLL裡的XtremeSimplicity.Addin.Refactory
裡面有個Method:CheckActivation是我們感興趣的.下面是Reflector反編譯的C#原始碼.
private bool CheckActivation(ext_ConnectMode connectMode)
{
RegistryKey key1;
string text1;
string text2;
ActivationKey key2;
bool flag1;
DateTime time1;
key1 = Registry.CurrentUser.CreateSubKey("Software\XtremeSimplicity\C# Refactory");

L_0010:
text1 = ((string) key1.Getvalue("LicenseKey", ""));
text2 = ((string) key1.Getvalue("ActivationKey", ""));
if (text1.Equals(string.Empty))
{
if (ActivationDialog.Execute(this, 0) == 2)
{
flag1 = false;
goto L_00B1;

}

}
else
{ key2 = new ActivationKey(text1, text2);
Global.Demo = key2.Demo;
time1 = DateTime.Now;
if (DateTime.op_GreaterThanOrEqual(key2.DateTime, time1.Date))
{
if (connectMode != 5)
{
new DemoDialog().ShowDialog(this);

}
flag1 = true;
goto L_00B1;

}
if (ActivationDialog.Execute(this, 1) == 2)
{
flag1 = false;
goto L_00B1;

}

}
goto L_0010;

L_00B1:
return flag1;
}

原始碼很簡單,我們要把這段程式碼修改一個,像我就把下面這段改成:
private bool CheckActivation(ext_ConnectMode connectMode)
{
Global.Demo = false;/*這裡我是輸false,不過可能true也行,看不出Global.Demo有什麼作用*/
return true;
}
當然這要寫成IL語言,這樣才能用ILASM彙編.這樣IL就會是像下面這樣的:

private bool CheckActivation(ext_ConnectMode connectMode);

.maxstack 3
L_0000: ldc.i4.0
L_0001: stsfld Global.Demo
L_0006: ldc.i4.1
L_0007: ret  

在Reflector裡,想看一個IL語句的作用,你可以把游標移動語句的上面,就會顯示相關語句的說明.

OK,讓我們繼續,該是Step3了
ILDASM和ILASM的用法比較簡單,這裡就不詳細說了,這樣我們會得到一個修改後的XtremeSimplicityCSharpRefa

ctory.DLL,把原來的備份,再用這個覆蓋原來的,好了!再讓我們啟動VS.NET檢驗一下我們的破解成果如何!
VS.NET在裝載C# Refactory外掛時,會產生一個未知錯誤,錯誤程式碼是80131522,OK,讓我們看看80131522錯誤代

碼錶示什麼意思,直接在google裡輸入80131522,選擇"搜尋所有網站".
在第一條資訊是:
p2p.wrox.com - vb_dotnet archive
... However I still get the > > same problem, "Run-time error '-2146233054 (80131522)': No server

> registered
> > or could not load class for CLSID". ... > > > > > I got the message "Run-time error

'-2146233054
(80131522)': No server > > > > registered or could not load class for CLSID". ...
p2p.wrox.com/archive/vb_dotnet/2002-03/20.asp - 18k - 網頁快照 - 類似網頁

注意這條資訊就是我們要的:No server > registered
> > or could not load class for CLSID
意思是控制元件沒註冊或者是不能裝載相關CLSID的控制元件.知道了這個原因,那我們就查登錄檔,看看XtremeSimplicit

yCSharpRefactory.DLL是怎樣註冊為控制元件的.
直接查詢"XtremeSimplicityCSharpRefactory.DLL",你能找到兩個相關的鍵,其中一個為{C9A3A709-E578-466C-

AAEA-2C14B93D5CAD},在這個鍵下的InprocServer32裡,可以找到這樣一個值:
數值名稱:Assembly
數值資料:XtremeSimplicityCSharpRefactory, Version=1.0.1265.920, Culture=neutral,

PublicKeyToken=7d5f0a845d151407

在這裡有一個東西引起了我們的注意,PublicKeyToken=7d5f0a845d151407.透過查詢MSDN,知道這是使用強名稱

為程式集進行了簽名.這方面的資訊,你可以在VS.NET自帶的MSDN裡輸入"強名稱"來檢視.
一個程式集一旦用強名稱進行了簽名,那麼就不能修改裡面的內容,否則.Net Framework裝載程式集時,查檢簽名

時,發現程式集被修改了,就不能裝載.所以這裡就出來了這麼個問題,怎麼樣去掉一個程式集的強名稱簽名.
透過對使用和不使用強名稱簽名的相同程式碼的程式的對比,我們發現在使用強名稱簽名的程式集的IL程式碼裡多了

下面這個內容:
 .publickey = (00 24 00 00 04 80 00 00 94 00 00 00 06 02 00 00   // .$..............
               00 24 00 00 52 53 41 31 00 04 00 00 01 00 01 00   // .$..RSA1........
               2D E5 AE 96 82 E6 6E 20 6D 70 B5 33 5D 5C 48 6D   // -.....n mp.3]\Hm
               5C DE 75 0E E3 87 01 0A 66 05 ED E9 3B 33 10 DD   // \.u.....f...;3..
               95 84 A5 30 43 F2 49 84 AF 0A 42 A8 BD 51 33 8B   // ...0C.I...B..Q3.
               0B 6C 3A 77 18 25 56 8A 66 AA 7D 03 1B B9 E1 42   // .l:w.%V.f.}....B
               06 D8 4C 0B 75 8B F9 46 BC A4 9E 63 A1 CD 8B 60   // ..L.u..F...c...`
               E1 62 44 8B EC F9 D9 65 1F E4 0B 1A 17 C7 5D 21   // .bD....e......]!
               E3 D7 18 B4 28 BD 3C 5D 72 FF 4A B7 9E FA 3A FC   // ....(.<]r.J...:.
               62 65 0A 7D F1 66 96 C6 26 04 A2 19 1C 5F 50 DE ) // be.}.f..&...._P.

我們只要把以上內容去掉,再用ILASM重新編譯,就可以去掉強名稱簽名.
OK,讓我們把STEP 3,STEP 4再來一遍,再把生成的XtremeSimplicityCSharpRefactory.DLL覆蓋原來的.最後一步

把註冊裡的兩處控制元件註冊資訊裡的PublicKeyToken修改成null.像下面這樣:
數值名稱:Assembly
數值資料:XtremeSimplicityCSharpRefactory, Version=1.0.1265.920, Culture=neutral,

PublicKeyToken=null

這樣修改了之後,你可以調時間看看,啟動的NAG沒有了,把時間調到15天后也不會過期了,說明用暴破的方法成功

去掉了Nag和過期的限制.

後記:寫得很匆忙,有什麼問題可以來信交流linjance@msn.com
基本上我覺得.Net程式的破解會比以前的更容易,主要是我們可以把IL語言反編譯成可讀性極好的C#之類的原始碼

.就像上面這個例子,我們幾乎不用花什麼力氣就能知道程式的序號產生器制,及檢查註冊資訊的地方,這在以前往往

是最費精力的地方,現在變得異常簡單.主要給我們造成一些麻煩的是.Net裡的強名稱簽名,不過,我們透過簡單

的分析,就能找到去掉的方法.和JAVA的一樣,現在的.Net程式的一些保護方法也就是把一些變數名,方法名,類名

打亂掉,變成毫無意義的名稱.不過,這對有經驗的Cracker來說,只不過是多花點時間而已.同時也應該看到.Net

程式的破解思路和以前的程式有些不同,以前做為主要手段的動態跟蹤,變成了現在的靜態反編譯.因為反編譯過

來的程式碼可讀性非常好,就好像沒有動態跟蹤的必要了.當然這只是我的一已之見,如果各位朋友有什麼問題也可

以來信交流!


相關文章