天天看點

X86逆向3:通過修改關鍵CALL破解

軟體逆向第一課中我們通過爆破的方式直接破解了程式的登入限制,但這一種方式很不合理,因為你隻是破解了登入這一處的驗證,如果程式内部還有其他的驗證那麼你需要再次爆破第二個驗證,顯然這種方式是很煩人的,如果有1000處這樣的驗證環節那麼就需要爆破1000次跳轉。

那有沒有一種方式可以隻破解一次就達到破解整個程式的目的呢? 有,關鍵CALL,我們猜測一下程式作者的思路,作者不可能将每一處需要驗證的環節都寫一遍,顯然這樣是很麻煩的,那有沒有解決辦法呢? 當然有,那就是單獨寫一個驗證函數,注冊和驗證共用一個函數進行驗證,這樣的話就節約了很大的開發時間。

------------------------------------------------------------

本章難度:★☆☆☆☆☆☆☆☆☆

本章課件:CM_03.zip

------------------------------------------------------------

以下小程式,當使用者輸入假的注冊碼後,底部會提示試用版本,而關于頁面點選驗證後,會提示還未注冊,我們這裡當然可以分别爆破每一處的關鍵跳轉,但是這裡我們不這樣做,這兩個驗證頁面是共用一個驗證CALL的,是以我們找到關鍵CALL,修改關鍵CALL的傳回值,就能達到完全破解的目的。

X86逆向3:通過修改關鍵CALL破解
X86逆向3:通過修改關鍵CALL破解

1.OD載入程式,然後直接【F9】運作程式,搜尋字元串,搜尋關鍵字【試用版本】,直接點過去。

X86逆向3:通過修改關鍵CALL破解

2.發現有跳轉進來了,我們直接往上找找到關鍵跳轉,

X86逆向3:通過修改關鍵CALL破解

3.發現了關鍵CALL和關鍵跳,直接在這兩個位置下斷點。

X86逆向3:通過修改關鍵CALL破解

4.運作後發現跳轉實作了,我們暫時修改以下Z标志位,讓其不跳轉,然後直接【F9】運作。

X86逆向3:通過修改關鍵CALL破解

5.你會發現顯示注冊成功,但是如果你點開關于頁面,點選驗證按鈕的話,會出現沒有激活的情況,這就是因為我們隻破解了一處跳轉,并沒有完全破解程式,好了直接重新載入程式,我們重新搞。

X86逆向3:通過修改關鍵CALL破解
X86逆向3:通過修改關鍵CALL破解

6.直接取消【je 004012E1】處的【F2】斷點,直接在【CALL 00401142】處下一個斷點,一般情況下關鍵跳轉的上面前2個CALl就是關鍵CALL。

X86逆向3:通過修改關鍵CALL破解

7.重新加載程式,并運作,我們輸入假的注冊碼,然後點選注冊按鈕,這裡直接按下【F7】進入這個CALL。

X86逆向3:通過修改關鍵CALL破解

8.進入到這個CALL後,看下方【本地調用來自xxxx】,就是說有兩處調用了這個CALL來完成驗證的。

X86逆向3:通過修改關鍵CALL破解

9.直接單步【F8】,到達程式傳回發現EAX寄存器變成了0,說明驗證失敗了。

X86逆向3:通過修改關鍵CALL破解

10.我們直接重新載入程式,運作程式,輸入假注冊碼點選注冊,OD斷下了,直接【F7】進入CALL内部。直接寫入彙編代碼。

X86逆向3:通過修改關鍵CALL破解

11.直接儲存程式。

X86逆向3:通過修改關鍵CALL破解
X86逆向3:通過修改關鍵CALL破解

12.打開破解版本看一下,完美破解了,我們并沒有修改關鍵跳轉,而是修改了關鍵CALL,進而實作的破解。

X86逆向3:通過修改關鍵CALL破解
X86逆向3:通過修改關鍵CALL破解