1. 程式人生 > >OllyDBG 入門系列(五)-訊息斷點及 RUN 跟蹤

OllyDBG 入門系列(五)-訊息斷點及 RUN 跟蹤

OllyDBG 入門系列(五)-訊息斷點及 RUN 跟蹤

作者:CCDebuger

找了幾十個不同語言編寫的 crackme,發現只用訊息斷點的話有很多並不能真正到達我們要找的關鍵位置,想想還是把訊息斷點和 RUN 跟蹤結合在一起講,更有效一點。關於訊息斷點的更多內容大家可以參考 jingulong 兄的那篇《幾種典型程式Button處理程式碼的定位》的文章,堪稱經典之作。今天仍然選擇 crackmes.cjb.net 映象打包中的一個名稱為 cycle 的 crackme。按照慣例,我們先執行一下這個程式看看:
http://bbs.pediy.com/upload/2006/4/image/5_1.gif
我們輸入使用者名稱 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”的圖示),我們會看到以下內容:

http://bbs.pediy.com/upload/2006/4/image/5_2.gif
我們在選中的條目上點右鍵,再選擇上圖所示的選單項,會來到下面這個視窗:
http://bbs.pediy.com/upload/2006/4/image/5_3.gif
現在我們點選圖上的那個下拉選單,呵,原來裡面的訊息真不少。這麼多訊息我們選哪個呢?註冊是個按鈕,我們就在按下按鈕再鬆開時讓程式中斷。查一下 MSDN,我們知道這個訊息應該是 WM_LBUTTON_UP,看字面意思也可以知道是左鍵鬆開時的訊息:
http://bbs.pediy.com/upload/2006/4/image/5_4.gif
從下拉選單中選中那個 202 WM_LBUTTON_UP,再按確定按鈕,我們的訊息斷點就設好了。現在我們還要做一件事,就是把 RUN 跟蹤開啟。有人可能要問,這個 RUN 跟蹤是幹什麼的?簡單的說,RUN 跟蹤就是把被除錯程式執行過的指令儲存下來,讓你可以檢視被除錯程式執行期間幹了哪些事。RUN 跟蹤會把地址、暫存器的內容、訊息以及已知的運算元記錄到 RUN 跟蹤緩衝區中,你可以通過檢視 RUN 跟蹤的記錄來了解程式執行了那些指令。在這還要注意一個緩衝區大小的問題,如果執行的指令太多,緩衝區滿了的話,就會自動丟棄前面老的記錄。我們可以在除錯選項->跟蹤中設定:

http://bbs.pediy.com/upload/2006/4/image/5_5.gif
現在我們回到 OllyDBG 中,點選選單除錯->開啟或清除 RUN 跟蹤(第一次點這個選單是開啟 RUN 跟蹤,在開啟的情況下點選就是清除 RUN 跟蹤的記錄,對 RUN 跟蹤熟悉時還可以設定條件),保證當前在我們除錯的程式領空,在反彙編視窗中點選右鍵,在彈出選單中選擇 RUN 跟蹤->新增所有函式過程的入口:
http://bbs.pediy.com/upload/2006/4/image/5_7.gif
我們可以看到 OllyDBG 把識別出的函式過程都在前面加了灰色條:
http://bbs.pediy.com/upload/2006/4/image/5_8.gif
現在我們回到那個 crackme 中按那個“Check”按鈕,被 OllyDBG 斷下了:
http://bbs.pediy.com/upload/2006/4/image/5_6.gif
這時我們點選選單檢視->記憶體,或者點選工具欄上那個“M”按鈕(也可以按組合鍵 ALT+M),來到記憶體對映視窗:

