待破解軟件:天喜轉(zhuǎn)盤抽獎(jiǎng)軟件(一年版)
使用工具:Exeinfo PE(查殼)、GrayWolf(反編譯)、IDA(解碼HEX)、UltraEdit(修改EXE文件)
=====================華麗的分割線========================
剛注冊吾愛破解,跟著大家學(xué)習(xí)一下破解。原來一直玩的是DOS下的破解,對于Windows的程序,只對原來的Delphi、C++等程序熟悉一些,對于現(xiàn)在的.NET以及JAVA程序的結(jié)構(gòu)就不甚了解了。
昨天晚上閑來無事,想鼓搗一下破解,于是就去共享軟件注冊中心找個(gè)軟件練練手。找到了這個(gè),天喜抽獎(jiǎng)程序。http://www.sharebank.com.cn/soft/SoftView_51272.htm。
下載安裝發(fā)現(xiàn)需要.net framework 4.0,說明這是一個(gè).net的程序。
安裝運(yùn)行的界面如下,未注冊版本可以抽獎(jiǎng)五次。(左上角顯示最近五次抽獎(jiǎng)結(jié)果)
如果再點(diǎn)擊開始按鈕,程序就會(huì)提示
正好就用這個(gè)程序練手吧,先查一下有沒有殼:
提示這個(gè)程序是C#.NET或者VB.NET的,沒有加殼,但是很可能用了.NET Reactor做了代碼的混淆。既然沒有加殼,那就直接上GrayWolf吧:
在左面的樹狀結(jié)構(gòu)中,可以看到很多代碼都是亂七八糟的,估計(jì)是被.NET Reactor混淆過的。所以,對于編寫注冊機(jī)這樣的事情,我就不抱什么希望了。
最左面的樹中,唯一一個(gè)可識別的節(jié)點(diǎn)是Ploverinfo,點(diǎn)開,下面是LuckyDraw。呵呵,這不就是幸運(yùn)大轉(zhuǎn)盤嘛。再點(diǎn)擊進(jìn)去看,有一個(gè)MainForm的節(jié)點(diǎn),里面有一些軟件首頁上操作的功能。比如那個(gè)開始按鈕。
[C#] 純文本查看 復(fù)制代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
private void Start()
{
if (Global.IsTrial && SchemaManager.Instance.Results.Count >= Global.get_TrialCount()) //這里判斷注冊標(biāo)識,以及抽獎(jiǎng)次數(shù),這個(gè)判斷方法有問題
{
MessageBox.Show(kgbOBx7BanbFa22Hp9.ol99ukmDA(14708)); //跳出未注冊提示
return;
}
if (WheelManager.Instance.getGoal() == null)
{
MessageBox.Show(kgbOBx7BanbFa22Hp9.ol99ukmDA(14762));
return;
}
if (SchemaManager.CurrentSchema.IsInputInfo)
{.......
|
大家看這段代碼
Global.IsTrial && SchemaManager.Instance.Results.Count >= Global.get_TrialCount()
Global.IsTrial 是否試用版,試用版的話就是True,注冊版的話就是False
SchemaManager.Instance.Results.Count 是抽獎(jiǎng)次數(shù),Global.get_TrialCount()是系統(tǒng)設(shè)置的未注冊可抽獎(jiǎng)次數(shù),也就是5次。
我說這段代碼有問題,就是這里把兩個(gè)條件放在一起用&&連接,也就是說,只有這兩個(gè)條件都為True的時(shí)候,才會(huì)跳出對話框。對于&&條件來說,屬于交集,就是相對嚴(yán)格的條件。你把未注冊的條件設(shè)置的那么窄,也就是已注冊的范圍就廣了。這個(gè)和注冊的意義背道而馳了。
那對于爆破來說,只要把其中一個(gè)條件改為False,這個(gè)軟件就被破解掉了。
所以勸大家今后寫程序的時(shí)候,遇到這種情況,用&&還是用||要考慮好。
這里如果爆破的話,就把這里的brfalse.s改為brtrue.s就可以了。
當(dāng)然,這樣做,實(shí)際上的意義就是當(dāng)這個(gè)軟件未注冊的時(shí)候,可以抽獎(jiǎng)5次以上,而如果已注冊,則只能抽獎(jiǎng)5次以下。雖然用起來沒問題,但是總是有些別扭吧。
還是繼續(xù)看左面的樹,發(fā)現(xiàn)一個(gè)Program,下面有個(gè)Main,點(diǎn)開看:
這個(gè)Main應(yīng)該是程序運(yùn)行時(shí)首先執(zhí)行的代碼,一般來說都是一些變量的初始化
仔細(xì)看右面部分的代碼:
我用黃色框圈出來的,就是被.NET Reactor混淆過的代碼,基本上看不明白是什么意思,所以我們也就不去研究了。
看紅框圈起來的
Global.IsTrial = true;
哇靠,這是什么?軟件運(yùn)行起來,首先初始化為未注冊版?再往下看:
if (Global.IsTrial)
{
Global.IsTrial = false;
Global.IsTrial = !Global.Instance.IsReg(kgbOBx7BanbFa22Hp9.ol99ukmDA(3274));
}
如果是未注冊版,那就調(diào)用IsReg函數(shù)去判斷是不是注冊版,即使IsReg函數(shù)調(diào)用錯(cuò)誤也把軟件置為注冊版。
看到了吧?軟件作者的想法有問題,Global.IsTrial = false; 這一句就不該寫啊!
我們把這兩部分結(jié)合看,軟件先是置成了未注冊版,然后判斷未注冊的話再去改狀態(tài)。那么反過來說,假如是已注冊,后面那句就沒用了。
也就是說,爆破的話,只需要把
Global.IsTrial = true;
改為
Global.IsTrial = false;
就搞定了。
唉唉唉,我再說一下啊,寫程序可不能這樣寫啊,漏洞太大了。
我們現(xiàn)在已經(jīng)知道怎么改了,用ILDASM解出*.il文件,修改相應(yīng)代碼后再用ilasm重新編譯即可。不過,那樣生成的文件與原文件可能會(huì)有差異,咱不是講究完美嘛,還是直接修改EXE的字節(jié)好了。可是對于.NET的匯編助記符,我可不是很熟悉,只好借助IDA了。
運(yùn)行IDA,加載需要破解的程序,在左面找到main:
在右面的代碼中,可以找到剛才我們要修改的語句:
ldc.i4.1
stsfld bool [Ploverinfo.CommonLib]Ploverinfo.CommonLib.App.Global::IsTrial
這兩句的意思就是給IsTrial這個(gè)變量賦值1,1就是True嘛。那么我們現(xiàn)在改成False,所以知道改哪里了吧?
對的,就是把
ldc.i4.1
改成
ldc.i4.0
就可以了
在這里點(diǎn)中l(wèi)dc.i4.1這條語句,然后切換到HEX View-A的視圖
能看到當(dāng)前17是被選中的狀態(tài),說明ldc.i4.1這句的匯編助記符是17,那么百度一下(或者在上下文里找找)就知道ldc.i4.0的助記符是16。也就是說,我們把這里的17改為16就可以。
運(yùn)行UlTraEdit,打開要破解的程序,搜索16進(jìn)制代碼。為了準(zhǔn)確定位,可以多搜幾位,比如我搜的就是000A166F2701000A1780,找到后,把17改成16,保存。
現(xiàn)在再去運(yùn)行一下待破解的程序,點(diǎn)擊開始,軟件繼續(xù)抽獎(jiǎng),不再彈出注冊提示窗口,說明破解完成。
這個(gè)爆破,只改了一個(gè)字節(jié),對程序的完整性沒有影響。只是這個(gè)軟件屬于注冊機(jī)制做得比較差的軟件,所以破解起來也沒什么技術(shù)含量,好像挺沒有成就感的。
下次找一個(gè)帶殼的練練。
|