1. 程式人生 > >[CrackMe]160個CrackMe之002

[CrackMe]160個CrackMe之002

吾愛破解專題彙總:【反彙編練習】160個CrackME索引目錄1~160建議收藏備用

一、逆向分析之暴力破解

  暴力破解,對於這種具有提示框的,很好定位。

  定位好之後,爆破其跳轉語句,就能達到破解目的。

  當然,我們之後還會分析其演算法寫出註冊機。

 

  1)點選OK,彈出標題上的對話方塊。此時點選暫停(不要關閉對話方塊),然後跳轉到 K視窗。

    可以看出其棧的呼叫順序,最下面的位於 0x40000(EXE)模組內,為使用者區程式碼。

    點選“顯示呼叫”,跳轉過去,檢視使用者區的彙編程式碼。

    

   2)往上看,字元很明顯。

    

   3)其跳轉結構就是 if else,找到關鍵跳轉點,如圖地方使用爆破即可。

    

 

二、逆向分析之演算法分析

  暴力破解,難度比較低,顯然不能滿足我們的預期。我們的目標是分析其演算法寫出註冊機。

  分析前需要具備一個意識:在2)中我們找到一串疑似生成的serial並驗證成功,假設該為十進位制字串,那麼我們在olldbg中看到的就是為十六進位制的數字。

    0x77148 = 487752,所以需要對 77148 這個數字敏感。

  

  1)檢視其跳轉時的 IF 條件。

   如下圖,使用 test si,si;je xxx 進行跳轉。翻譯過來就是“若si為0,則跳轉到xxx(錯誤顯示區)”

   我們繼續往上觀察,上面兩個函式依次是 __vbaFreeStrList,__vbaFreeObjList,這屬於釋放物件的函式,因此忽略。

   再往上看,我們發現其存在一個 __vbaStrCmph函式,其是字串比較函式,且返回值給esi,有大概率可能是“將serial與使用者輸入進行對比”

   

  2)在__vbaStrCmp函式處下斷點,觀察其傳入引數。        

    

    一個類似serial,和一個使用者輸入,我們下面驗證一下。

    

   很明顯正確,我們再換一組資料,其後面數字發生變化,我們有理由懷疑 "AKA-"是常量,後面的才是真正的變數。

    

   其根據使用者輸入計算,下面我們就來尋找這個計算。

  3)尋找 程式碼生成演算法。

    警告:不要再從 __bvaStrCmp演算法往上分析,而是找到使用者輸入的往下分析。

       因為你從下往上,無法確定到底是哪一環生成的,這種排除法很容易出錯。

         雖然從上往下,你可能丟掉了輸入點,但是你只要看到使用者輸入,說明並沒有被計算,那麼你所找的也就不重要了,根據這點來繼續分析也可以找到演算法。

     我們直接跳到 該函式入口 "push ebp"處,雖然分析的程式碼有點長,但我們只要盯緊 “CPU區、暫存器區、棧區” 三個部分,單步分析,找到使用者名稱 "abcde" 即可。

     這樣想其實也不是那麼的難。

    

   4)查詢到其 serial演算法:

    如圖,這是從函式頭步一直按F8第一次見到使用者輸入的字串 "abcde"

    

    演算法分析:其首先獲取使用者輸入的長度(__vbaLenBstr),然後該值乘以0x17CFB(0x402420處),之後獲取使用者輸入name的第一個字元(a),呼叫rtcAnsiValueBstr函式獲取其ASCII碼,最後與前面結果相加。

    5*0x402420+0x61('a') = 0x77148,該值正好與我們前面假設的完全相符,則說明這就是該值的正確演算法。

    下面會呼叫某些函式將其轉換為十進位制的UNICODE,然後與 "AKA-"進行拼接,最後呼叫 strcmp 函式進行驗證顯示結果。

 

三、解題感悟:

  1. 找到serial演算法本身就需要具有一定思路,像上面所強調的,找到if語句判斷的條件,之後不要從下往上推,而是從上往下推。
  2. 一般這類題不會太複雜,不要陷入很深的函數出不來,那往往說明你分析錯了。

 

 

    

    

 

     

&n