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