CrackMe007 | 難度適當提升 |160個CrackMe深度解析(圖文+視頻+註冊機源碼)

做者:逆向驛站
微信公衆號:逆向驛站
知乎:逆向驛站
圖片描述算法

crackme007,是006的升級版,程序開發者給出的難度是3星,多是迷惑有點多?我的以爲條線仍是比較清晰,難度也不大,依然適合新手

準備

【環境和工具】安全

  • win7/xp虛擬機環境
  • CrackMe007(aLoNg3x.2.exe)
  • ollydbg
  • Dededark

【學習層次】微信

  • 逆向分析程序驗證流程邏輯
  • 解密算法,寫註冊機
  • 積累Delphi程序逆向特色經驗

實戰圖文

最終效果展現

圖片描述

程序驗證流程邏輯圖

圖片描述

動態分析

1.程序觀察
crackme006的升級版,最終目標是一致的,均是要求給下方的藍色logo無遮蓋的顯示出來,也就是說要給這個區域的控件所有隱藏,程序界面以下圖
圖片描述
圖片描述網絡

同時可見開發crackme的和學習crackme的目標和標準是一致的,path的方式是不被承認的,即不可爆破,crackme如果個美貌女子,則應徵服其心,切不可霸王硬上弓。函數

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

3.控件ID常量搜索法,打開入手點
程序開始只有一個Register按鈕,對應上圖,其控件ID是2CC,那麼咱們依然就從2CC常量出發
查找→全部常量→2CC(Register按鈕控件ID),結果以下
圖片描述
跟入第一個,根據以前的對dephi程序逆向的經驗,應該能夠一眼看出,這裏的反彙編代碼,功能是:dl的值0是隱藏,1是顯示,以下圖
圖片描述
能夠看出,如果程序如期執行到這裏,則隱藏Register按鈕,並顯示Again按鈕,那麼咱們在這個代碼的函數塊入口處下斷點,來動態分析這個函數塊的邏輯流程,以下圖
圖片描述
能夠看到,這個函數實際就是點擊Register按鈕的事件函數,首先會對code進行驗證,如果純數字則跳到下方,不然彈框報錯,並給[0x445830]賦值,看似畫蛇添足,實則是必須過程,緣由後面會提到,若是輸入的是純數字,則執行如下流程,如圖
圖片描述
在這裏咱們看到了算法函數,算法函數須要三個參數(用戶名、code、[0x445830]的值),算法函數如果合規,則隱藏Register按鈕,顯示Again按鈕。那麼咱們就F7跟入算法函數去研究算法學習

4.分析算法
在分析算法前,須要對[0x445830]這個全局變量值作一個說明區塊鏈

  • 初始值是0
  • 通過動態分析(請自行動手)得出,對它賦值的觸發條件是,須要code輸入至少6個英文字母,而後點擊Regsiter按鈕
  • 輸入AAAAAA,它會被賦值固定值0x1686
  • 既然是這種輸入輸出均可控的全局變量值,咱們就不去糾結其算法什麼的了,固然若是你想去研究分析,那也是值得提倡得
  • 然而爲何非得畫蛇添足得對他賦值呢?由於後面得核心算法中,它的值將做爲一個乘數,如果0的話,那麼算法的最終結果不管如何都會是0,0是沒法完成算法合規的,簡單的說,如果這個值是0,則不可能完成註冊,因此要對他進行這種看似畫蛇添足的隱藏賦值。是否是相似開啓隱藏奶牛關,呵呵!
  • 後面得全部分析中咱們都按照,code輸入AAAAAA後[0x445830]被賦值0x1686爲準