http://bbs.pediy.com/upload/2006/4/image/5_9.gif
為什麼在這裡設訪問斷點,我也說一下。我們可以看一下常見的 PE 檔案,沒加過殼的用 PEiD 檢測是這樣:
http://bbs.pediy.com/upload/2006/4/image/5_10.gif
點一下 EP 段後面那個“>”符號,我們可以看到以下內容:
http://bbs.pediy.com/upload/2006/4/image/5_11.gif
看完上面的圖我們應該瞭解為什麼在 401000 處的程式碼段下訪問斷點了,我們這裡的意思就是在訊息斷點斷下後,只要按 F9 鍵執行時執行到程式程式碼段的指令我們就中斷,這樣就可以回到程式領空了(當然在 401000 處所在的段不是絕對的,我們主要是要看程式的程式碼段在什麼位置,其實在上面圖中 OllyDBG 記憶體視窗的“包含”欄中我們就可以看得很清楚了)。設好訪問斷點後我們按 F9 鍵,被 OllyDBG 斷下:
http://bbs.pediy.com/upload/2006/4/image/5_12.gif
現在我們先不管,按 F9 鍵(或者按 CTR+F12 組合鍵跟蹤步過)讓程式執行,再點選選單檢視->RUN 跟蹤,或者點選工具欄上的那個“…”符號,開啟 RUN 跟蹤的記錄視窗看看:
http://bbs.pediy.com/upload/2006/4/image/5_13.gif
我們現在再來看看統計的情況:
http://bbs.pediy.com/upload/2006/4/image/5_14.gif
在地址 401082 處的那條指令上雙擊一下,來到以下位置:
http://bbs.pediy.com/upload/2006/4/image/5_15.gif
現在我們在地址 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 跟蹤記錄同樣可以找到關鍵位置。

相關推薦

OllyDBG 入門系列訊息斷點 RUN 跟蹤

OllyDBG 入門系列(五)-訊息斷點及 RUN 跟蹤作者:CCDebuger找了幾十個不同語言編寫的 crackme,發現只用訊息斷點的話有很多並不能真正到達我們要找的關鍵位置,想想還是把訊息斷點和 RUN 跟蹤結合在一起講,更有效一點。關於訊息斷點的更多內容大家可以參

【原創】OllyDBG 入門系列記憶體斷點

還是上次那個cm,不過這次的要求是寫出註冊機 那麼就要先研究註冊碼是怎麼來的,上次我們最開始找到的關鍵位置 00401306 |. /75 6B jnz short 00401373 00401308 |. |C1E8 1

sencha touch 入門系列 sencha touch執行程式碼解析

  由於最近專案比較忙,加之還要轉戰原生開發,所以很久沒更新了,今天我們接著上一次的內容往下講:   首先我們開啟index.html,這是我們整個程式的訪問入口,也是整個專案的引入地: <!DOCTYPE HTML> <html manifest="

Vue入門系列Vue實例詳解與生命周期

auto res context mode parent all from bool silent 【入門系列】 【本文轉自】   http://www.cnblogs.com/fly_dragon Vue的實例是Vue框架的入口,其實也就是前端的ViewM

Scala入門系列:面向對象之類

important ica back ember const 就會 out 不用 spa // 定義類,包含field以及method class HelloWorld { private var name = "Leo" def sayHello() { prin

Flutter入門系列---環境配置

1、安裝Flutter 國內安裝流程 export PUB_HOSTED_URL=https://pub.flutter-io.cn export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn git clone -b ma

爬蟲入門系列:正則表示式完全指南

爬蟲入門系列目錄: 正則表示式處理文字有如疾風掃秋葉,絕大部分程式語言都內建支援正則表示式,它應用在諸如表單驗證、文字提取、替換等場景。爬蟲系統更是離不開正則表示式,用好正則表示式往往能收到事半功倍的效果。 介紹正則表示式前,先來看一個問題,下面這段文字來自豆瓣的某個網頁連結,我對內容

微信開發系列_訊息,事件的處理

