這系列的文章,基本上不講記憶體結構、組合語言、C/C++等,希望用最簡單的方式 幫助大家能夠快速了解怎麼去破解、逆向。當然,想要學好逆向一定是要去了解記憶體、組合語言、Win32、PE...etc
---------------------------------------------
進入正題。
作業系統環境:Windows XP Pro 32bit 版本2002 SP3
使用工具:Immunity Debugger ,用OllyDbg也可以,(這邊我自己是使用別人改良過的簡體中文化Immunity )
要破解的軟體:飞翔劳保发放管理软件 版本號:2.0.0.189 下載點,壓縮密碼lonelysec
(下載的練習程式不保證是安全無毒的,所以建議都下載安裝在虛擬機上。如載點失效,請私訊波波粉專)
圖1.Windows XP SP3環境
圖2.Immunity Debugger
圖3.飞翔劳保发放管理软件
首先開啟Immunity Debugger,然後點擊"文件"-->打開-->"飞翔劳保发放管理软件.exe"
如果你的作業系統環境與要破解的軟體"飞翔劳保发放管理软件"版本號都跟我完全一樣的話,打開成功後畫面應該要是這樣。(請仔細比對下)
Immunity Debugger、OllyDbg常用的按鍵功能介紹:
幾個常用的快捷鍵:
繼續執行: F9
執行到函式返回: Ctrl + F9
單步跳過: F8
單步跟進: F7
INT3(下斷點): F2
暫停: F12
這集會了解到的指令有 jnz、nop
jnz ; 結果不為零(或不相等)則轉移
nop ;為空指令,沒有任何意義。
我們先開啟"飞翔劳保发放管理软件"測試一下他的功能
這邊需要輸入帳號密碼才可以登入。
經測試,如果密碼輸入錯誤的話,會顯示"用户密码错误还有x次几会!"
這邊我們留意下軟體的訊息,待會可以利用到。
接下來進入Immunity Debugger,滑鼠點擊右鍵-->中文搜尋引擎-->智能搜索 (這邊我是習慣用智能搜索,依情況調整ASCII、UNICODE)
接下來我們點擊右鍵-->Find,然後輸入我們剛才得知的錯誤訊息"用户密码错误还有x次几会!",這邊建議輸入關鍵字就好,例如:"密码错误",如果直接輸入'用户密码错误还有x次几会!" 可能會找不到。
搜尋到登入錯誤訊息的關鍵字後,我們滑鼠點擊兩下進入查看
我們注意下 地址 00539AF3的位址,發現到有一個 > 的箭頭符號,是從地址 00539AC0過來的
觀察下 地址 00539AC0 是 jnz,而jnz符號代表的是 不等於時轉移。
我們可以思考下,這個程式在什麼情況下 會去判斷某個動作 不等於時就轉移?
程式碼可能長得像這樣
if (A==B)
執行 某個功能
else
錯誤
而這段我們是去追蹤"用戶密碼錯誤"的錯誤訊息,所以我們可以判斷出 00539AC0地址這邊應該是去判斷你的帳號密碼有沒有輸入正確,如果不正確(不等於)就會轉移。
當然上面這是其中一個判斷方法,比較實際的方式是去執行程式,然後透過Immunity Debugger去下斷點,去追蹤每一個功能,就可以得知了。
所以我們為了想要了解jnz這段是程式的哪一個功能,我們可以先在這邊下一個斷點,讓程式執行到該程式碼後會停止。這邊我們在 00539AC0地址點擊右鍵,然後"斷點"-->切換(F2),你也可以直接在 00539AC0地址點擊鍵盤上的F2,就會下斷點了。
下完斷點後,可以觀察到00539AC0地址 變成紅底白字了,這樣就是成功下斷點了。
下完斷點後,我們按下執行(F9),會自動開啟執行程式,然後我們可以隨便輸入密碼,或按下確認。
按下確認後,我們視窗切換回來Immunity Debugger,查看一下,我們發現00539AC0地址從紅底白字,變成白底紅字了,這邊可以得知 當我們按下確認這個動作後,程式會卡在00539AC0這個地址,而且這次沒有顯示"用户密码错误还有x次几会!"。在正常情況下應該會顯示"用户密码错误还有x次几会!"的,但因為我們在00539AC0地址下了斷點,所以程式還來不急執行到"用户密码错误还有x次几会!",就被我們給中止了。
這邊我們可以透過單步跳過(F8)來繼續測試,透過F8繼續執行被我們中止的程式碼,看看接下來換發生什麼事?
我們可以從下了斷點的00539AC0地址 按F8 一步一步執行到 00539B20地址,然後我們在按下 F9(繼續執行程式),然後切換視窗到飞翔勞保用品軟體上觀察下。
這邊我們可以發現這次突然顯示"用户密码错误还有2次几会!",這是個好消息
接下來我們為了再次確認我們剛才從下了斷點的00539AC0地址 按F8 一步一步執行到 00539B20地址,所執行的那些步驟 是否就是去判斷帳號密碼是否輸入正確,不正確則顯示"用户密码错误还有x次几会!"。
所以我們在隨便輸入一組密碼,然後按下確認。在切換回Immunity Debugger畫面
我們切換回Immunity Debugger畫面,這時你的畫面地址應該是顯示在00539AC0地址(差不多這個位址),然後我們再繼續F8一路往下到剛才的00539B20地址。
F8到00539B20地址後,我們在F9(繼續執行程式),然後查看勞保用品軟體。
我們可以發現到這次顯示"用户密码错误还有1次几会!"。這樣我們就可以確認這段程式碼的意思了。
接下來我們就可以開始嘗試破解。
我們現在知道了 下了斷點的00539AC0地址是去判斷你輸入的帳號密碼是否正確,如果不正確就會跳轉到00539AF3地址。
再次複習下,00539AC0地址 是jnz判斷,而jnz符號代表的是結果不為零(或不相等)則轉移。
所以我們有幾種思路可以思考下,我們應該要讓他 不管怎麼樣都強迫等於 ? 或是 直接無視帳號密碼的判斷 直接強迫他跳過?
這邊範例是以nop為例子,nop就是執行後沒有任何結果。所以我們把jnz改成nop的話,就是不讓jnz有動作。
我們在00539AC0地址 滑鼠點擊右鍵-->二進制-->用NOP填充。
填充完NOP後,可以觀察到 00539AC0 跟 00539AC1 都變成NOP了,而原本的jnz也消失了,被我們取代成nop了。
取代jnz後,我們可以來測試下這樣是否就破解成功呢?
我們可以繼續F8執行下去到00539B20地址,然後按下F9(繼續執行程式),切換視窗到飞翔勞保用品畫面。
切換到飞翔勞保用品畫面後,原本要輸入帳號密碼的視窗功能就消失了,然後就成功登入可以執行其他功能了。
破解成功後,我們需要將這個Immunity Debugger修改的程式碼給儲存起來,不然如果你沒有儲存就直接把Immunity Debugger關閉的話,下次還得再破解一次。
我們把剛才修改過的程式碼 00539ABE、00539AC0、00539AC1給選起來,然後滑鼠右鍵-->複製到可執行的文件-->選擇。
這邊你可能會注意到 為甚麼連00539ABE都要選起來呢? 其實這只是為了保險而已,所以你可以多選幾個,寧可多選,也不要少選到,是吧。
滑鼠右鍵-->保存文件。
這邊我們隨便取一個名稱 "飞翔劳保发放管理软件_破解版.exe"
然後我們關閉Immunity Debugger,開啟飞翔劳保发放管理软件_破解版.exe
發現還是要輸入帳號密碼,但我們這邊不用理他,直接按下確定就可以。
這樣就成功保存並且破解了,可以任意使用功能了。