咱們來分析算法,如圖
圖片描述
圖片描述
可見核心算法是測試

  • 首先要求用戶名要大於4個字符,爲了防止溢出,我寫的註冊機就硬性規定爲5個字符
  • 根據輸入的用戶名,通過兩次嵌套循環,和[0x445830]的值,即咱們控制其值爲0x1686,共同計算出一個值,暫時記爲nTemp
  • nTemp = nTemp % 0xA2C2A
  • 第二次輸入的註冊碼要求是純數字,純數字做爲10進制的數字型值,記爲nCode
  • 則公式是nCode/0x59+nCode%0x50+1 = nTemp
  • 這種不是摘要hash的,是直接能夠逆推計算出註冊碼,根據以上分析,寫出逆推註冊碼的源碼,以下
//code輸入AAAAAA給[0x445830]賦的值
    int nKey = 0x1686;

    char szRes[1024] = {0};
    char szName[32] = {0};
    int nCode = 0;
    int nTemp = 0;

    GetDlgItemText(IDC_EDIT1,szName,31);

    if (strlen(szName)!=5)
    {
       MessageBox("請輸入5字符長度的字符串","逆向驛站提示您");
    }
    else
    {
        //根據name字符串計算

        for (int i =1;i<=5;i++)
        {
            for (int j =5;j>=1;j--)
            {
                nTemp = nTemp + (int)szName[i-1] * (int)szName[j-1] * nKey;

            }

        }
    }

    //取模
    nTemp = nTemp%0xA2C2A ;
    //反推code
    nCode = (0x50 - ((nTemp -1)*0x59 % 0x50))+(nTemp-1) * 0x59  ; 

    sprintf(szRes,"1.把註冊機的五字符長度用戶名輸入nome處\r\n\r\n");
    sprintf(szRes+strlen(szRes),"2.請在code處輸入AAAAAA,而後點擊Register按鈕,彈框確認關閉便可\r\n\r\n");
    sprintf(szRes+strlen(szRes),"3.請在code處輸入%d,而後點擊Register按鈕\r\n\r\n", nCode);
    sprintf(szRes+strlen(szRes),"4.Register按鈕消失,again按鈕出現\r\n\r\n");
    sprintf(szRes+strlen(szRes),"5.請再次在code處輸入AAAAAA,而後點擊again按鈕,彈框確認關閉便可\r\n\r\n");
    sprintf(szRes+strlen(szRes),"6.請再次在code處輸入%d,而後點擊again按鈕,按鈕消失,註冊成功\r\n\r\n", nCode);

    SetDlgItemText(IDC_EDIT2,szRes);
crackme註冊機的完整源碼均在網盤

5.分析Again按鈕事件函數
咱們如今已經成功的隱藏了Register按鈕,可是又出來了一個Again按鈕,有了如上的過程做爲經驗,咱們"依葫蘆畫瓢",對Again按鈕進行分析,結果發現,其實驗證流程徹底是重複了一遍Regsiter按鈕,Again按鈕點擊事件逆向代碼以下
圖片描述
圖片描述spa

能夠看到,給[0x445830]賦值的隱藏算法和最後的合規核心算法,均自動顯示出來了中文標籤,這就是習慣作標籤的好處,之因此會顯示出來,那證實跟上方的Regsiter部分的兩個算法均調用的相同的算法函數,參數相同,算法相同,那麼結果必定相同了。
因此Again按鈕消失的方法是跟Register如出一轍的,只是他消失後,再也不顯示其餘按鈕而已,至此註冊成功,Crackme007的標題也溫順的變成了Crackme by "your name"了。
圖片描述

是否是有如開頭所說的征服美女的快感?去網盤中下載,試試吧

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

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

圖片描述

相關文章

CrackMe-006精解

CrackMe-005精解(下)

CrackMe-005精解(上)

CrackMe-004精解

CrackMe-003精解

CrackMe-002精解

CrackMe-001精解

標籤:逆向|破解|反彙編|olldbg|滲透測試|病毒分析|網絡安全|區塊鏈本期標籤:dededark|delphi反彙編|crackme|crackme7|crackme07

相關文章
相關標籤/搜索