來自微信端的事件可以有多種 1:文字訊息 2:圖片訊息 3:語音訊息 4:點選按鈕事件 5:掃碼事件等等 使用者傳送的訊息或者事件  都是以xml的形式傳送給我們開發者的(也就是伺服器端) 我們也是以xml的格式返回去的 所有首先 我們得把使用者的訊息給獲取並解析了(我

springcloud入門系列2Feign、Ribbon實現Rest介面請求和負載均衡

前面我們介紹了通過springcloud的eureka服務註冊元件實現,並且實現了多機互備的HA,同時也將之前寫的springboot的服務註冊到了eureka上,今天我們主要來介紹下作為服務使用者如何去使用這些服務介面並且實現基於服務化的軟負載均衡。對於之前實現的springboot的rest介面服務,一般

看雪學院-OllyDBG入門系列記憶體寫入 筆記

看雪學院-OllyDBG入門系列(四)記憶體斷點 筆記 作者:CCDebuger 在 OllyDBG 中一般我們用到的記憶體斷點有記憶體訪問和記憶體寫入斷點。記憶體訪問斷點就是指程式訪問記憶體中我

EMQ X 規則引擎系列儲存訊息到 Cassandra 資料庫

Cassandra 介紹與安裝 Cassandra 是來自 Apache 的開源分散式資料庫系統,它能在支援線性擴充套件 、 高可

SpringBoot入門系列Thymeleaf的常用標籤和用法

前面介紹了Spring Boot 中的整合Thymeleaf 。不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/1657780.html。 今天我們主要來看看 Thymeleaf 的常用標籤和用法!其他詳細的內容,大家可以

Flutter入門系列---Flutter的原理美團的實踐

轉載自:美團技術團隊 導讀 Flutter是Google開發的一套全新的跨平臺、開源UI框架,支援iOS、Android系統開發,並且是未來新作業系統Fuchsia的預設開發套件。自從2017年5月釋出第一個版本以來,目前Flutter已經發布了近60個版本,並且在2018年5月釋出了第一個

webservices系列——javaweb整合Axis2多service配置

1.新建一個專案動態web專案webservice_test3。 2.開啟<Tomcat安裝目錄>webapps/axis2/WEB-INF,將lib、conf、modules三個資料夾複

AQS系列- CountDownLatch的使用原理

前言     前面四節學完了AQS最難的兩種重入鎖應用,下面兩節進入實戰學習,看看JUC包中其他的工具類是如何運用AQS實現特定功能的。今天一起看一下CountDownLatch。     CountDownLatch可以用來實現多個執行緒執行完一個功能後讓另一個執行緒

RocketMQ系列廣播與延遲訊息

今天要給大家介紹RocketMQ中的兩個功能,一個是“廣播”,這個功能是比較基礎的,幾乎所有的mq產品都是支援這個功能的;另外一個是“延遲消費”,這個應該算是RocketMQ的特色功能之一了吧。接下來,我們就分別看一下這兩個功能。 ## 廣播 廣播是把訊息傳送給訂閱了這個主題的所有消費者。這個定義很清楚,

python系列centos6.x中部署多個python版本

python pyenv centos6.x virtualenv 博主QQ:819594300博客地址:http://zpf666.blog.51cto.com/有什麽疑問的朋友可以聯系博主,博主會幫你們解答,謝謝支持!使用pyenv+virtualenv方式部署python多版本pyenv

backbone入門系列1基本組成部分

tle doctype syn 方法 1.3 服務器 行為 java code 一,首先backbone有以下組成部分:Events:事件驅動模塊 Model:數據模型 Collection:模型集合器 Router:路由器(對應hash值) History:開啟歷史管理

backbone入門系列4集合

src 單獨 -1 lec 指定 one js代碼 bsp 技術 collection就是一堆model的集合,這個集合就是個舞臺,可以放一個人說單口相聲,也可以對口,也可以群口,,, 在前文,也就是入門系列3的基礎上,添加js代碼 var noteCollection=B

源碼分析系列x264_ratecontrol_dataflow

技術 stc 碼率控制 碼率 targe article nbsp target 緩沖區 http://www.cnblogs.com/xkfz007/articles/2616159.html 碼率控制部分關鍵函數 5.1 x264_ratecontrol_star