前言
005,都說比較變態,很多人給放過去了,但是我還是決定上了它,既然變態就分兩篇,上篇先實際說流程,到底應該怎麼上它,下篇會告訴逆向分析的過程和方法
準備
【環境和工具】
-
win7/xp虛擬機環境
-
CrackMe005(ajj2.zip)
-
ollydbg
-
Dededark
-
peid
-
UPXEasyGUI.exe
【學習層次】
-
這個CM作者聲明瞭,“爆”他是不認可的
-
解密流程,寫key
-
積累Delphi程序逆向特點經驗
實戰圖文
一.最終效果動圖展示
整個流程
注意:建議使用我已經修改過的原版,修改點只有一個字符X盤符改成了C盤符,否則你需要增加X分區或者改盤符,擱不住,所以我修改了程序,當然你也可以自己脫殼後,自己搜索字符串,自己再改盤符字符串
1.複製目錄下ok.txt,到C:\ajj.126.c0m\j\o\j\o\ok.txt,這裏我給原版的X盤改成C盤了,不然就改分區。
2.這時就應該可以顯示出Edit2文本框,但是是禁用狀態。
3.右鍵點擊5次註冊按鈕(注意是右鍵)。
4.左鍵雙擊圖框區空白處(不能點着圖),Edit2文本框禁用解除。
5.用戶名輸入ajj
6.Edit2文本框內輸入1_345,78後左鍵雙擊Edit2輸入框中任何位置。
7.在圖片是“性相近”的時候,鼠標從軟件框右下腳移入軟件框內。
8.在圖片是“性本善”的時候,鼠標從軟件框左下角移入軟件框內。
9.這時候應該label3顯示出數字,是0,1,2,3這四個當中的其中一個。
10.將數字輸入我寫的註冊機,點擊生成最終點擊方案。
11.依照方案點擊相應圖片,註冊成功
三、key源碼
源碼中,我求的是點擊次數總和最小的方法,因爲其實有很多組合,只求效率最高的方法,源碼寫的比較臃腫,爲的是新手好讀懂
1 void CCM002Dlg::OnOK() 2 { 3 // TODO: Add extra validation here 4 5 //CDialog::OnOK(); 6 7 char szKey[1024]={0}; 8 int n = 0; 9 GetDlgItemText(IDC_EDIT1,szKey,1024); 10 if(!strlen(szKey)) 11 { 12 13 MessageBox("請按照【前期步驟】獲取正確數值後再生成方案!","友情提示"); 14 return; 15 } 16 n = GetDlgItemInt(IDC_EDIT1); 17 18 19 switch(n){ 20 case 1 : 21 n=0x3D; 22 break; 23 case 2 : 24 n=0x34; 25 break; 26 case 3 : 27 n=0xDF; 28 break; 29 30 default : // 可選的 31 n=0x41; 32 } 33 34 35 struct image 36 { 37 char szname[7]; 38 int nNumber ; 39 int nLef; 40 int nRight; 41 }; 42 image aImage[4]={0}; 43 44 sprintf(aImage[0].szname,"人之初"); 45 aImage[0].nNumber = 1; 46 aImage[0].nLef = 0x2; 47 aImage[0].nRight = 0x11; 48 49 sprintf(aImage[1].szname,"性本善"); 50 aImage[1].nNumber = 2; 51 aImage[1].nLef = 0x3; 52 aImage[1].nRight = 0x13; 53 54 sprintf(aImage[2].szname,"性相近"); 55 aImage[2].nNumber = 3; 56 aImage[2].nLef = 0x5; 57 aImage[2].nRight = 0x17; 58 59 sprintf(aImage[3].szname,"習相遠"); 60 aImage[3].nNumber = 4; 61 aImage[3].nLef = 0x7; 62 aImage[3].nRight = 0x1B; 63 /************************************************************************/ 64 /* 設計原則,選擇出點擊次數最少的方案 65 /* iR作爲大數數組下標,iL作爲小數數組下標,j大數商,k小數商,求i+j最小值 66 /************************************************************************/ 67 int nRes = 112; 68 int nIL = 0; 69 int nIR = 0; 70 int nJ = 0; 71 int nK =0 ; 72 for (int iL=0;iL<4;iL++) 73 { 74 for (int iR=0;iR < 4;iR++) 75 { 76 77 for (int j=1;j<=14;j++) 78 { 79 for (int k =0;k<=112;k++) 80 { 81 82 if ((aImage[iR].nRight*j + aImage[iL].nLef*k == n) && (nRes> j+k)) 83 { 84 nIL = iL; 85 nIR = iR; 86 nJ = j; 87 nK = k; 88 nRes = j+k ; 89 } 90 91 } 92 } 93 } 94 95 } 96 97 sprintf(szKey,"在“%s”圖片時左鍵點擊圖片%d次\r\n\r\n在“%s”圖片時右鍵點擊圖片%d次\r\n\r\n即可註冊成功!",aImage[nIL].szname,nK,aImage[nIR].szname,nJ); 98 SetDlgItemText(IDC_EDIT2,szKey); 99 100 101 }