XXX寶典演算法初探

看雪資料發表於2015-11-15

XXX寶典演算法初探

說明:這個軟體加了UPX的殼,但寫這篇文章我是在沒有脫殼的情況下破解的,用的是OD,這個思路還沒有
理清,把這個方法成熟後,我想寫一些關於OD的系列破解教學。為保護國產軟體隱去相關資訊.
    破解作者
 yzez[DFCG]
    破解工具
 OLLYDBG1.09
1、執行要破解的程式,然後用OD的附加功能載入,在關鍵點:0051B93A設定好斷點,這個關鍵點如何找到,
我用的是萬能斷點:hmemcpy,這個方法在這篇破文中我不想總結,等下一篇我想專門寫幾篇關於OD的萬能斷點
的設定,以及不脫殼OD的萬能斷點的設定方法,這是後話,下面看過程吧

0051B930    PUSH    EAX
0051B931    LEA     EDXDWORD PTR SS:[EBP-8]
0051B934    MOV     EAXDWORD PTR DS:[EBX+2FC]
0051B93A    CALL    Zgrbd1_2.00450168**************我們在此CALL設定好斷點!程式中斷後按F8往下
0051B93F    MOV     EDXDWORD 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     EAXDWORD PTR SS:[EBP-4]******把運算的結果C0FBB849大寫轉換成小寫,即c0fbb849送入EAX
0051B954    PUSH    EAX
0051B955    LEA     EDXDWORD PTR SS:[EBP-C]
0051B958    MOV     EAXDWORD PTR DS:[EBX+300]
0051B95E    CALL    Zgrbd1_2.00450168
0051B963    MOV     EDXDWORD 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     EAXDWORD PTR SS:[EBP-10]
0051B97A    PUSH    EAX
0051B97B    LEA     EDXDWORD PTR SS:[EBP-14]
0051B97E    MOV     EAXDWORD PTR DS:[EBX+320]
0051B984    CALL    Zgrbd1_2.00450168
0051B989    MOV     EDXDWORD 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     EAXDWORD PTR SS:[EBP-10]*****計算的結果82a5446b入EAX
0051B99E    PUSH    EAX
0051B99F    LEA     EDXDWORD PTR SS:[EBP-18]
0051B9A2    MOV     EAXDWORD PTR DS:[EBX+304]
0051B9A8    CALL    Zgrbd1_2.00450168
0051B9AD    MOV     EDXDWORD 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     EAXEBX
0051B9CA    CALL    Zgrbd1_2.004568C4
0051B9CF    50              PUSH    EAX
0051B9D0    CALL    Zgrbd1_2.00407D14**************到這裡恭喜你成功了!               
0051B9D5    MOV     EAXDWORD PTR DS:[54F00C]
0051B9DA    MOV     EAXDWORD PTR DS:[EAX]          
0051B9DC    MOV     EDX, Zgrbd1_2.0051BC4C
0051B9E1    CALL    Zgrbd1_2.00450198

===========================================================================================
*****************************演算法CALL(1)***************************************************
00500BDC    PUSH    EBP***********跟進演算法CALL後我們停在這裡!
**************省略部分程式碼!************************************
00500C32    LEA     EAXDWORD PTR SS:[EBP-14]
00500C35    PUSH    EAX                              
00500C36    MOV     ECXDWORD PTR SS:[EBP-C]*********內建的字串"agenius"入ECX
00500C39    MOV     EDXDWORD PTR SS:[EBP-8]******輸入的使用者名稱yzez[DFCG]移入EDX
00500C3C    MOV     EAXDWORD 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     EAXDWORD PTR SS:[EBP-10]***賦地址值!
00500C4A    MOV     EDX, 5***********************常數5送入EDX,幹什麼用?
00500C4F    CALL    Zgrbd1_2.00404E4C
00500C54    MOV     EDXDWORD PTR SS:[EBP+8]
00500C57    MOV     EAXDWORD 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     EBPESP
*****************省略部分程式碼!

