XXX寶典演算法初探
XXX寶典演算法初探
說明:這個軟體加了UPX的殼,但寫這篇文章我是在沒有脫殼的情況下破解的,用的是OD,這個思路還沒有
理清,把這個方法成熟後,我想寫一些關於OD的系列破解教學。為保護國產軟體隱去相關資訊.
破解作者
yzez[DFCG]
破解工具
OLLYDBG1.09
1、執行要破解的程式,然後用OD的附加功能載入,在關鍵點:0051B93A設定好斷點,這個關鍵點如何找到,
我用的是萬能斷點:hmemcpy,這個方法在這篇破文中我不想總結,等下一篇我想專門寫幾篇關於OD的萬能斷點
的設定,以及不脫殼OD的萬能斷點的設定方法,這是後話,下面看過程吧
0051B930 PUSH EAX
0051B931 LEA EDX, DWORD PTR SS:[EBP-8]
0051B934 MOV EAX, DWORD PTR DS:[EBX+2FC]
0051B93A CALL Zgrbd1_2.00450168**************我們在此CALL設定好斷點!程式中斷後按F8往下
0051B93F MOV EDX, DWORD PTR SS:[EBP-8]******輸入的使用者名稱移入EDX
0051B942 MOV ECX, Zgrbd1_2.0051BBF8*********內建的字串"agenius"入ECX
0051B947 MOV EAX, Zgrbd1_2.0051BC08*********內建的字串"fuck"入EAX
0051B94C CALL Zgrbd1_2.00500BDC**************演算法CALL(1),按F7跟進!
0051B951 MOV EAX, DWORD PTR SS:[EBP-4]******把運算的結果C0FBB849大寫轉換成小寫,即c0fbb849送入EAX
0051B954 PUSH EAX
0051B955 LEA EDX, DWORD PTR SS:[EBP-C]
0051B958 MOV EAX, DWORD PTR DS:[EBX+300]
0051B95E CALL Zgrbd1_2.00450168
0051B963 MOV EDX, DWORD PTR SS:[EBP-C]*****輸入的第一組試驗碼:12345678入EDX
0051B966 POP EAX
0051B967 CALL Zgrbd1_2.00404ED0*************比較CALL
0051B96C JNZ Zgrbd1_2.0051BB93*************不相等就跳!一跳就失敗,不跳的話就往下,比較第二組!
0051B972 PUSH Zgrbd1_2.0051BBEC
0051B977 LEA EAX, DWORD PTR SS:[EBP-10]
0051B97A PUSH EAX
0051B97B LEA EDX, DWORD PTR SS:[EBP-14]
0051B97E MOV EAX, DWORD PTR DS:[EBX+320]
0051B984 CALL Zgrbd1_2.00450168
0051B989 MOV EDX, DWORD PTR SS:[EBP-14]****機器碼:562207418120入EDX
0051B98C MOV ECX, Zgrbd1_2.0051BBF8*********內建的字串"agenius"入ECX
0051B991 MOV EAX, Zgrbd1_2.0051BC08*********內建的字串"fuck"入EAX
0051B996 CALL Zgrbd1_2.00500BDC**************演算法CALL(3),按F7跟進,因為呼叫同一子程式,程式碼見後!
0051B99B MOV EAX, DWORD PTR SS:[EBP-10]*****計算的結果82a5446b入EAX
0051B99E PUSH EAX
0051B99F LEA EDX, DWORD PTR SS:[EBP-18]
0051B9A2 MOV EAX, DWORD PTR DS:[EBX+304]
0051B9A8 CALL Zgrbd1_2.00450168
0051B9AD MOV EDX, DWORD PTR SS:[EBP-18]*****第二組試驗碼87654321入EDX
0051B9B0 POP EAX
0051B9B1 CALL Zgrbd1_2.00404ED0**************比較CALL
0051B9B6 JNZ Zgrbd1_2.0051BB93**************不相等就跳,一跳就失敗
0051B9BC PUSH 40
0051B9BE PUSH Zgrbd1_2.0051BC10
0051B9C3 PUSH Zgrbd1_2.0051BC1C
0051B9C8 MOV EAX, EBX
0051B9CA CALL Zgrbd1_2.004568C4
0051B9CF 50 PUSH EAX
0051B9D0 CALL Zgrbd1_2.00407D14**************到這裡恭喜你成功了!
0051B9D5 MOV EAX, DWORD PTR DS:[54F00C]
0051B9DA MOV EAX, DWORD PTR DS:[EAX]
0051B9DC MOV EDX, Zgrbd1_2.0051BC4C
0051B9E1 CALL Zgrbd1_2.00450198
===========================================================================================
*****************************演算法CALL(1)***************************************************
00500BDC PUSH EBP***********跟進演算法CALL後我們停在這裡!
**************省略部分程式碼!************************************
00500C32 LEA EAX, DWORD PTR SS:[EBP-14]
00500C35 PUSH EAX
00500C36 MOV ECX, DWORD PTR SS:[EBP-C]*********內建的字串"agenius"入ECX
00500C39 MOV EDX, DWORD PTR SS:[EBP-8]******輸入的使用者名稱yzez[DFCG]移入EDX
00500C3C MOV EAX, DWORD PTR SS:[EBP-4]*********內建的字串"fuck"入EAX
00500C3F CALL Zgrbd1_2.00500984***********此CALL對上述字串處理,使之變成"fuckyzez[DFCG]agenius2\4\lvdn+YF"
******************************************程式碼太長,我就不列了,有興趣的朋友自己跟一下看吧!
00500C44 PUSH DWORD PTR SS:[EBP-14]********儲存字串"\4\lvdn+YF"
00500C47 LEA EAX, DWORD PTR SS:[EBP-10]***賦地址值!
00500C4A MOV EDX, 5***********************常數5送入EDX,幹什麼用?
00500C4F CALL Zgrbd1_2.00404E4C
00500C54 MOV EDX, DWORD PTR SS:[EBP+8]
00500C57 MOV EAX, DWORD PTR SS:[EBP-10]**變形後的字串:fuckyzez[DFCG]agenius2\4\lvdn+YF"入EAX
00500C5A CALL Zgrbd1_2.00500C90***********演算法CALL(2)按F7跟進!程式碼直接在下面給出!
=============================================================================================
***********************************演算法CALL(2)跟進:
00500C90 PUSH EBP***********來到這裡!
00500C91 MOV EBP, ESP
*****************省略部分程式碼!
00500CA3 MOV EAX, DWORD PTR SS:[EBP-4]*******把變形的字串放EAX
00500CA6 CALL Zgrbd1_2.00404F74
00500CAB XOR EAX, EAX
00500CAD PUSH EBP
00500CAE PUSH Zgrbd1_2.00500D2F
00500CB3 PUSH DWORD PTR FS:[EAX]
00500CB6 MOV DWORD PTR FS:[EAX], ESP
00500CB9 XOR EBX, EBX
00500CBB MOV EAX, DWORD PTR SS:[EBP-4]*******把變形的字串放EAX
00500CBE CALL Zgrbd1_2.00404D8C
00500CC3 TEST EAX, EAX************************測試EAX的位數是否是20(十進位制值是32)
00500CC5 JLE SHORT Zgrbd1_2.00500CF3*********小於就跳走!
00500CC7 MOV ESI, 1**************************賦ESI的初始值1,ESI做計數器!
00500CCC MOV EDX, DWORD PTR SS:[EBP-4]*******變形字串送EDX!
00500CCF MOV DL, BYTE PTR DS:[EDX+ESI-1]*****取第一位字元:f送DL,f的ASCII碼值是66
00500CD3 XOR DL, BL**************************EBX的初始值是0,DL=DL^BL=66
00500CD5 AND EDX, 0FF************************EDX=EDX AND 0FF=66
00500CDB EDX, DWORD PTR DS:[EDX*4+54D698]********把地址EDX*4+54D698的值A4D1C46D移入EDX
00500CE2 SHR EBX, 8**************************EBX右移8位
00500CE5 AND EBX, 0FFFFFF********************EBX=EBX AND 0FFFFFF=00000000
00500CEB XOR EDX, EBX************************EDX=EDX^EBX=A4D1C46D^00000000=A4D1C46D
00500CED MOV EBX, EDX************************把這個值移入EBX中
00500CEF INC ESI*****************************ESI加1
00500CF0 DEC EAX*****************************EAX減1
00500CF1 ^ JNZ SHORT Zgrbd1_2.00500CCC*********迴圈!迴圈的次數是20(即32次),最後的值是:C0FBB849
00500CF3 MOV EAX, EBX************************把迴圈後的值:C0FBB849送入EAX
00500CF5 XOR EDX, EDX
00500CF7 PUSH EDX
00500CF8 PUSH EAX
00500CF9 LEA EDX, DWORD PTR SS:[EBP-C]
00500CFC MOV EAX, 8
00500D01 CALL Zgrbd1_2.00409738
00500D06 MOV EAX, DWORD PTR SS:[EBP-C]
00500D09 MOV EDX, DWORD PTR SS:[EBP-8]
00500D0C CALL Zgrbd1_2.0040921C
00500D11 XOR EAX, EAX
00500D13 POP EDX
00500D14 POP ECX
00500D15 POP ECX
00500D16 MOV DWORD PTR FS:[EAX], EDX
00500D19 PUSH Zgrbd1_2.00500D36
00500D1E LEA EAX, DWORD PTR SS:[EBP-C]
00500D21 CALL Zgrbd1_2.00404AC4
00500D26 LEA EAX, DWORD PTR SS:[EBP-4]
00500D29 CALL Zgrbd1_2.00404AC4
00500D2E RETN
===========================================================================================
00500C5F XOR EAX, EAX
00500C61 POP EDX
00500C62 POP ECX
00500C63 POP ECX
00500C64 MOV DWORD PTR FS:[EAX], EDX
00500C67 PUSH Zgrbd1_2.00500C89
00500C6C LEA EAX, DWORD PTR SS:[EBP-14]
00500C6F MOV EDX, 5
00500C74 CALL Zgrbd1_2.00404AE8
00500C79 LEA EAX, DWORD PTR SS:[EBP+C]
00500C7C CALL Zgrbd1_2.00404AC4
00500C81 RETN
演算法我不想總結了,過程很明白,而且是明碼比較,自己跟一跟看一看吧!
相關文章
- 面試寶典2017-12-13面試
- Java 面試寶典2018-09-09Java面試
- PHP面試寶典2017-06-07PHP面試
- iOS 面試寶典2017-12-21iOS面試
- Spring葵花寶典2020-07-24Spring
- C++面試寶典2018-09-11C++面試
- FAQ寶典之RancherServer2017-11-12Server
- Java面試葵花寶典2013-11-25Java面試
- PHP 三大經典模式初探2019-09-18PHP模式
- Oracle面試寶典-鎖篇2020-03-04Oracle面試
- Node.js 葵花寶典2019-04-04Node.js
- Oracle 面試寶典-RAC篇2021-05-16Oracle面試
- Oracle 面試寶典-UNDO篇2021-06-14Oracle面試
- Oracle 面試寶典-DG篇2021-07-25Oracle面試
- 前端學習文件寶典2018-12-15前端
- DevOps 初學者寶典2023-11-29dev
- Oracle面試寶典-等待事件篇2020-03-11Oracle面試事件
- Oracle面試寶典-引數篇2020-03-03Oracle面試
- Oracle面試寶典-事務篇2020-03-02Oracle面試
- 大資料面試寶典五2020-05-15大資料面試
- IT技術跳槽的葵花寶典2019-02-19
- Java面試寶典-20172018-08-18Java面試
- Linux寶典(第9版)2018-10-30Linux
- JAVA葵花寶典(基礎版)2020-12-20Java
- Redis面試寶典-持久化篇2022-07-30Redis面試持久化
- MySQL面試寶典-檔案篇2022-04-10MySql面試
- Web前端面試寶典(最新)2018-03-04Web前端面試
- 網路管理實戰寶典2017-11-11
- vc入門寶典(十) (轉)2007-11-16
- vc入門寶典(九) (轉)2007-08-15
- PageRank演算法初探2018-11-18演算法
- Oracle面試寶典-程式結構篇2020-02-29Oracle面試
- C++各大名庫寶典[收藏]2020-04-04C++
- Java面試寶典之開源框架!2021-08-16Java面試框架
- OpenMLDB 新手寶典 開發者上手必讀2023-02-28
- React生命週期簡明寶典2018-03-17React
- Netbackup For Oracle client安裝寶典2010-10-14Oracleclient
- 演算法初探--遞迴演算法2018-10-30演算法遞迴