Crackme006 - 全新160個CrackMe學習系列(圖文|視頻|註冊機源碼)

知乎:逆向驛站

原文鏈接
CrackMe006 | 難度適中適合練手 |160個CrackMe深度解析(圖文+視頻+註冊機源碼)

crackme006,依然是delphi的,而且沒殼子,條線比較清晰,算法也不難,非常適合新入門的來練習.
快過年了,Crackme系列年前就停更在006吧,祝大家新年666 ,年後繼續

準備

【環境和工具】

  • win7/xp虛擬機環境

  • CrackMe006(aLoNg3x.1.exe)

  • ollydbg

  • Dededark

【學習層次】

  • 逆向分析程序驗證流程邏輯

  • 解密算法,寫註冊機

  • 積累Delphi程序逆向特點經驗

實戰圖文

最終效果展示

程序驗證流程邏輯圖

動態分析

1.程序觀察

旁邊既然有個help,我們當然要看了,四個彈框,有實際信息價值的是頭兩個,如圖

大體意思是,這個crackme的最終目標是隱藏ok和cancella按鈕來觀看完整的Ringzero logo。

2.控件ID,事件函數信息
依然老規矩,既然是delphi的程序,我們就先用dededark給控件信息和事件函數信息蒐集出來

3.控件ID常量搜索法,打開入手點
程序開始是ok按鈕是禁用狀態,cancella按鈕是可以點擊的,那麼我們就從cancella入手,兩個方向,你可以去找cancellaclick事件的函數入手,也可以從cancella控件ID入手,我這裏選擇後者,因爲最終目的是cancella要被隱藏起來,無論如何一定會用到控件ID

查找→所有常量→2D0(cancella按鈕控件ID),結果如下

一共有四個地方用到了這個控件ID,我們分別跟入查看哪個是我們想找的隱藏這個控件的反彙編代碼,從上至下依次如下



找到了入手點,我們開始上下閱讀函數塊,發現這正是cancellaclick事件函數

4.分析Cancellaclick中算法
在Cancellaclick函數入口處下斷點,然後用戶名輸入123456,註冊碼輸入654321,然後開始動態調試分析,F8步過分析如下圖

F7跟如算法call仔細分析,如下圖

這種不是摘要hash的,是直接可以逆推計算出註冊碼,根據以上算法的反彙編分析,寫出逆推註冊碼的源碼,如下

    char szName1[128] = {0};
    char szCode[128] ={0} ;
    char szRes[256] ={0} ;
    int nKey = 0 ;
    int nlen = 0;
    int nTemp = 0 ;

    GetDlgItemText(IDC_EDIT1,szName1,128);
    nlen = strlen(szName1);
    if (nlen<=5 || nlen >10 || szName1[0] == 0x30)
    {
        MessageBox("請輸入6-10字符長度的字符串,而且第一位不能是0!","逆向驛站提示您");
        return ;
    }
    /************************************************************************/
    /* cancella點擊事件算法,可隱藏cancella按鈕,根據輸入name推code          */
    /************************************************************************/
    nKey = ((int)szName1[4])%7+2 ;
    nTemp = nKey ;
    //階乘
    for (int i=1;i<nTemp;i++)
    {
        nKey = nKey * i;
    }
    
    nTemp = nKey ;
    nKey = 0 ;
    //求和
    for (int j =0;j<nlen ;j++)
    {
        nKey = nKey + nTemp * ((int)szName1[j]);
    }
    //得出正確code
    nKey = nKey - 0x7a69 ;//nKey值就是code應該輸入的值

例如我們輸入的用戶名是123456,逆推註冊碼計算如下

  • "123456"的第五個字符是"5",asc碼是53,即十六進制0x35

  • 除以7餘數是4,再加2是6

  • 6的階乘是6 * 5* 4* 3 2 1,等於720 ,即十六進制的0x2D0

  • 123456每個字符的asc碼相加是0x31+0x32+0x33+0x34+0x35+0x36,結果是0x135

  • 0x135 乘以0x2D0是0x36510

  • 0x36510比註冊碼的十六進制形態大0x7A69

  • 即註冊碼是0x36510-0x7A69 = 0x2EAA7 ,即十進制是191143

算出了註冊碼,我們來測試一下,如下動圖

Cancella按鈕消失

5.分析OK按鈕中算法
有了如上的過程作爲經驗,我們"依葫蘆畫瓢",來進行ok按鈕中的算法分析,依然是okClick事件入口下斷,F8動態分析,結果如下

F7跟如算法call仔細分析,如下圖

分析後發現,這個算法是根據已經算出的註冊碼,再次要求用戶名合規,算法並不難,而且很敏感的看到0x41,0x41對應的asc字符是大寫字母A,而0x41加上的數字的取值範圍是0-0x19,即十進制0-25,那一看就知道,就是26個大寫字母範圍內了,這時候你可以變態的暴力枚舉也行,當然這個也是可以逆推出來,我們還是選擇逆推吧。源碼如下

    /************************************************************************/
    /* ok點擊事件算法,可隱藏ok按鈕,根據code推name                          */
    /************************************************************************/

    sprintf(szCode,"%d",nKey);
    nlen =strlen(szCode);
    szName1[nlen]='\0';
    //循環處理後,szName1就是要求的name
    for (int k =nlen-1;k>=0;k--)
    {
        szName1[k] = ((int)szCode[k] * (int)szCode[k] * (k+1))%0x19+0x41;

    }
    sprintf(szRes,"1.請在code處輸入%d,然後點擊cancella按鈕\r\n\r\n", nKey);
    sprintf(szRes+strlen(szRes),"2.cancella按鈕消失後,請在name處輸入%s,然後點擊ok按鈕\r\n\r\n", szName1);
    sprintf(szRes+strlen(szRes),"3.ok按鈕消失,註冊成功");
    SetDlgItemText(IDC_EDIT2,szRes);

我們剛輸入的註冊碼是191143,逆推出用戶名應該是"BXDEUG",驗證如下動圖

OK按鈕消失,至此全部搞定, 是不是感覺不難,去網盤中下載,試試吧

補充知識點

再CancellaClick事件算法中,有個階乘計算,函數內部反彙編代碼如下,可以作爲知識點積累,下次看到這個第一時間就能反應過來,提高效率,逆向的老手往往是這種知識碎片很多,而且腦部搜索算法很精準

最後,喜歡這裏的請推薦給你身邊的朋友吧(滲透測試、逆向破解、病毒分析、信息安全等)


文章中涉及軟件、課件、源碼等均在網盤,爲避免網盤鏈接失效,公衆號中回覆:網盤

歡迎關注微信公衆號:逆向驛站

相關文章

CrackMe-005精解(下)

CrackMe-005精解(上)

CrackMe-004精解

CrackMe-003精解

CrackMe-002精解

CrackMe-001精解

本期標籤:dededark|delphi反彙編|crackme|crackme6|crackme06

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