CM005-逆向分析過程(上篇)

前言

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 }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章