IP檢視器V6.1版的演算法淺析(原創)--MD5演算法
IP檢視器V6.1版的演算法淺析-----MD5
破解申明:只為技術而破解
破解作者:mejy[BCG][FCG]
在此感謝:
我第一次貼出後給我提示的朋友,本文透過具體例項介紹了MD5演算法的過程!
前言:演算法具煩,如果你對演算法沒興趣,還是看別的文章把。作者在註冊頁上寫著“註冊光榮,破解可恥”呵呵!破他!費了我10頁草稿紙
第一步:查殼。破解第一步(脫殼高手例外)如果有殼的話,當然先要脫殼了。用FI301檢測為UPX的殼。我等菜鳥還是用通用工具吧。用File Scanner脫啦。你要是嫌dos操作麻煩的話,設定一下系統環境變數,只要進入檔案所在目錄就可以用fs命令拉。怎麼設環境變數不再本文討論範圍之內:)
三部曲: fs Cu ip.exe fs-rn Cspl ip.exe fs Cc ip.exe
第二步: 成功脫殼後。在看什麼語言編寫。答:delphi作品也。DeDe出場,反彙編之。我個人喜歡用DELPHI6.0直接看它的彙編程式碼。所以輸出工程拉。。。然後將delphi開啟載入ip.dpr工程。選擇TrForm窗體。(當然也可直接在DeDe中進行)。雙擊”確定”來到
procedure TrForm.Button1Click(Sender : TObject);
begin
004694D8 55 push ebp
004694D9 8BEC mov ebp, esp
004694DB B908000000 mov ecx, $00000008
……………………………這也是我們下斷點的地方
第三步OD載入啦:別急著F9先設好斷點先,然後F9執行程式輸入
試練嗎:#mejy[BCG][FCG]tsinghua1234567890987654321 呵呵為什麼這麼多位,既然作者說要用剪下和貼上,那就說明註冊碼很長拉。為什麼要用#開頭呢?作者的規定啦。因為程式的使用者名稱和註冊碼在同一個EDIT控制元件中輸入的。所以作者以第一個字元是否為”#”標示是註冊碼還是使用者名稱的。
試練使用者名稱:mejy[BCG][FCG] 第一個字元不要為”#”,要不然你會永遠在輸入註冊碼
004694DB . B9 08000000 MOV ECX,8 設斷
。。。。。。。。。。。。
004694FD . 50 PUSH EAX 這兒 eax=32(十進位制)
004694FE . 8D55 E4 LEA EDX,DWORD PTR SS:[EBP-1C]
00469501 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00469504 . 8B80 04030000 MOV EAX,DWORD PTR DS:[EAX+304]
0046950A . E8 8DD3FDFF CALL ip.0044689C
0046950F . 8B45 E4 MOV EAX,DWORD PTR SS:[EBP-1C] 試練碼入棧
eax中存的就是 ASCII "#mejy[BCG][FCG]tsinghua123456789" 可見試練碼輸太長也沒有意義,它只取了前32位
00469512 . B9 01000000 MOV ECX,1
00469517 . BA 01000000 MOV EDX,1
0046951C . E8 33B9F9FF CALL ip.00404E54
00469521 . C645 EB 00 MOV BYTE PTR SS:[EBP-15],0
00469525 . 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
00469528 . BA 5C994600 MOV EDX,ip.0046995C
0046952D . E8 0EB8F9FF CALL ip.00404D40 //跟進這個call就知道為什麼註冊碼第一位要為”#”
此call中的關鍵程式碼:
00404D40 53 PUSH EBX
。。。。。。。。。。省略n行
00404D95 8B0E MOV ECX,DWORD PTR DS:[ESI]
00404D97 8B1F MOV EBX,DWORD PTR DS:[EDI]
00404D99 38D9 CMP CL,BL 關鍵比較是否為”#” 如果你的註冊首個字元不是”#”,那就重新來過吧!
00404D9B 75 41 JNZ SHORT ip.00404DDE 以下省略n行
00404DE1 C3 RETN // End Of Call
續主程式程式碼
00469532 . 0F85 E4000000 JNZ ip.0046961C 不是”#”跳走玩完
F8繼續往下來到
00469548 . E8 4FD3FDFF CALL ip.0044689C
0046954D . 8B45 E0 MOV EAX,DWORD PTR SS:[EBP-20]
00469550 . B9 10000000 MOV ECX,10 16(十進位制)入棧
00469555 . BA 02000000 MOV EDX,2 十進位制2入棧
0046955A . E8 F5B8F9FF CALL ip.00404E54
不用跟進了吧,很明顯他要幹嘛拉 從試練碼的第2位開始取後面的16個字元呸不信跟進去看看 0012F0DC 00CE07EC ASCII "mejy[BCG][FCG]ts"
0046955F . 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
EAX= 0012F150 00CE07EC ASCII "mejy[BCG][FCG]ts"
00469562 . E8 8DB6F9FF CALL ip.00404BF4
00469567 . 83F8 10 CMP EAX,10 幹什麼想想看?嗬嗬
0046956A . 75 72 JNZ SHORT ip.004695DE
至此別管下面了,你可以跟著看看,直接F9把加快速度
此時請開啟登錄檔編輯器HEKY_LOVAL_MACHINESOFTWAREBETTERWORKSHOPIP
可以看見他將上面輸入的註冊碼儲存在此鍵下的k2值之中。後面從這取出然後和根據使用者名稱計算的註冊碼進行比較
程式提示“第一次輸入註冊碼完成,請輸入使用者名稱”你要第一個字元不是“#”提示錯誤了
下面輸入使用者名稱:mejy[BCG][FCG]點確定程式用中斷在下面
004694DB . B9 08000000 MOV ECX,8
。。。。。。。。。
0046950F . 8B45 E4 MOV EAX,DWORD PTR SS:[EBP-1C]
00469512 . B9 01000000 MOV ECX,1
00469517 . BA 01000000 MOV EDX,1
0046951C . E8 33B9F9FF CALL ip.00404E54
00469521 . C645 EB 00 MOV BYTE PTR SS:[EBP-15],0
00469525 . 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
00469528 . BA 5C994600 MOV EDX,ip.0046995C
0046952D . E8 0EB8F9FF CALL ip.00404D40
00469532 . 0F85 E4000000 JNZ ip.0046961C 第二次一定要跳
跳到這裡:
0046961C > 8D45 EC LEA EAX,DWORD PTR SS:[EBP-14] 省略n行程式碼
00469649 . E8 1A47FCFF CALL ip.0042DD68
0046964E . BA 68994600 MOV EDX,ip.00469968 ;
ASCII "softwareetterworkshopip" 開啟登錄檔
00469653 . 33C9 XOR ECX,ECX
00469655 . 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
00469658 . E8 6F47FCFF CALL ip.0042DDCC
0046965D . 84C0 TEST AL,AL
0046965F . 74 10 JE SHORT ip.00469671
00469661 . 8D4D EC LEA ECX,DWORD PTR SS:[EBP-14]
00469664 . BA 8C994600 MOV EDX,ip.0046998C ; ASCII "k2"
00469669 . 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
0046966C . E8 2349FCFF CALL ip.0042DF94 這個call的作用是取登錄檔鍵值
00469671 > 33C0 XOR EAX,EAX
省略。。。。。。。。。。。。。。。
0046969D . 84C0 TEST AL,AL
0046969F . 0F84 36020000 JE ip.004698DB
004696A5 . 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14]
004696A8 . E8 47B5F9FF CALL ip.00404BF4 取長度
004696AD . 83F8 10 CMP EAX,10 比較
004696B0 . 0F85 E4010000 JNZ ip.0046989A
004696B6 . 8D55 F8 LEA EDX,DWORD PTR SS:[EBP-8] 處理使用者名稱了
004696B9 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004696BC . 8B80 04030000 MOV EAX,DWORD PTR DS:[EAX+304]
004696C2 . E8 D5D1FDFF CALL ip.0044689C 取使用者名稱
004696C7 . 837D F8 00 CMP DWORD PTR SS:[EBP-8],0 使用者名稱長度是否為0
004696CB . 74 42 JE SHORT ip.0046970F
004696CD . 8D45 DC LEA EAX,DWORD PTR SS:[EBP-24]
004696D0 . 50 PUSH EAX
004696D1 . 8D45 D4 LEA EAX,DWORD PTR SS:[EBP-2C]
004696D4 . 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8] 堆疊中存的是使用者名稱
004696D7 . BA D8994600 MOV EDX,ip.004699D8 ; ASCII "ip" 注意這兒有一個常量”ip”,看看他有什麼作用
004696DC . E8 5FB5F9FF CALL ip.00404C40
004696E1 . 8B45 D4 MOV EAX,DWORD PTR SS:[EBP-2C]
004696E4 . 8D55 D8 LEA EDX,DWORD PTR SS:[EBP-28] F8來到這你會發現
0012F12C 00CDAACC ASCII "ipmejy[BCG][FCG]"
已經將他和使用者名稱連線起來了 下面應該對他進行運算了,所以下面這個Call必根
004696E7 . E8 00FBFFFF CALL ip.004691EC ************ 請看call吧,呆會再回來******************
004696EC . 8B45 D8 MOV EAX,DWORD PTR SS:[EBP-28] 經過一番運算最後
0012F130 00CE3C24 ASCII "1618f5e276de379ff9939bce6f0429ad"
004696EF . B9 10000000 MOV ECX,10 16如站
004696F4 . BA 01000000 MOV EDX,1
004696F9 . E8 56B7F9FF CALL ip.00404E54 從第一位開始取前16位
0012F134 00CE3C54 ASCII "1618f5e276de379f"
004696FE . 8B55 DC MOV EDX,DWORD PTR SS:[EBP-24]
00469701 . 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14] 取上面的儲存的試練碼
00469704 . E8 37B6F9FF CALL ip.00404D40 比較
00469709 75 04 JNZ SHORT ip.0046970F 關鍵跳轉 跳就失敗
來到下面
00469775 > 8D45 D0 LEA EAX,DWORD PTR SS:[EBP-30]
00469778 . 50 PUSH EAX
00469779 . 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
0046977 0FB64418 FF MOVZX EAX,BYTE PTR DS:[EAX+EBX-1]依次取使用者名稱各位字元
00469781 . 50 PUSH EAX 每一位的ASCII碼
00469782 . B8 FF000000 MOV EAX,0FF
00469787 . 5A POP EDX
00469788 . 2BC2 SUB EAX,EDX 減
0046978A . 05 E8030000 ADD EAX,3E8 加
0046978F . 8D55 CC LEA EDX,DWORD PTR SS:[EBP-34]
00469792 . E8 C1F2F9FF CALL ip.00408A58 這個call將數字轉化為字串
00469797 . 8B45 CC MOV EAX,DWORD PTR SS:[EBP-34]
0046979A . B9 03000000 MOV ECX,3
0046979F . BA 02000000 MOV EDX,2
004697A4 . E8 ABB6F9FF CALL ip.00404E54
從第二位開始取字串捨去上面字串的第一個字元
004697A9 . 8B55 D0 MOV EDX,DWORD PTR SS:[EBP-30]
004697AC . 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
004697AF . E8 48B4F9FF CALL ip.00404BFC
004697B4 . 43 INC EBX
004697B5 . 4E DEC ESI 判斷是否計算完畢
004697B6 .^75 BD JNZ SHORT ip.00469775
004697B8 > 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
004697BB . BA E4994600 MOV EDX,ip.004699E4 ; ASCII "759"
004697C0 . E8 37B4F9FF CALL ip.00404BFC 將“759”連到上面的字串後
004697C5 . 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
004697C8 . E8 27B4F9FF CALL ip.00404BF4
004697CD . 8BD8 MOV EBX,EAX
004697CF . 83C3 02 ADD EBX,2
004697D2 . 83FB 20 CMP EBX,20
004697D5 . 7F 42 JG SHORT ip.00469819
004697D7 > 8D83 F8020000 LEA EAX,DWORD PTR DS:[EBX+2F8]
004697DD . E8 4E99F9FF CALL ip.00403130
004697E2 . 8BF0 MOV ESI,EAX
004697E4 . 8D45 C8 LEA EAX,DWORD PTR SS:[EBP-38]
004697E7 . 50 PUSH EAX
004697E8 . 8D55 C4 LEA EDX,DWORD PTR SS:[EBP-3C]
004697EB . 8D86 E8030000 LEA EAX,DWORD PTR DS:[ESI+3E8]
004697F1 . E8 62F2F9FF CALL ip.00408A58
004697F6 . 8B45 C4 MOV EAX,DWORD PTR SS:[EBP-3C]
004697F9 . B9 03000000 MOV ECX,3
004697FE . BA 02000000 MOV EDX,2
00469803 . E8 4CB6F9FF CALL ip.00404E54
00469808 . 8B55 C8 MOV EDX,DWORD PTR SS:[EBP-38]
0046980B . 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
0046980E . E8 E9B3F9FF CALL ip.00404BFC 將”000”連到字串後面
00469813 . 43 INC EBX
00469814 . 83FB 21 CMP EBX,21 比較長度小於繼續跳到4697D7
00469817 .^75 BE JNZ SHORT ip.004697D7
經計算後(計算很簡單不分析了為什麼呢?因為這兒於註冊碼無關迷惑破解者的)
"146154149134164189188184162164185188184162759000024669157212524249126291334064373055663047231726"
00469819 > 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]
0046981C . E8 13B1F9FF CALL ip.00404934
00469821 . 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
00469824 . E8 CBB3F9FF CALL ip.00404BF4
00469829 . 8BD8 MOV EBX,EAX
0046982B . 83FB 01 CMP EBX,1
0046982E . 7C 1F JL SHORT ip.0046984F
00469830 > 8D45 C0 LEA EAX,DWORD PTR SS:[EBP-40] 對上面的字串逆序
00469833 . 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
00469836 . 8A541A FF MOV DL,BYTE PTR DS:[EDX+EBX-1]
0046983A . E8 DDB2F9FF CALL ip.00404B1C
0046983F . 8B55 C0 MOV EDX,DWORD PTR SS:[EBP-40]
00469842 . 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]
00469845 . E8 B2B3F9FF CALL ip.00404BFC
0046984A . 4B DEC EBX
0046984B . 85DB TEST EBX,EBX
0046984D .^75 E1 JNZ SHORT ip.00469830
0046984F > 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8]
結果為
"627132740366550373460433192621942425212751966420000957261481881581461261481881981461431941451641"
00469852 . BA F0994600 MOV EDX,ip.004699F0 ; ASCII "k1"
將它寫入登錄檔
00469857 . 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
0046985A . E8 0947FCFF CALL ip.0042DF68
0046985F > 33C0 XOR EAX,EAX
00469861 . 5A POP EDX
00469862 . 59 POP ECX
00469863 . 59 POP ECX
上面的CALL 慢慢的 經過一番尋找來到這裡
004690C6 |> 8D5434 08 LEA EDX,DWORD PTR SS:[ESP+ESI+8]
004690CA |. 8D43 1C LEA EAX,DWORD PTR DS:[EBX+1C]
004690CD |. B9 40000000 MOV ECX,40
004690D2 |. E8 85E2F9FF CALL ip.0040735C
004690D7 |. 8BC3 MOV EAX,EBX
004690D9 |. E8 56F6FFFF CALL ip.00468734 這個call中藏著讓你害怕的寶寶跟進
004690DE |. 83C6 40 ADD ESI,40
004690E1 |. 3B73 18 CMP ESI,DWORD PTR DS:[EBX+18]
004690E4 |.^75 E0 JNZ SHORT ip.004690C6
004690E6 |. 81C4 4C100000 ADD ESP,104C
004690EC |. 5E POP ESI
004690ED |. 5B POP EBX
004690EE . C3 RETN
大家來看看,註冊碼演算法呀! 也是關鍵
00468620 /$ C740 5C 012345>MOV DWORD PTR DS:[EAX+5C],67452301
00468627 |. C740 60 89ABCD>MOV DWORD PTR DS:[EAX+60],EFCDAB89
0046862E |. C740 64 FEDCBA>MOV DWORD PTR DS:[EAX+64],98BADCFE
00468635 |. C740 68 765432>MOV DWORD PTR DS:[EAX+68],10325476
0046863C . C3 RETN
程式固定我們把這當成一個陣列 //典型的MD5演算法標誌
a[0]= 67452301 地址為 EAX+5C後面00468735這兒變了一下 地址為: EBX+5C
,a[1]= EFCDAB89, EBX+60
a[2]= 98BADCFE, EBX+64
a[3]= 10325476 EBX+68
00CE3B58 00000040
00CE3B5C 656D7069
00CE3B60 425B796A
00CE3B64 5B5D4743
00CE3B68 5D474346
00CE3B6C 00000080
設這個陣列為b[];下面函式的第三個引數 他是輸入的使用者名稱的十六進位制字元
下面就要對他進行很多變換, 上面的call
00468734 /$ 53 PUSH EBX
00468735 |. 8BD8 MOV EBX,EAX
00468737 |. 8B43 5C MOV EAX,DWORD PTR DS:[EBX+5C]
0046873A |. 8943 6C MOV DWORD PTR DS:[EBX+6C],EAX
0046873D |. 8B43 60 MOV EAX,DWORD PTR DS:[EBX+60]
00468740 |. 8943 70 MOV DWORD PTR DS:[EBX+70],EAX
00468743 |. 8B43 64 MOV EAX,DWORD PTR DS:[EBX+64]
00468746 |. 8943 74 MOV DWORD PTR DS:[EBX+74],EAX
00468749 |. 8B43 68 MOV EAX,DWORD PTR DS:[EBX+68]
0046874C |. 8943 78 MOV DWORD PTR DS:[EBX+78],EAX
0046874F |. 8D43 64 LEA EAX,DWORD PTR DS:[EBX+64]
00468752 |. 50 PUSH EAX ; /Arg5
00468753 |. 8D43 68 LEA EAX,DWORD PTR DS:[EBX+68] ; |
00468756 |. 50 PUSH EAX ; |Arg4
00468757 |. 8D43 1C LEA EAX,DWORD PTR DS:[EBX+1C] ; |
0046875A |. 50 PUSH EAX ; |Arg3
0046875B |. 6A 07 PUSH 7 ; |Arg2 = 00000007
0046875D |. 68 78A46AD7 PUSH D76AA478 ; |Arg1 = D76AA478
00468762 |. 8D4B 60 LEA ECX,DWORD PTR DS:[EBX+60] ; |
00468765 |. 8D53 5C LEA EDX,DWORD PTR DS:[EBX+5C] ; |
00468768 |. 8BC3 MOV EAX,EBX ; |
0046876A |. E8 D1FEFFFF CALL ip.00468640 ; ip.00468640
中間省略n個類似的函式。。。。。。。。。。如果寫序號產生器的話你會暈死
這個下面表示為edx 每個函式經過計算改變的就是這個之
00468F48 |. 8BC3 MOV EAX,EBX ; |
00468F4A |. E8 A9F7FFFF CALL ip.004686F8 ; ip.004686F8
這個call是計算的關鍵跟進
這個函式有5個引數 i開始時為7
第一個函式的(a[2], a[3], b[0] , i , ********* ) 其中該函式第一和第二個引數隨著 i=7
第二個函式的(a[1], a[2], b[1], i+=5, *********)
第三個函式的(a[0] , a[1], b[2], i+=5,*********)
第四個函式的(a[3], a[0], b[3] ,i+=5, ******** ) i=7
然後開始迴圈了但是第五個引數每次都不一樣,怎麼做到這一點,有待研究!
一共迴圈了4次
開始做下一個迴圈
下一組迴圈第四個引數和上面的迴圈不同,初始i=5 ,每次i+=4; 同樣迴圈四次
然後做下一組迴圈 同樣每次的 b都有改變 初始時i=4; i+=7,i+=5,i+=7 同樣迴圈4次
然後做下一組迴圈,同樣 初始時i=6, i+=4;i+=5, i+=4 繼續迴圈4次 注意i的值
(因為這些函式實在太長了我在WORD裡貼了,足足30頁)
00468F4F |. 8B43 6C MOV EAX,DWORD PTR DS:[EBX+6C]
00468F52 |. 0143 5C ADD DWORD PTR DS:[EBX+5C],EAX
00468F55 |. 8B43 70 MOV EAX,DWORD PTR DS:[EBX+70]
00468F58 |. 0143 60 ADD DWORD PTR DS:[EBX+60],EAX
00468F5B |. 8B43 74 MOV EAX,DWORD PTR DS:[EBX+74]
00468F5E |. 0143 64 ADD DWORD PTR DS:[EBX+64],EAX
00468F61 |. 8B43 78 MOV EAX,DWORD PTR DS:[EBX+78]
00468F64 |. 0143 68 ADD DWORD PTR DS:[EBX+68],EAX
00468F67 |. 8D43 1C LEA EAX,DWORD PTR DS:[EBX+1C]
00468F6A |. 33C9 XOR ECX,ECX
00468F6C |. BA 40000000 MOV EDX,40
00468F71 |. E8 9AA1F9FF CALL ip.00403110
00468F76 |. 5B POP EBX
00468F77 . C3 RETN
我們把上面的函式參數列示為 K1,K2 ,K3 ,K4 ,K5 K1和K2每次去的是陣列a中的兩個
那麼剩下的兩個我們表示為 ecx,和edx
上面的call
00468640 /$ 55 PUSH EBP 入棧據我估計他使用遞迴的很佩服作者
00468641 |. 8BEC MOV EBP,ESP
00468643 |. 53 PUSH EBX
00468644 |. 56 PUSH ESI
00468645 |. 8BF1 MOV ESI,ECX 儲存上面竄來的ecx 設為 M
00468647 |. 8BDA MOV EBX,EDX 儲存上面傳來的edx 攝為N
00468649 |. 8B06 MOV EAX,DWORD PTR DS:[ESI]
設TEMP1=(eax=esi=ecx)=M
0046864B |. 8B55 18 MOV EDX,DWORD PTR SS:[EBP+18]
設TEMP2=K1 函式的第一個引數
0046864E |. 2302 AND EAX,DWORD PTR DS:[EDX]
TEMP1=TEMP2 AND TEMP2 (與運算)
00468650 |. 8B16 MOV EDX,DWORD PTR DS:[ESI]
TEMP2=ecx
00468652 |. F7D2 NOT EDX TEMP2=~TEMP2 求反
00468654 |. 8B4D 14 MOV ECX,DWORD PTR SS:[EBP+14] 函式的第二個引數
00468657 |. 2311 AND EDX,DWORD PTR DS:[ECX]
TEMP2=TEMP2 AND K2 (與運算)
00468659 |. 0BC2 OR EAX,EDX
TEMP1=TEMP1 | TEMP2 或運算
0046865B |. 0303 ADD EAX,DWORD PTR DS:[EBX]
TEMP1+=N
0046865D |. 8B55 10 MOV EDX,DWORD PTR SS:[EBP+10]
這是第三個引數 對c++中函式引數傳遞不清楚地這下該明白了吧 K3
00468660 |. 0302 ADD EAX,DWORD PTR DS:[EDX]
TEMP1+=K3
00468662 |. 0345 08 ADD EAX,DWORD PTR SS:[EBP+8]
第五個引數K5 TEMP1+=K5;
00468665 |. 8903 MOV DWORD PTR DS:[EBX],EAX
N=TEMP1;
00468667 |. 8B03 MOV EAX,DWORD PTR DS:[EBX]
00468669 |. 8A55 0C MOV DL,BYTE PTR SS:[EBP+C]
第四個引數K4 ,移位
0046866C |. E8 8FFFFFFF CALL ip.00468600 這個call的作用是TEMP1迴圈左移K4位
TEMP1<<K4;
00468671 |. 8903 MOV DWORD PTR DS:[EBX],EAX
N=TEMP1
00468673 |. 8B06 MOV EAX,DWORD PTR DS:[ESI] TEMP1=M
00468675 |. 0103 ADD DWORD PTR DS:[EBX],EAX N+=TEMP1;
00468677 |. 5E POP ESI
00468678 |. 5B POP EBX
00468679 |. 5D POP EBP
0046867A . C2 1400 RETN 14
注意每次改變的不是函式中傳過來的引數而是N得值,仔細觀察記憶體視窗
上面的call
00468600 /$ 55 PUSH EBP
00468601 |. 8BEC MOV EBP,ESP
00468603 |. 83C4 F4 ADD ESP,-0C
00468606 |. 8855 FF MOV BYTE PTR SS:[EBP-1],DL
00468609 |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
0046860C |. 8D55 F4 LEA EDX,DWORD PTR SS:[EBP-C]
0046860F |. 8A4D FF MOV CL,BYTE PTR SS:[EBP-1]
00468612 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
00468615 |. D3C0 ROL EAX,CL 迴圈左移
00468617 |. 8945 F4 MOV DWORD PTR SS:[EBP-C],EAX
0046861A |. 8B02 MOV EAX,DWORD PTR DS:[EDX]
0046861C |. 8BE5 MOV ESP,EBP
0046861E |. 5D POP EBP
0046861F . C3 RETN
經過上面的n個函式後 我們陣列中的值是
00CE3B9C E2F51816
00CE3BA0 9F37DE76
00CE3BA4 CE9B93F9
00CE3BA8 AD29046F
別急噩夢還沒結束 F8單步執行到這裡 ,怎麼知道的,呵呵慢慢式來的
00469253 |> 8D4D E0 LEA ECX,DWORD PTR SS:[EBP-20]
00469256 |. 33C0 XOR EAX,EAX
00469258 |. 8A03 MOV AL,BYTE PTR DS:[EBX]
0046925A |. BA 02000000 MOV EDX,2
0046925F |. E8 08F9F9FF CALL ip.00408B6C
00469264 |. 8B55 E0 MOV EDX,DWORD PTR SS:[EBP-20]
00469267 |. 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
0046926A |. E8 8DB9F9FF CALL ip.00404BFC
0046926F |. 43 INC EBX
00469270 |. 4E DEC ESI
00469271 |.^75 E0 JNZ SHORT ip.00469253 迴圈
00469273 |. 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]
這個迴圈的作用是將上面的陣列轉化為字串形 只有兩個call我不貼程式碼了。
轉化的結果為0012F0EC 00CE3BF4 ASCII "1618F5E276DE379FF9939BCE6F0429AD"
總結一下吧:我想沒人願意寫這個軟體的破解思路把!也沒人願意寫他的序號產生器,我從早上8點分析到下午5點,加上這篇文章。赫赫作者的演算法很麻煩,誰寫個序號產生器氣氣作者。作者寫了這麼多演算法好像只要爆破一個點,就行了。失敗把!
註冊碼:就是取上面字串的前16位1618f5e276de379f 在前面加#
一個可用的註冊碼 :#1618f5e276de379f 使用者名稱 mejy[BCG][FCG]
演算法實在太煩寫得不好,不好意思。寫不出序號產生器
相關文章
- [原創]演算法淺探――OpenCanvas
V2.24 漢化版2015-11-15演算法Canvas
- [原創]Blowfish Cipher淺析2020-01-16
- 一個軟體的MD5註冊演算法【原創】2004-12-29演算法
- 【原創】星空視訊俱樂部 V1.75註冊演算法簡析2015-11-15演算法
- 淺析Buddy演算法2022-07-30演算法
- 淺析雜湊演算法2019-03-10演算法
- App防Bot新版ATT方案淺析與演算法還原2021-12-31APP演算法
- FTP工具LeapFTP演算法淺析!2015-11-15FTP演算法
- WaterWall 5.01演算法淺析2015-11-15演算法
- 張洋:淺析PageRank演算法2013-03-26演算法
- 淺析vue2.0的diff演算法2019-02-28Vue演算法
- Java 集合中的排序演算法淺析2023-02-20Java排序演算法
- 淺析前端框架如何更新檢視2021-09-09前端框架
- 淺析 Flutter 與 iOS 的檢視橋樑2020-08-06FlutteriOS
- 家庭電腦相簿系統標準版6演算法淺析2015-11-15演算法
- 軟體工程目錄管理淺析(原創)2008-07-01軟體工程
- 【原創】菜鳥也演算法分析 -- 區域網檢視工具(LanSee V1.522015-11-15演算法
- TCP IP原理淺析2017-12-13TCP
- 整合學習演算法(Ensemble Method)淺析2018-12-28演算法
- RSA非對稱加密演算法淺析2023-01-18加密演算法
- 對話 | 淺析NEO的dBFT共識演算法2019-01-19演算法
- MD5演算法2015-11-15演算法
- JVM 系列文章之 GC 演算法淺析2018-09-07JVMGC演算法
- 回溯演算法之復原IP地址2019-03-19演算法
- [原創]破解-分析Crackme演算法2009-06-13演算法
- DIFF演算法淺析(三)在react中的實現2020-08-06演算法React
- 【原創】FileRecoveryAngel 演算法分析+序號產生器2015-11-15演算法
- 淺析線上代理IP的用法2021-09-11
- MD5加密演算法2024-09-14加密演算法
- 建立檢視和淺析LOCAL INDEX和GLOBAL INDEX2008-07-04Index
- 文書處理LemmyV4.0演算法淺析!2003-07-03演算法
- 鍵盤滑鼠工具CMDbarV2.3演算法淺析!2015-11-15演算法
- 【原創】WinImage 7.0 序列號演算法2015-11-15演算法
- 淺析代理IP與VPS2023-02-01
- 淺析每日使用代理IP的優勢2021-09-11
- MD5演算法詳解2021-06-28演算法
- ORACLE 檢視IP,解析機器名2018-07-24Oracle
- 安裝製作Setup2Go演算法淺析!2003-07-02Go演算法