OD消息断点的设置方法
一、條件斷點:
 使用方法(如):
 在當前行按[Shift+F2]鍵->條件斷點(這個不太好用,因為程序BUG偶爾失效)。
 在當前行按[Shift+F4]鍵->條件記錄斷點(只要設置上條件語句和按什么條件生效就可以了)。
 條件語句(如):
 EAX == 00401000????????????????????? ; 當EAX的值為00401000時。
 [EAX] == 05201314??????????????????? ; 比如EAX的值為00401000,而地址00401000處所指向的值等于5201314時,即EAX的值表示為指針。
 [[EAX]] == 05201314????????????????? ; 比如EAX的值為00401000,地址00401000處所指向的值為00402000,而地址00402000處所指向的值等于5201314時,即EAX的值表示為指針的指針。
 EAX == 05201314 && EBX == 0x05201314 ; 當EAX的值等于5201314(十進制),并且EBX的值等于5201314(十六進制)時。
 [EBP+8] == WM_COMMAND??????????????? ;?
 [[EBP+8]] == 05201314??????????????? ;?
 byte ptr[EAX] == 'y'???????????????? ;?
 [EAX] == "coderui"?????????????????? ; 比如EAX的值為00401000,而地址00401000處所指向的字符串為“coderui”時,即EAX的值表示為指針。
 [[EAX+4]+4] == WM_LBUTTONUP????????? ;
二、消息斷點:
原理:就是在消息函數上設置條件斷點。
 步驟:
 1、使用[Ctrl+G]呼出“表達式跟隨窗口”,輸入“TranslateMessage”,然后回車。
 2、在“轉到”的位置上使用[Shift+F4]呼出“條件記錄斷點設置窗口”。
 3、在“條件”中輸入如下語句“[[ESP+4]]==當前按鈕句柄&&[[ESP+4]+4]==WM_LBUTTONUP”。
 4、把“暫停程序”設置為“按條件”,其他都為默認,然后確定。
 5、點擊按鈕后,程序會停在“TranslateMessage”函數的系統領空中。
 6、查看內存,對代碼段下“內存訪問斷點”,然后經過多次[F9](運行),就會找到關鍵的處理代碼了。
 
 
=================================================================================
以下演示如何下消息斷點,
OD運行TraceMe.exe,
單擊系統菜單View/Windows(查看/窗口)或單擊工具欄的W按鈕,如無內容,則執行右鍵菜單"Actualize"刷新命令
現在要對Check按鈕下斷點,當單擊按鈕時中斷,在Check行上單擊鼠標右鍵,在彈出的右鍵菜單中,選擇"Message breakpoint? on ClassProc"
當單擊事件發生時,會發送WM_LBUTTONUP這個消息,所以,選中這個消息,單擊OK,設好消息斷點:
單擊Check按鈕,將會中斷到windows系統代碼中,由于處于系統底層代碼里,這時企圖使用Alt+F9或Ctrl+F9返回TraceMe程序的領空代碼是徒勞的,
所以用Ctrl+M打開內存區,對.text區塊下一次性內存訪問斷點,如圖:
按F9運行,立即中斷在程序的空間004010D0處,這里正是程序的消息循環處:
注意的是,這段代碼是一個消息循環,不停的處理TraceMe主界面的各類消息,因此可能不是直接處理按鈕事件,
可以重復這個過程(其他過程會走到系統領域中,這時再下內存訪問斷點),在幾次中斷后到達處理按鈕的事件代碼,很快就能發現check按鈕事件的代碼:
 
===============================================================================================
- 標 題:關于《OllyDBG 入門系列(五)-消息斷點及 RUN 跟蹤》的補充
- 作 者:kisser1
- 時 間:2007-06-18 09:52?
 
