原文網址在此 http://www.securitytube.net/video/1078
如果網頁連結/影片失效請聯絡我。
閱讀本文請搭配上方網址的影片。
-------------------------------------------------------------------------------------------------------
最近對於反組譯 與 組合語言有點興趣,所以找了網路上的教學來看,由於是英文的所以讀者可能需要多聽幾次。
此教學為"教學 與 學習" 用,請不要拿去做商業行為。
作業系統: Windows 8 64bit
反組譯工具: OllyDBG 2.0 官方版本 no plugin
程式撰寫工具: SlickEdit 官方試用版本
GCC編譯環境: Cygwin 64bit-安裝gcc
以上大家都可以在google輕易找到
至於學習對象為mirc 版本為6.0.1,官方不提供舊版,請讀者們自己尋找。
OllyDBG的基本操作這邊就不詳細介紹了,Google以下資訊非常的多。
這邊會用到的是
F2-設斷點
F4-執行到目前位置
F7-逐步執行遇到call跳進去執行
F8-逐步執行遇到Call不跳進去執行
以下為上方網頁影片重點整理:
1/4:
首先開啟OllyDBG 選擇學習對象,先執行一遍了解程式的大概運作流程。
這邊原作者一開始猜測Box傳遞訊息使用GetDlgItemTextA,但是找尋不到所以轉而尋找SendDlgMessageA,則找到許多Caller, 但是不知道哪個才是Register所呼叫的,所以把所有的Caller都下了斷點。如此再次執行程式並觀察被截停在哪就知道判斷序號的地方為何處。
發現某區段程式碼疑似判斷的則可以把其他斷點都消除,只留下要檢測的。接下來就是苦功與經驗了,大概閱讀一下程式碼意義,可以知道Call結束後Test EAX,EAX,為檢測上一個Call的返回直,如果EAX為true 則可以通過反之則不行,如果我們只是要單純可以使用這個程式,原作者說可以直接把EAX設為1,如此一來不管Call回傳結果為何都判斷為True。
2/4 and 3/4
這邊我們要進去看那個Call的判斷序號演算法,來推算出產生序號的方法。
第一個演算法是判斷有無"-"
第二個則是把User name 第四個之後丟進來做hash 產生 地一部分的序號
第三個則是把User name 第三個之後丟進來做Hash 產生第二部分序號
這邊困難的部分是如何閱讀Assembly code 把code 轉為自己熟悉的高階語言,這需要大量的時間與努力才有辦法達到與觀察Assembly code 就可以知道核心判斷演算法為何。
4/4
對於演算法做驗證,與簡單的C++ MFC GUI的撰寫。
如果有人需要影片中的 mirc_keygen.c or mirc_keygen.exe 也可以私信給我。
歡迎討論。
另外再次提醒請不要拿去做商業行為。
沒有留言:
張貼留言