某檔案切割工具
一個重啟驗證軟體的破解思路
破解作者
yzez[DFCG][BCG][FCG]
破解工具
PEID、OLLYDBG1.09、脫殼工具Pe-scan
破解目的
不為破解而破解,只為交流技術而破解
破解過程
這兩天在看雪論壇上有網友提到關於重啟驗證軟體的破解如何破的問題,剛剛手頭有一個前天下的
軟體也是重啟驗證的,所以就破一破,講一講大致思路。為保護國產軟體隱去軟體相關資訊,這是一個檔案
切割的軟體。未註冊有功能限制,非明碼比較,所以要看懂註冊演算法思路。對於重啟驗證的軟體,一般的
方法是:使用FILEMON或者REGMON等軟體,監測軟體輸入註冊資訊後,會把註冊資訊儲存到何處,如果是儲存
在登錄檔中我們一般下:REGCREATEKEYA等斷點,如果是儲存到某個檔案當中,我們就要反彙編找到軟體在
什麼地主對這個檔案進行讀寫操作,然後有針對性地設下斷點,當然方法很多,這只不過是一個一般的思路
和過程,視具體情況而論,不要死守陳規,這個軟體監測後發現把註冊資訊儲存到登錄檔中,先下REGCREATEKEYA
斷點,按了N次F8,不太正常,不知道是我機子的問題還是什麼問題,不耐煩退出OD,重新開啟程式還是註冊
視窗,突然想到程式驗證以後,註冊不正確還是會彈出這個要求註冊的視窗,那麼我們就可以用別的斷點
方法找到比對的關鍵處,所以這個軟體的重啟驗證我們可以用另一種斷點方法來破,下面看過程。
1、用PEID檢測是PECompact 1.68 - 1.84 -> Jeremy Collake的殼,於是用Pe-scan自動脫殼,脫完殼後,
先執行脫殼後的程式,輸入註冊資訊:使用者名稱yzez,EMAIL:yzez@163.com,試驗碼:123456789987654321,
為什麼要輸入這麼多位數的試驗碼?請看下面的說明。輸入註冊資訊後,軟體要求重啟來驗證註冊正確與
否,點確定程式退出,用OD載入脫殼後的程式,在命令欄內輸入:bpx Messageboxa就是設下斷點,然後
按ENTER鍵,出現一個資訊框,在這個框裡的所有CALL上都設下斷點,按F9執行程式,連續按F9,如果跳不
過,按F2去掉這個斷點,這時你要留心四個視窗,等到出現你所輸入的註冊資訊後,這時就要停止F9,改按
F8,因為已經快到關鍵處了,下面看程式碼:
00404D7F CALL <JMP.&oleaut32.SysAllocStringLen>****在這個CALL出現了我輸入的試驗碼:123456789987654321,
******************我們已經快到關鍵處,記下這個地址,如果一次除錯不出,以後就要直接在這個CALL設下斷點!
00404D84 TEST EAX, EAX**************按F8往下走!
00404D86 JE 123.00404C58
00404D8C POP EDX
00404D8D PUSH DWORD PTR DS:[EDX]
00404D8F MOV DWORD PTR DS:[EDX], EAX
00404D91 CALL <JMP.&oleaut32.SysFreeString>
00404D96 RETN***********返回指令!不要管,按F8繼續往下走,中間還有一個,對我們無用,省略,直到下面處:
===========================================================================================
0042F2B0 MOV EAX, [LOCAL.2] ****直到這個地方,我們要慢慢走了,按F8往下!
0042F2B3 MOV ECX, EDI
0042F2B5 MOV EDX, ESI
0042F2B7 CALL 123.00404E84
0042F2BC MOV EDX, [LOCAL.1]
0042F2BF MOV EAX, [ARG.1]
0042F2C2 CALL 123.004047DC
0042F2C7 XOR EAX, EAX
0042F2C9 POP EDX
0042F2CA POP ECX
0042F2CB POP ECX
0042F2CC MOV DWORD PTR FS:[EAX], EDX
0042F2CF PUSH 123.0042F2E9
0042F2D4 LEA EAX, [LOCAL.2]
0042F2D7 MOV EDX, 2******************把常數2賦EDX,幹嗎用?原來是取試驗碼的值,這裡指取試驗碼的第2位:2
0042F2DC CALL 123.00404CA0************此CALL取出試驗碼的第2位:2,有興趣自己去跟。
0042F2E1 RETN****************************返回指令,繼續往下。
========================================================================================
按F8走,我們又會來到這裡:
00477615 PUSH [LOCAL.2]***************我們來到這裡
00477618 EAX, [LOCAL.3]
0047761B PUSH EAX
0047761C MOV ECX, 1******************賦ECX的值1,即取一位
00477621 MOV EDX, 6******************取試驗碼的第6位!
00477626 MOV EAX, DWORD PTR DS:[EBX]*試驗碼:123456789987654321移入EAX中
00477628 CALL 123.0042F284************取試驗碼的第6位:6
0047762D PUSH [LOCAL.3]
00477630 LEA EAX, [LOCAL.4]
00477633 PUSH EAX
00477634 MOV ECX, 1*****************賦ECX的值1,取1位試驗碼
00477639 MOV EDX, 0A****************賦EDX的值:A(十進位制值是10),取第10位試驗碼
0047763E MOV EAX, DWORD PTR DS:[EBX]*試驗碼:123456789987654321移入EAX中
00477640 CALL 123.0042F284************取出試驗碼的第10位:9
00477645 PUSH [LOCAL.4]
00477648 LEA EAX, [LOCAL.5]
0047764B PUSH EAX
0047764C MOV ECX, 1
00477651 MOV EDX, 0E*****************取試驗碼的0E位,即第14位
00477656 MOV EAX, DWORD PTR DS:[EBX]
00477658 CALL 123.0042F284************取出試驗碼的第14位:5
0047765D PUSH [LOCAL.5]
00477660 LEA EAX, [LOCAL.6]
00477663 PUSH EAX
00477664 MOV ECX, 1
00477669 MOV EDX, 4******************取試驗碼的第4位
0047766E MOV EAX, DWORD PTR DS:[EBX]
00477670 CALL 123.0042F284
00477675 PUSH [LOCAL.6]
00477678 LEA EAX, [LOCAL.7]
0047767B PUSH EAX
0047767C MOV ECX, 1
00477681 MOV EDX, 8******************取試驗碼的第8位
00477686 MOV EAX, DWORD PTR DS:[EBX]
00477688 CALL 123.0042F284************取出試驗碼的第8位:8
0047768D PUSH [LOCAL.7]
00477690 LEA EAX, [LOCAL.8]
00477693 PUSH EAX
00477694 MOV ECX, 1
00477699 MOV EDX, 0C*****************取試驗碼的0C位即第12位
0047769E MOV EAX, DWORD PTR DS:[EBX]
004776A0 CALL 123.0042F284************取出試驗碼的第12位:7
004776A5 PUSH [LOCAL.8]
004776A8 LEA ECX, [LOCAL.9]
004776AB MOV EDX, 1******************取試驗碼的第1位
004776B0 MOV EAX, DWORD PTR DS:[EBX]
004776B2 CALL 123.0042F200************取出試驗碼的第1位:1
004776B7 PUSH [LOCAL.9]
004776BA LEA EAX, [LOCAL.1]
004776BD MOV EDX, 8******************賦EDX的值8,8位取完了嗎?
004776C2 CALL 123.004048D4************取出的8位數值連線起來組成一組新值:26954871
004776C7 MOV EAX, [LOCAL.1]**********把這組新值移到EAX
004776CA PUSH EAX
004776CB MOV EAX, DWORD PTR DS:[47DC68]
004776D0 PUSH EAX*********************內建的字串:軟體名XXXXXX入棧
004776D1 LEA ECX, [LOCAL.11]
004776D4 MOV EDX, 1
004776D9 MOV EAX, DWORD PTR DS:[47DC6C]
004776DE CALL 123.0042F190
004776E3 EAX, [LOCAL.11]
004776E6 PUSH EAX
004776E7 LEA EAX, [LOCAL.10]
004776EA PUSH EAX
004776EB MOV ECX, 123.00477740**********移入固定的字串"Xenotrix"
004776F0 MOV EDX, DWORD PTR DS:[47DC78]*把輸入的EMAIL:yzez@163.com移入EDX
004776F6 MOV EAX, DWORD PTR DS:[47DC74]
004776FB CALL 123.004773A8***************再取使用者名稱:yzez,把上述內容全部連線起來,組成一個長
*****字串:yzezyzez@163.comXenotrixiSplit4Ii`w,這個字串就是在這個CALL中而得到,我不貼程式碼了,
*****要不然這篇文章真的成了垃圾文章!但這個CALL我們一定要進!因為關鍵值在這個CALL裡計算得到!關鍵CALL。
00477700 MOV EDX, [LOCAL.10]************把上面運算的結果:150DDFC1,大寫字母轉換成小寫:150ddfc1
00477703 POP EAX
00477704 CALL 123.00404960***************比較CALL,比較上述運算的值:150ddfc1與取出的8位試驗碼:
************************************26954871是否相等!
00477709 SETE AL*************************相等則置AL的值為1,這是成功標誌位,軟體重啟驗證這個標誌位!
0047770C MOV EBX, EAX
0047770E XOR EAX, EAX
00477710 POP EDX
00477711 POP ECX
00477712 POP ECX
00477713 MOV DWORD PTR FS:[EAX], EDX
00477736 C3 RETN
======================================================================================
關鍵CALL跟進後我們在這裡:
004773A8 PUSH EBP
004773A9 MOV EBP, ESP
*******************************省略部分程式碼!***********************************
004773FD MOV EDX, [ARG.1]
00477400 MOV EAX, [LOCAL.1]****把得到的值:yzezyzez@163.comXenotrixiSplit4Ii`w入EAX
00477403 CALL 123.00477308******演算法CALL跟進,按F7
00477408 XOR EAX, EAX
0047740A POP EDX
0047740B POP ECX
0047740C POP ECX
0047740D MOV DWORD PTR FS:[EAX], EDX
00477410 PUSH 123.0047742A
00477415 LEA EAX, [LOCAL.2]
00477418 MOV EDX, 2
0047741D CALL 123.00404578
00477422 RETN
========================================================================================
演算法CALL跟進後,來到這裡:
00477308 PUSH EBP
00477309 MOV EBP, ESP
0047730B ADD ESP, -8
0047730E PUSH EBX
0047730F PUSH ESI
00477310 PUSH EDI
00477311 XOR ECX, ECX
00477313 MOV [LOCAL.2], ECX
00477316 MOV [LOCAL.1], EDX
00477319 MOV EDI, EAX
0047731B XOR EAX, EAX
0047731D PUSH EBP
0047731E PUSH 123.0047739A
00477323 PUSH DWORD PTR FS:[EAX]
00477326 MOV DWORD PTR FS:[EAX], ESP
00477329 XOR EBX, EBX
0047732B MOV EAX, EDI
0047732D CALL 123.00404814
00477332 TEST EAX, EAX
00477334 JLE SHORT 123.0047735F
00477336 MOV ESI, 1***********************賦ESI的值1,ESI做計數器!
0047733B MOV DL, BYTE PTR DS:[EDI+ESI-1]**取出第一個字串:y(ASCII碼值是:79)
0047733F XOR DL, BL***********************DL ^ BL=79,BL的初始值是:0
00477341 AND EDX, 0FF*********************與0FF=79
00477347 MOV EDX, DWORD PTR DS:[EDX*4+47C094>**把地址:EDX*4+47C094存放的值:29D9C998入EDX
0047734E SHR EBX, 8***********************EBC右移8位!
00477351 AND EBX, 0FFFFFF*****************與運算!
00477357 XOR EDX, EBX*********************EDX XOR EBX=29D9C998
00477359 MOV EBX, EDX*********************把29D9C998移入EBX中,參與下一步運算!
0047735B INC ESI**************************ESI加1
0047735C DEC EAX**************************EAX減1,EAX存放上述值的位數是:23
0047735D JNZ SHORT 123.0047733B***********跳回迴圈,一共迴圈23(35)次,得到最後的值:150DDFC1
0047735F PUSH 32
00477361 CALL <JMP.&kernel32.Sleep>
00477366 MOV EAX, EBX*********************把150DDFC1由EBX移入EAX中
00477368 XOR EDX, EDX
0047736A PUSH EDX
0047736B PUSH EAX ASCII "yzezyzez@163.comXenotrixiSplit4Ii`w"
0047736C LEA EDX, [LOCAL.2] ; |
0047736F MOV EAX, 8 ; |
00477374 CALL 123.004089D8 ; 123.004089D8
00477379 MOV EAX, [LOCAL.2]
0047737C MOV EDX, [LOCAL.1]
0047737F CALL 123.00408588
00477384 XOR EAX, EAX
00477386 POP EDX ; 123.00477408
00477387 POP ECX ; 123.00477408
00477388 POP ECX ; 123.00477408
00477389 MOV DWORD PTR FS:[EAX], EDX
0047738C PUSH 123.004773A1
00477391 LEA EAX, [LOCAL.2]
00477394 CALL 123.00404554
00477399 RETN*******************************返回到前面我們再看!
簡單結論:
這個軟體是從註冊碼中取出8位值,分別是:第2、6、10、14、4、8、12、1位,依次取,得到一組值,
然後再把這個值與:使用者名稱,郵箱與軟體內建的字串運算後得到的一組值比較,相等就註冊成功!
一個可用的註冊碼:使用者名稱yzez
EMAIL:yzez@163.com
註冊碼:113d557f908c6d4321
主要是註冊碼的第2、6、10、14、4、8、12、1位有規定,其它的位數可以任意!最近工作太忙,個人也有點懶,
所以演算法不完全,主要程式碼太多,迴圈也多,用到了除,所以也不想再更多的分析了.好在我在前面就宣告,這是關於
軟體重啟驗證的一種破解方法,我想這個過程省略也無所謂了.
相關文章
- bash切割檔案2018-08-13
- Java實現檔案切割拼接2019-02-25Java
- UNIX 中的檔案切割(轉)2007-08-11
- 檔案切割以及合併筆記2017-09-18筆記
- Centos檔案切割利器_split命令及cat命令合併檔案2018-02-05CentOS
- ffmpeg用法-mp4檔案合成,切割功能2019-01-28
- 【小程式】切割和合並mp3檔案2016-12-21
- Linux大檔案的切割與合併2016-05-08Linux
- 圖片切割工具類2015-01-29
- 如何在 Linux下進行檔案切割操作?2021-06-22Linux
- linux下檔案的切割與合併(轉)2007-08-15Linux
- 如何在Linux中進行檔案切割操作?2024-03-14Linux
- ClickOnce釋出包含某檔案2020-04-04
- ajax 請求某個檔案2013-09-05
- 搜尋檔案下包含某個字串的檔案2017-11-18字串
- java IO流之檔案切割兩例(含Properties 用法)2013-11-21Java
- tar打包且排除某個檔案2019-03-01
- linux對檔案某列求和2014-07-25Linux
- Linux 刪除除了某個檔案之外的所有檔案2018-01-25Linux
- 怎樣阻止ICloud同步某個指定檔案2020-10-21Cloud
- 取SVN過去的某個版本檔案2015-10-29
- [Linux shell]查詢某目錄下檔案是否包含某個字串2014-10-21Linux字串
- AIX/Linux下批量替換某類檔案中的某串字元2011-07-06AILinux字元
- Mac檔案共享工具2021-10-12Mac
- find 命令刪除某類或某段時間前的檔案指令碼2012-12-05指令碼
- Java 輸出某路徑下的所有檔案2018-09-10Java
- android,如果某個檔案存在就刪除2016-04-30Android
- 某個控制檔案損壞的恢復案例2015-05-07
- perl例子--讀取大檔案中某幾行2009-03-02
- CAB歸檔檔案提取工具cabextract2017-11-20
- 2012.07.18 廣西某通訊行業系統切割2012-07-19行業
- java檔案對照工具2017-05-26Java
- elf檔案處理工具2024-04-26
- Fnt檔案編輯工具2024-04-30
- linux 小工具之:日誌切割(logrotate)2016-09-08Linuxlogrotate
- git小技巧--提取/合併某分支的部分檔案2016-12-06Git
- 某個資料檔案損壞完全恢復(三)2012-06-21
- git刪除歷史中的某個大檔案2024-04-18Git