- 鏈 接:http://bbs.pediy.com/showthread.php?t=46520
 作?者:?hklzt
 時?間:?2007-06-06,16:50
 聯?系:?QQ:87784858
 
 看完了《OllyDBG?入門系統(五)-消息斷點及?RUN?跟蹤》之后感覺如何?會否有如下問題:
 1、??是否覺得不知道在哪下斷?
 2、??為什么要這樣子下斷?
 3、??如何確定斷下來后的位置就是正確的?
 
 好,就本著這幾個問題來分析一遍。
 
 首先,先回顧下Windows的消息機制。要點:所有要處理的消息必然會由程序自己處理,不處理的消息都交由Windows處理。Windows的消息處理函數的格式,如下:
 LRESULT?CALLBACK?WindowProc(
 ????HWND?hwnd,??//?handle?of?window
 ????UINT?uMsg,??//?message?identifier
 ????WPARAM?wParam,??//?first?message?parameter
 ????LPARAM?lParam???//?second?message?parameter
 ???);
 其中uMsg就是關鍵,它代表消息的類型,如:WM_COMMAND,WM_GETTEXT等。記好哦。
 
 下面,我們來用實例講解。
 
 這個CrackMe是用對話框做的(你是怎么知道的?)。
 1、??用OllyDbg加載,Crtl?+?N,找到函數:USER32.DialogBoxParamA,右擊->“在每個參考上設置斷點”。
 2、??F9,運行。看,被攔了下來,如圖:
 
 
 3、??其中DlgProc的內容,就是我們需要找的東東。這個地址是消息處理函數的入口點。現在來解釋為什么要在窗口那才有消息斷點,看圖,
 
 要下消息斷點,首先得找到具有Windows消息處理函數格式的函數,然后,再根據棧的數據來判斷消息,如果符合下斷的消息,那么,OllyDbg就會攔下來(還會覺得不知道在哪下消息斷點了嗎?知道該如何下消息斷點了吧?)。很明顯有一點,這個消息斷點的功能是有限的,比如,要攔主窗口中的菜單消息呢?所以,消息斷點的功能還是有限的。如何擴展?扯遠了,下面再講。
 
 4、??Ctrl?+?G來到cyle.0041029,我們來到了消息處理函數了,但是,OllyDbg并未識別出這個函數是消息處理函數。所以,在cyle.0041029處,右擊->“分析”->“假定參數”,如圖:
 
 
 彈出一個對話框,選擇“WinProc(hWnd,msg,wParam,lParam)”。?
 
 點擊“應用”后,如圖。
 
 
 5、在cyle.0041029處,右擊->“斷點”->“在WinProc上的消息斷點”(平時是不是沒見過這個菜單呀?呵呵)。
 
 
 6、??在“消息”列表框中,選擇你要下斷的消息(Alt+B,刪除以前的斷點,以免影響心情)。
 
 
 7、??F9,運行,程序運行起來了。這時沒什么事情發生,當你在里面點了一個文本框之后(點它,是想讓它獲得Focus(焦點),以便能夠輸入數據),事情就發生了。現在沒辦法在文本框里輸入注冊碼,也沒辦法點擊按鈕。這是怎么回事呢?仔細看一下Stack(棧)的那個窗口,噢!原來被文本框的通知EN_SETFOUCE搞壞了!停留在EN_SETFOCUS和EN_KILLFOCUS兩個消息之間了。
 
 8、??好,現在來擴展消息斷點(消息斷點是否是條件斷點的特殊例子?),即使用條件斷點(賣弄了一下,呵呵)。
 
 
 看你需求,條件和條件記錄,在這里是沒什么區別的,因為不需要記錄的內容。
 
 9、??按Shitf+F2,輸入?MSG?==WM_COMMAND?&&?[ESP+C]==66(這個66是怎么來的?這個就是那個Check按鈕的ID,意思就是“當收到WM_COMMAND,且是由ID為0x66發出的時候中斷”),確定,F9,運行。
 
 10、現在,輸入Name和Serial之后,點”Check”按鈕。
 
 11、這次中斷,位置上似乎沒有變化,但是,明白了消息處理機制,應該知道這次中斷的不同吧?(這次會流程會流到注冊算法那哦)
 00401029?>/.??>enter???0,?0?????????????????????????????;??解碼為?<WinProc>
 0040102D??|.??>push????ebx
 0040102E??|.??>push????edi
 0040102F??|.??>push????esi
 00401030??|.??>cmp?????[arg.2],?110
 00401037??|.??>je??????short?cycle.0040105E
 00401039??|.??>cmp?????[arg.2],?111??//111=WM_COMMAND
 00401040??|.??>je??????short?cycle.00401082?//肯定在這里跳(為什么?)
 00401042??|.??>cmp?????[arg.2],?10
 00401046??|.??>je??????short?cycle.00401057
 00401048??|.??>cmp?????[arg.2],?2
 0040104C??|.??>je??????short?cycle.00401057
 0040104E??|.??>xor?????eax,?eax
 
 12、來到?cycle.00401082,
 00401082??|>?\>cmp?????[arg.3],?67
 00401086??|.??>jnz?????short?cycle.0040108D??//這里肯定會跳
 00401088??|.??>call????cycle.00401151
 0040108D??|>??>cmp?????[arg.3],?66????????
 00401091??|.??>jnz?????short?cycle.00401098???//這里肯定不會跳(又是為什么呢?)
 00401093??|.??>call????cycle.0040109C??????????//關鍵,
 00401098??|>??>xor?????eax,?eax
 
 13、藍色部分,已經在CCDebuger那篇文章分析過了,這里就不分析了,我用紅色字體來標明重點。
 0040109C??/$??>mov?????dword?ptr?ds:[402182],?FEDCBA98
 004010A6??|.??>push????11???????????????????????????????;?/Count?=?11?(17.)
 004010A8??|.??>push????cycle.00402171???????????????????;?|Buffer?=?cycle.00402171
 004010AD??|.??>push????3E9??????????????????????????????;?|ControlID?=?3E9?(1001.)
 004010B2??|.??>push????[arg.1]??????????????????????????;?|hWnd
 004010B5??|.??>call????<jmp.&USER32.GetDlgItemTextA>????;?\GetDlgItemTextA(Serial)
 004010BA??|.??>or??????eax,?eax
 004010BC??|.??>je??????short?cycle.0040111F
 004010BE??|.??>push????11???????????????????????????????;?/Count?=?11?(17.)
 004010C0??|.??>push????cycle.00402160???????????????????;?|Buffer?=?cycle.00402160
 004010C5??|.??>push????3E8??????????????????????????????;?|ControlID?=?3E8?(1000.)
 004010CA??|.??>push????[arg.1]??????????????????????????;?|hWnd
 004010CD??|.??>call????<jmp.&USER32.GetDlgItemTextA>????;?\GetDlgItemTextA(name)
 004010D2??|.??>or??????eax,?eax
 004010D4??|.??>je??????short?cycle.0040111F
 004010D6??|.??>mov?????ecx,?10
 004010DB??|.??>sub?????ecx,?eax
 004010DD??|.??>mov?????esi,?cycle.00402160
 004010E2??|.??>mov?????edi,?esi
 004010E4??|.??>add?????edi,?eax
 004010E6??|.??>cld
 004010E7??|.??>rep?????movs?byte?ptr?es:[edi],?byte?ptr>
 004010E9??|.??>xor?????ecx,?ecx
 004010EB??|.??>mov?????esi,?cycle.00402171
 004010F0??|>??>/inc?????ecx
 004010F1??|.??>|lods????byte?ptr?ds:[esi]
 004010F2??|.??>|or??????al,?al
 004010F4??|.??>|je??????short?cycle.00401100
 004010F6??|.??>|cmp?????al,?7E
 004010F8??|.??>|jg??????short?cycle.00401100
 004010FA??|.??>|cmp?????al,?30
 004010FC??|.??>|jb??????short?cycle.00401100
 004010FE??|.^?>\jmp?????short?cycle.004010F0
 00401100??|>??>cmp?????ecx,?11??????
 00401103??|.??>jnz?????short?cycle.0040111F???//判斷長度是否為16個有效字符,即16個字節,不是則跳
 00401105??|.??>call????cycle.004011F1?????????//算法
 0040110A??|.??>mov?????ecx,?0FF01
 0040110F??|.??>push????ecx
 00401110??|.??>call????cycle.00401190???????//算法
 00401115??|.??>cmp?????ecx,?1??????
 00401118??|.??>je??????short?cycle.00401120?//需要跳
 0040111A??|>??>call????cycle.00401166
 0040111F??|>??>retn
 00401120??|>??>mov?????eax,?dword?ptr?ds:[402168]
 00401125??|.??>mov?????ebx,?dword?ptr?ds:[40216C]
 0040112B??|.??>xor?????eax,?ebx
 0040112D??|.??>xor?????eax,?dword?ptr?ds:[402182]
 00401133??|.??>or??????eax,?40404040
 00401138??|.??>and?????eax,?77777777
 0040113D??|.??>xor?????eax,?dword?ptr?ds:[402179]
 00401143??|.??>xor?????eax,?dword?ptr?ds:[40217D]
 00401149??|.^?>jnz?????short?cycle.0040111A??//不可以跳
 0040114B??|.??>call????cycle.0040117B??????//提示注冊成功!
 00401150??\.??>retn
 
 終于寫完了,現在來回顧下剛開始的問題:
 1、??是否覺得不知道在哪下斷?
 答:在Windows消息處理函數的入口處下消息斷點。
 2、??為什么要這樣子下斷?
 答:可能OllyDbg是根據棧的數據和函數原型來匹配,所以,一般來說,匹配條件都會是[Esp?+?XX]?==XXXXX
 3、??如何確定斷下來后的位置就是正確的?
 答:這里是根據編程的思路以及Windows的消息處理機制來定位的,理論與實戰相結合。
 
 最后,總結下,由于windows是消息驅動的,很大一部分都是通過消息來完成的,所以,有很大一部分可以通過對消息下斷來達到目的,但是,如何下消息斷點?從大體上講,是這樣子的:1、找出消息循環處理的函數?2、在消息循環處理函數的入口處設斷
 
 寫到這里,廢話一下。贊揚CCDebuger的太多了,但是,在贊揚的同時,不知道大家有沒仔細消化人家的成果?呵呵,其實,我也沒有,因為我看不太懂,所以,還是照著自己的思路走。寫這篇文章的目的是為了幫一位朋友,他想下消息斷點,但是,不知道如何下,我就把CCDebuger的這那篇消息斷點給他,可是,還是沒解決,后來,自己也動了一下手,確實,對于WM_COMMAND消息來說,OD肯定會不停的攔下來的,所以,單純的消息斷點就行不通了,所以,再結合Run跟蹤來記錄下,剛好能解決問題,也就產生了CCDebuger的那篇文章(猜的,呵呵)。
 最后,幫忙糾正下錯誤:
 引用:
 寫到這準備跟蹤算法時,才發現這個?crackme?還是挺復雜的,具體算法我就不寫了,實在沒那么多時間詳細跟蹤。有興趣的可以跟一下,注冊碼是17位,用戶名采用復制的方式擴展到?16?位,如我輸入“CCDebuger”,擴展后就是“CCDebugerCCDebug”。大致是先取擴展后用戶名的前?8?位和注冊碼的前?8?位,把用戶名的前四位和后四位分別與注冊碼的前四位和后四位進行運算,算完后再把擴展后用戶名的后?8?位和注冊碼的后?8?位分兩部分,再與前面用戶名和注冊碼的前?8?位計算后的值進行異或計算,最后結果等于?0?就成功。注冊碼的第?17?位我尚未發現有何用處。對于新手來說,可能這個?crackme?的難度大了一點。沒關系,我們主要是學習?OllyDBG?的使用,方法掌握就可以了。
 
 關于“位”的概念,“位”,是指二進制位,在這里,一個字節等于8位,一個字符等于一個字節。“注冊碼是17位”,應改成“注冊碼是17個字節”,如果你跟蹤分析過,你可以發現,這樣子還是不對的,最后應該是“注冊碼是16個字節”,
 cmp?????ecx,?11,這里的11是16進制,即十進制數:17。從代碼中可以看出這個十進制數17,還得減1才是字符串的真實長度,所以,應該改成“注冊碼是16個字節”,后面的“位”,需要改成“字節”。第一次看的時候,沒注意看,都給蒙了。
