VS.NET IDE重構程式碼外掛C# Refactory的破解
標 題: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
程式的破解思路和以前的程式有些不同,以前做為主要手段的動態跟蹤,變成了現在的靜態反編譯.因為反編譯過
來的程式碼可讀性非常好,就好像沒有動態跟蹤的必要了.當然這只是我的一已之見,如果各位朋友有什麼問題也可
以來信交流!
相關文章
- 專案的改造——RemoveButterKnife外掛程式碼的重構2018-12-20REM
- LoadRunner的VS.NET 2005外掛2010-02-02
- Vscode外掛:將程式碼連線到IDE中的文件2022-07-13VSCodeIDE
- 我的Android重構之旅:外掛化篇2018-07-09Android
- 遊戲外掛詳細破解2015-11-15遊戲
- 程式碼重構--大話重構2016-05-22
- 程式碼重構2010-01-27
- 格式化Java原始碼的Vscode等IDE外掛 - Reddit2022-03-10Java原始碼VSCodeIDE
- 講真,這兩個IDE外掛,可以讓你寫出質量槓槓的程式碼2020-04-06IDE
- 開發必備--Laravel 程式碼追蹤、自動補全外掛--ide-helper2019-08-26LaravelIDE
- 程式碼重構之法——方法重構分析2020-09-09
- web的自動化測試外掛Selenium-IDE外掛的安裝使用2016-03-07WebIDE
- 程式碼重構:類重構的 8 個小技巧2021-10-12
- .NET重構—單元測試的程式碼重構2013-10-06
- 程式碼自動生成外掛:2018-03-21
- [轉]OpenLiveWriter 程式碼外掛2017-04-28
- 重構你的javascript程式碼2019-01-21JavaScript
- sbc(三)自定義Starter-SpringBoot重構去重外掛2017-08-01Spring Boot
- “硬核”程式碼重構2019-02-22
- 重構 PHP 程式碼2023-02-21PHP
- PHP程式碼重構2014-02-28PHP
- 程式碼重構(四)2008-04-09
- SOAR的IDE外掛——您的貼身DBA保鏢2018-10-30IDE
- 程式碼重構:函式重構的 7 個小技巧2021-10-09函式
- 重構:從 0.1 構建一個 Vue 表單驗證外掛2019-03-19Vue
- jquery tip外掛程式碼例項2017-04-18jQuery
- jquery操作cookie外掛程式碼分享2017-04-11jQueryCookie
- 程式碼的壞味道和重構2019-03-07
- 重構出更加swifty的程式碼2016-12-19Swift
- 程式碼重構技巧(二)2019-03-23
- 談談程式碼重構2019-05-05
- 【讀程式碼重構有感】2018-04-29
- 重構:程式碼異味2012-05-08
- 構建vscode的vue元件程式碼補全外掛以及上傳2018-05-04VSCodeVue元件
- portal掃碼登入重構----對外版本2024-03-19
- 搞了個OneThink的程式碼編輯外掛2019-05-11
- 嘿,我造了個程式碼高亮的外掛2019-01-21
- WordPress外掛入口選單建立的位置程式碼2014-04-14