00500CA3    MOV     EAXDWORD PTR SS:[EBP-4]*******把變形的字串放EAX        
00500CA6    CALL    Zgrbd1_2.00404F74
00500CAB    XOR     EAXEAX
00500CAD    PUSH    EBP
00500CAE    PUSH    Zgrbd1_2.00500D2F
00500CB3    PUSH    DWORD PTR FS:[EAX]
00500CB6    MOV     DWORD PTR FS:[EAX], ESP
00500CB9    XOR     EBXEBX
00500CBB    MOV     EAXDWORD PTR SS:[EBP-4]*******把變形的字串放EAX        
00500CBE    CALL    Zgrbd1_2.00404D8C
00500CC3    TEST    EAXEAX************************測試EAX的位數是否是20(十進位制值是32)
00500CC5    JLE     SHORT Zgrbd1_2.00500CF3*********小於就跳走!
00500CC7    MOV     ESI, 1**************************賦ESI的初始值1,ESI做計數器!
00500CCC    MOV     EDXDWORD PTR SS:[EBP-4]*******變形字串送EDX!       
00500CCF    MOV     DLBYTE PTR DS:[EDX+ESI-1]*****取第一位字元:f送DL,f的ASCII碼值是66
00500CD3    XOR     DLBL**************************EBX的初始值是0,DL=DL^BL=66
00500CD5    AND     EDX, 0FF************************EDX=EDX AND 0FF=66
00500CDB    EDXDWORD 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     EDXEBX************************EDX=EDX^EBX=A4D1C46D^00000000=A4D1C46D
00500CED    MOV     EBXEDX************************把這個值移入EBX中
00500CEF    INC     ESI*****************************ESI加1                       
00500CF0    DEC     EAX*****************************EAX減1
00500CF1  ^ JNZ     SHORT Zgrbd1_2.00500CCC*********迴圈!迴圈的次數是20(即32次),最後的值是:C0FBB849
00500CF3    MOV     EAXEBX************************把迴圈後的值:C0FBB849送入EAX
00500CF5    XOR     EDXEDX
00500CF7    PUSH    EDX
00500CF8    PUSH    EAX
00500CF9    LEA     EDXDWORD PTR SS:[EBP-C]
00500CFC    MOV     EAX, 8
00500D01    CALL    Zgrbd1_2.00409738
00500D06    MOV     EAXDWORD PTR SS:[EBP-C]        
00500D09    MOV     EDXDWORD PTR SS:[EBP-8]
00500D0C    CALL    Zgrbd1_2.0040921C
00500D11    XOR     EAXEAX
00500D13    POP     EDX                              
00500D14    POP     ECX                             
00500D15    POP     ECX                             
00500D16    MOV     DWORD PTR FS:[EAX], EDX
00500D19    PUSH    Zgrbd1_2.00500D36
00500D1E    LEA     EAXDWORD PTR SS:[EBP-C]
00500D21    CALL    Zgrbd1_2.00404AC4
00500D26    LEA     EAXDWORD PTR SS:[EBP-4]
00500D29    CALL    Zgrbd1_2.00404AC4
00500D2E    RETN
===========================================================================================

00500C5F    XOR     EAXEAX                         
00500C61    POP     EDX                              
00500C62    POP     ECX                             
00500C63    POP     ECX                              
00500C64    MOV     DWORD PTR FS:[EAX], EDX
00500C67    PUSH    Zgrbd1_2.00500C89
00500C6C    LEA     EAXDWORD PTR SS:[EBP-14]
00500C6F    MOV     EDX, 5
00500C74    CALL    Zgrbd1_2.00404AE8
00500C79    LEA     EAXDWORD PTR SS:[EBP+C]
00500C7C    CALL    Zgrbd1_2.00404AC4
00500C81    RETN

   演算法我不想總結了,過程很明白,而且是明碼比較,自己跟一跟看一看吧!

相關文章