================================================================================================================
OllyDBG消息斷點及RUN 跟蹤講解
 
找了幾十個不同語言編寫的?crackme,發現只用消息斷點的話有很多并不能真正到達我們要找的關鍵位置,想想還是把消息斷點和?RUN?跟蹤結合在一起講,更有效一點。關于消息斷點的更多內容大家可以參考?jingulong?兄的那篇《幾種典型程序Button處理代碼的定位》的文章,堪稱經典之作。今天仍然選擇?crackmes.cjb.net?鏡像打包中的一個名稱為?cycle?的?crackme。按照慣例,我們先運行一下這個程序看看:
我們輸入用戶名?CCDebuger,序列號?78787878,點上面那個“Check”按鈕,呵,?沒反應!看來是要注冊碼正確才有動靜。現在關掉這個?crackme,用?PEiD?查一下殼,原來是?MASM32?/?TASM32?[Overlay]。啟動?OllyDBG?載入這個程序,F9讓它運行。這個程序按我們前面講的采用字串參考或函數參考的方法都很容易斷下來。但我們今天主要學習的是消息斷點及?RUN?跟蹤,就先用消息斷點來斷這個程序吧。在設消息斷點前,有兩個內容我們要簡單了解一下:首先我們要了解的是消息。
Windows?的中文翻譯就是“窗口”,而?Windows?上面的應用程序也都是通過窗口來與用戶交互的。現在就有一個問題,應用程序是如何知道用戶作了什么樣的操作的?這里就要用到消息了。
Windows?是個基于消息的系統,它在應用程序開始執行后,為該程序創建一個“消息隊列”,用來存放該程序可能創建的各種不同窗口的信息。比如你創建窗口、點擊按鈕、移動鼠標等等,都是通過消息來完成的。通俗的說,Windows?就像一個中間人,你要干什么事是先通知它,然后它才通過傳遞消息的方式通知應用程序作出相應的操作。
說到這,又有個問題了,在?Windows?下有多個程序都在運行,那我點了某個按鈕,或把某個窗口最大化,Windows?知道我是點的哪個嗎?這里就要說到另一個內容:句柄(handle)了。句柄一般是個?32?位的數,表示一個對象。Windows?通過使用句柄來標識它代表的對象。
比如你點擊某個按鈕,Windows?就是通過句柄來判斷你是點擊了那一個按鈕,然后發送相應的消息通知程序。說完這些我們再回到我們調試的程序上來,你應該已經用?OllyDBG?把這個?crackme?載入并按?F9?鍵運行了吧?現在我們輸入用戶名“CCDebuger”,序列號“78787878”,先不要點那個“Check”按鈕,我們來到?OllyDBG?中,點擊菜單?查看->窗口(或者點擊 工具 欄上那個“W”的圖標),我們會看到以下內容: ? 我們在選中的條目上點右鍵,再選擇上圖所示的菜單項,會來到下面這個窗口: ? 現在我們點擊圖上的那個下拉菜單,呵,原來里面的消息真不少。這么多消息我們選哪個呢?注冊是個按鈕,我們就在按下按鈕再松開時讓程序中斷。查一下?MSDN,我們知道這個消息應該是?WM_LBUTTON_UP,看字面意思也可以知道是左鍵松開時的消息: ? 從下拉菜單中選中那個?202?WM_LBUTTON_UP,再按確定按鈕,我們的消息斷點就設好了。現在我們還要做一件事,就是把?RUN?跟蹤打開。有人可能要問,這個?RUN?跟蹤是干什么的?簡單的說,RUN?跟蹤就是把被調試程序執行過的指令保存下來,讓你可以查看被調試程序運行期間干了哪些事。
RUN?跟蹤會把地址、寄存器的內容、消息以及已知的操作數記錄到?RUN?跟蹤緩沖區中,你可以通過查看?RUN?跟蹤的記錄來了解程序執行了那些指令。在這還要注意一個緩沖區大小的問題,如果執行的指令太多,緩沖區滿了的話,就會自動丟棄前面老的記錄。我們可以在調試選項->跟蹤中設置: ? 現在我們回到?OllyDBG?中,點擊菜單調試->打開或清除?RUN?跟蹤(第一次點這個菜單是打開?RUN?跟蹤,在打開的情況下點擊就是清除?RUN?跟蹤的記錄,對?RUN?跟蹤熟悉時還可以設置條件),保證當前在我們調試的程序領空,在反匯編窗口中點擊右鍵,在彈出菜單中選擇?RUN?跟蹤->添加所有函數過程的入口: ? 我們可以看到?OllyDBG?把識別出的函數過程都在前面加了灰色條: ? 現在我們回到那個?crackme?中按那個“Check”按鈕,被?OllyDBG?斷下了: ? 這時我們點擊菜單查看->內存,或者點擊工具欄上那個“M”按鈕(也可以按組合鍵?ALT+M),來到內存映射窗口: ? 為什么在這里設訪問斷點,我也說一下。我們可以看一下常見的?PE?文件,沒加過殼的用?PEiD?檢測是這樣: ? 點一下?EP?段后面那個“>”符號,我們可以看到以下內容: ? 看完上面的圖我們應該了解為什么在?401000?處的代碼段下訪問斷點了,我們這里的意思就是在消息斷點斷下后,只要按?F9?鍵運行時執行到程序代碼段的指令我們就中斷,這樣就可以回到程序領空了(當然在?401000?處所在的段不是絕對的,我們主要是要看程序的代碼段在什么位置,其實在上面圖中?OllyDBG?內存窗口的“包含”欄中我們就可以看得很清楚了)。設好訪問斷點后我們按?F9?鍵,被?OllyDBG?斷下: 現在我們先不管,按?F9?鍵(或者按?CTR+F12?組合鍵跟蹤步過)讓程序運行,再點擊菜單查看->RUN?跟蹤,或者點擊工具欄上的那個“…”符號,打開?RUN?跟蹤的記錄窗口看看: ? 我們現在再來看看統計的情況: ? 在地址?401082?處的那條指令上雙擊一下,來到以下位置: ? 現在我們在地址?4010A6?處的那條指令上按?F2,刪除所有其它的斷點,點菜單調試->關閉?RUN?跟蹤,現在我們就可以開始分析了:
004010E2?|.?8BFE?????????????MOV?EDI,ESI?????????????????????????????????????????;?用戶名送?EDI
004010E4?|.?03F8?????????????ADD?EDI,EAX
004010E6?|.?FC???????????????CLD
004010E7?|.?F3:A4????????????REP?MOVS?BYTE?PTR?ES:[EDI],BYTE?PTR?DS:[ESI]
004010E9?|.?33C9?????????????XOR?ECX,ECX?????????????????????????????????????????;?清零,設循環計數器
004010EB?|.?BE?71214000??????MOV?ESI,cycle.00402171??????????????????????????????;?注冊碼送ESI
004010F0?|>?41???????????????INC?ECX
004010F1?|.?AC???????????????LODS?BYTE?PTR?DS:[ESI]??????????????????????????????;?取注冊碼的每個字符
004010F2?|.?0AC0?????????????OR?AL,AL????????????????????????????????????????????;?判斷是否為空
004010F4?|.?74?0A????????????JE?SHORT?cycle.00401100?????????????????????????????;?沒有則跳走
004010F6?|.?3C?7E????????????CMP?AL,7E???????????????????????????????????????????;?判斷字符是否為非ASCII字符
004010F8?|.?7F?06????????????JG?SHORT?cycle.00401100?????????????????????????????;?非ASCII字符跳走
004010FA?|.?3C?30????????????CMP?AL,30???????????????????????????????????????????;?看是否小于30H,主要是判斷是不是數字或字母等
004010FC?|.?72?02????????????JB?SHORT?cycle.00401100?????????????????????????????;?小于跳走
004010FE?|.^?EB?F0???????????JMP?SHORT?cycle.004010F0
00401100?|>?83F9?11??????????CMP?ECX,11??????????????????????????????????????????;?比較注冊碼位數,必須為十進制17位
00401103?|.?75?1A????????????JNZ?SHORT?cycle.0040111F
00401105?|.?E8?E7000000??????CALL?cycle.004011F1?????????????????????????????????;?關鍵,F7跟進去
0040110A?|.?B9?01FF0000??????MOV?ECX,0FF01
0040110F?|.?51???????????????PUSH?ECX
00401110?|.?E8?7B000000??????CALL?cycle.00401190?????????????????????????????????;?關鍵,跟進去
00401115?|.?83F9?01??????????CMP?ECX,1
00401118?|.?74?06????????????JE?SHORT?cycle.00401120
0040111A?|>?E8?47000000??????CALL?cycle.00401166?????????????????????????????????;?注冊失敗對話框
0040111F?|>?C3???????????????RETN
00401120?|>?A1?68214000??????MOV?EAX,DWORD?PTR?DS:[402168]
00401125?|.?8B1D?6C214000????MOV?EBX,DWORD?PTR?DS:[40216C]
0040112B?|.?33C3?????????????XOR?EAX,EBX
0040112D?|.?3305?82214000????XOR?EAX,DWORD?PTR?DS:[402182]
00401133?|.?0D?40404040??????OR?EAX,40404040
00401138?|.?25?77777777??????AND?EAX,77777777
0040113D?|.?3305?79214000????XOR?EAX,DWORD?PTR?DS:[402179]
00401143?|.?3305?7D214000????XOR?EAX,DWORD?PTR?DS:[40217D]
00401149?|.^?75?CF???????????JNZ?SHORT?cycle.0040111A?????????????????????????????;?這里跳走就完蛋
0040114B?|.?E8?2B000000??????CALL?cycle.0040117B??????????????????????????????????;?注冊成功對話框
寫到這準備跟蹤算法時,才發現這個?crackme?還是挺復雜的,具體算法我就不寫了,實在沒那么多時間詳細跟蹤。有興趣的可以跟一下,注冊碼是17位,用戶名采用復制的方式擴展到?16?位,如我輸入“CCDebuger”,擴展后就是“CCDebugerCCDebug”。
大致是先取擴展后用戶名的前?8?位和注冊碼的前?8?位,把用戶名的前四位和后四位分別與注冊碼的前四位和后四位進行運算,算完后再把擴展后用戶名的后?8?位和注冊碼的后?8?位分兩部分,再與前面用戶名和注冊碼的前?8?位計算后的值進行異或計算,最后結果等于?0?就成功。
注冊碼的第?17?位我尚未發現有何用處。對于新手來說,可能這個?crackme?的難度大了一點。沒關系,我們主要是學習?OllyDBG?的使用,方法掌握就可以了。
最后說明一下:
1、這個程序在設置了消息斷點后可以省略在代碼段上設訪問斷點那一步,直接打開?RUN?跟蹤,消息斷點斷下后按?CTR+F12?組合鍵讓程序執行,RUN?跟蹤記錄中就可以找到關鍵地方。
2、對于這個程序,你可以不設消息斷點,在輸入用戶名和注冊碼后先不按那個“Check”按鈕,直接打開?RUN?跟蹤,添加“所有函數過程的入口”后再回到程序中點“Check”按鈕,這時在?OllyDBG?中打開?RUN?跟蹤記錄同樣可以找到關鍵位置。
總結
以上是生活随笔為你收集整理的OD消息断点的设置方法的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Win7 od下send断点
- 下一篇: 使用IDA 进行远程调试
