查看單個文章
舊 2006-05-25, 03:48 PM   #4 (permalink)
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設

函數 MessageBoxW 不會修改參數。如果您使用的函數更新了記憶體,比如函數 GetWindowName,修改的字元將會在資料區裡高亮。注意:EAX 返回值為1,表示成功。

其他的例子請訪問我的網站:
http://home.t-online.de/home/Ollydbg/Loaddll.htm.

不幸的是,您不能通過這種方式偵錯OllyDbg的插件,插件關聯到ollydbg.exe文件,Windows系統不能在同一個應用程式裡載入並執行兩個可執行文件。

解碼提示〔Decoding hints〕
在某些情況下,分析器不能區分程式碼和資料。讓我們看看下面的例子:


const char s[11] = "0123456789";
...
for (i=0x30; i<0x3a; i++) t[i-0x30]=s[i-0x30];

好的編譯器將會將上面的程式碼最佳化成如下樣子: e


for (i=0x30; i<0x3a; i++) (t-0x30)=(s-0x30);

這裡t-0x30 和 s-0x30 都是常量,並編譯成如下形式:


MOV AL,[BYTE s_minus_30+EBX]
MOV [BYTE t_minus_30+EBX],AL

編譯器也可能將常量字串串"0123456789"插入到執行程式碼中。在1.10版本中,我打算用暫存器的值來決定是否的資料或程式碼。當遇到上面的指令,分析器將假定位址
s_minus_30處包含字串資料。但事實上,可能那裡是程式碼。

萬一出現上述問題,我們應該怎麼辦呢?有兩種辦法:最快最笨的辦法是:將分析錯誤的部分移除(快捷鍵:退格鍵),這樣OllyDbg將使用預設值的反彙編器進行解碼。

更好的辦法是使用解碼提示〔decoding hints〕。您可以告訴OllyDbg如何解釋選的記憶體內容。這種方法在重新分析(Ctrl+A)時,解釋依然有效。

設定提示的方法:在反彙編視窗中,選需要修正提示的程式碼或資料,然後在快捷表單中選項 分析〔Analysis〕|在下次分析時,將選項部分視為〔During next analysis, treat selection as〕。選項以下選項之一:


指令〔Command〕 - 第一個被選的字元開始的有效指令。這條指令,還有所有後面的部分,直到有Jump或Return指令出現,以及含有Jump或Call指令所到達位置的部分,都會被視為指令;

字元〔Byte〕,
字〔Word〕,
雙字〔Doubleword〕 - 選的前1、2、4字元視為對應大小的資料;

所有選指令〔Commands〕 - 全部選部分(直到第一個無效指令)和可以到達由有效指令集組成的目的位址;

字元〔Bytes〕,
字〔Words〕,
雙字〔Doublewords〕, - 全部選部分以1、2、或 4字元分組;

ASCII字串串〔ASCII text〕,
UNICODE字串串〔UNICODE text〕 - 全部選部分為ASCII 或 UNICODE 字串串;

預設值(移除提示)〔Default (remove hints)〕 - 從選部分中移除全面提示;

移除全部提示〔Remove all hints〕 - 從全部模組中移除解碼提示。

OllyDbg 儲存提示到.udd文件中。

陳述式賦值〔Evaluation of expressions〕

[code]
OllyDbg能夠支持非常複雜的陳述式。陳述式的語法格式將在這個主題的後面進行介紹,但我想您對此不一定真的感興趣。那麼我先舉幾個實例來說明:


10 - 常量 0x10 (無符號)。所有整數常量都認為是十六進制的,除非後面跟了點;

10. - 十進制常量10(帶符號);

'A' - 字串常量 0x41;

EAX - 暫存器EAX的內容,解釋為無符號數;

EAX. -暫存器EAX的內容,解釋為帶符號數;

[123456] - 在位址123456處的無符號雙字內容。預設值情況,OllyDbg假定是雙字長操作數;

DWORD PTR [123456] - 同上。關鍵字 PTR 可選;

[SIGNED BYTE 123456] - 在位址123456處帶符號單字元。OllyDbg支持類MASM和類IDEAL兩種記憶體陳述式;

STRING [123456] - 以位址123456作為開始,以零作為結尾的ASCII字串串。中括號是必須的,因為您要顯示記憶體的內容;

[[123456]] - 在位址123456處儲存於的雙字所指向的位址內的雙字內容;

2+3*4 - 值為14。OllyDbg 按標準C語言的優先等級進行算術執行;

(2+3)*4 - 值為20。使用括號改變運算順序。

EAX.<0. - 如果EAX在0到0x7FFFFFFF之間,則值為0,否則值為1。注意0也是有符號的。當帶符號數與無符號數比較時,OllyDbg會將帶符號數轉成無符號數。

EAX<0 - 總為0(假),因為無符號數永遠是正的。

MSG==111 - 如果消息為WM_COMMAND,則為真。0x0111是指令 WM_COMMAND 的數值。MSG只能用於設定在工作消息函數的條件斷點內。

[STRING 123456]=="Brown fox" - 如果從位址0x00123456開始的記憶體為ASCII字串串"Brown fox"、"BROWN FOX JUMPS"、 "brown fox???",或類似的串,那麼其值為1。比較不區分大小寫和文本長度。

EAX=="Brown fox" - 同上,EAX按游標對待。

UNICODE [EAX]=="Brown fox" - OllyDbg認為EAX是一個指向UNICODE串的游標,並將其轉換為ASCII,然後與文本常量進行比較。

[ESP+8]==WM_PAINT - i在陳述式中您可以使用上百種Windows API符號常量。

([BYTE ESI+DWORD DS:[450000+15*(EAX-1)]] & 0F0)!=0 - 這絕對是個有效的陳述式。

現在我們介紹語法格式。在大括號({})內的每個元素都只能出現一次,括號內的元素順序可以交換:


陳述式 = 記憶體中間碼|記憶體中間碼<二元操作符>記憶體中間碼

記憶體中間碼 = 中間碼| { 符號標誌 大小標誌 前綴} [陳述式 ]

中間碼 = (陳述式)| 一元操作符 記憶體中間碼 | 帶符號暫存器 | 暫存器 | FPU暫存器 | 段暫存器 | 整型常量 | 浮點常量 | 串常量 | 參數 | 偽變數

一元操作符 = ! | ~ | + |

帶符號暫存器 = 暫存器.

暫存器 = AL | BL | CL ... | AX | BX | CX ... | EAX | EBX | ECX ...

FPU暫存器 = ST | ST0 | ST1 ...

段暫存器 = CS | DS | ES | SS | FS | GS

整型常量 = <十進制常量>. | <十六進制常量> | <字串常量> | <API符號常量>

浮點常量 = <符點常量>

串常量 = "<串常量>"

符號標誌 = SIGNED | UNSIGNED

大小標誌 = BYTE | CHAR | WORD | SHORT | DWORD | LONG | QWORD | FLOAT | DOUBLE | FLOAT10 | STRING | UNICODE

前綴 = 中間碼:

參數 = %A | %B // 僅允許在監察器〔inspector〕 中使用

偽變數 = MSG // 視窗消息中的程式碼

這個語法並不嚴格。在解釋[WORD [EAX]]或類似的陳述式時會產生歧義。可以理解為以暫存器EAX所指向位址的兩字元內容為位址,所指向的雙字內容;也可以理解為以暫存器EAX所指向位址的四字元內容為位址,所指向的兩字元內容。而OllyDbg會將修飾符盡可能的放在位址最外面,所以在這種情況下,[WORD [EAX]] 等價於 WORD [[EAX]]。

預設值情況下,BYTE、WORD 和 DWORD 都是無符號的,而CHAR、SHORT 和 LONG都是帶符號的。也可以使用明確的修飾符SIGNED 或 UNSIGNED。例如在二元操作時,如果一個操作數是浮點的,那麼另外一個就要轉成浮點數;或者如果一個是無符號膽,那麼另外一個要轉成無符號的。浮點檔案類型不支持UNSIGNED。大小修飾符後面跟 MASM相容關鍵字PTR(如:BYTE PTR)也允許的,也可以不要PTR。暫存器名和大小修飾符不區分大小寫。

您可以使用下面類C的運算符(0級最高):


優先等級 檔案類型 運算符
0 一元運算符 ! ~ + -
1 乘除運算 * / %
2 加減運算 + -
3 位移動 << >>
4 比較 < <= > >=
5 比較 == !=
6 按位與 &
7 按位異或 ^
8 按位或 |
9 邏輯與 &&
10 邏輯或 ||
在計算時,中間結果以 DWORD 或 FLOAT10 形式儲存。某些檔案類型組合和操作是不允許的。例如:QWODRD 檔案類型只能顯示;STRING 和 UNICODE 只能進行加減操作(像C語言裡的游標)以及與 STRING、UNICODE 檔案類型或串常量進行比較操作;您不能按位移動 浮點〔FLOAT〕 檔案類型,等等。

自訂函數描述〔Custom function descriptions〕

概論〔Introduction〕

OllyDbg包含(做為內部資源)1900多種標準函數以及400多種標準C函數的名稱和參數。分析器〔Analyzer〕 用這些描述使被偵錯程序更加易懂。比較下面一個例子,分析器的函數CreateFont:


PUSH OT.00469F2A ; ASCII "Times New Roman"
PUSH 12
PUSH 2
PUSH 0
PUSH 0
PUSH 0
PUSH 0
PUSH 0
MOV EAX,DWORD PTR [49FA70]
PUSH EAX
PUSH 190
PUSH 0

PUSH 0
PUSH 0
PUSH 10
CALL <JMP.&GDI32.CreateFontA>

這是分析後的:


MOV EAX,DWORD PTR [49FA70]
PUSH OT.00469F2A ; ?FaceName = "Times New Roman"
PUSH 12 ; ?PitchAndFamily = VARIABLE_PITCH|FF_ROMAN
PUSH 2 ; ?Quality = PROOF_QUALITY
PUSH 0 ; ?ClipPrecision = CLIP_DEFAULT_PRECIS
PUSH 0 ; ?OutputPrecision = OUT_DEFAULT_PRECIS
PUSH 0 ; ?CharSet = ANSI_CHARSET

PUSH 0 ; ?StrikeOut = FALSE
PUSH 0 ; ?Underline = FALSE
PUSH EAX ; ?Italic => TRUE
PUSH 190 ; ?Weight = FW_NORMAL
PUSH 0 ; ?Orientation = 0
PUSH 0 ; ?Escapement = 0
PUSH 0 ; ?Width = 0
PUSH 10 ; ?Height = 10 (16.)

CALL <JMP.&GDI32.CreateFontA> ; ?CreateFontA

顯然,後面的程式碼更容易理解。API函數CreateFont 有14個參數。分析器標記所有這些參數的名稱並解碼他們的值。如果暫存器跟蹤開啟,那麼分析器同時會解碼參數Italic
的值為位址49FA70處雙字長的內容。解碼使用參數的真實值,所以如果[49FA70]裡的內容改變了,那麼參數Italic的值也會隨之改變。當EIP指向跳轉或使用該函數的指令,或指向入口時,OllyDbg也會在棧中對已知函數的參數進行解碼。

OllyDbg可以對象printf()這樣參數個數可變的函數進行參數解碼:

PUSH EAX ; ?<%.*s>
PUSH E8 ; ?<*> = E8 (232.)
PUSH EBX ; ?<%08X>
PUSH Mymodule.004801D2 ; ?format = "Size %08X (%.*s) bytes"
PUSH ESI ; ?s
CALL Mymodule.sprintf ; ?sprintf

您可以定義自己的函數。每次您開啟某個應用程式時,OllyDbg都會重新設定函數參數表並用內嵌描述添充這個表。然後嘗試開啟文件「<OllyDbg目錄>\common.arg」和「<OllyDbg目錄>\<應用程式名>.arg」,這裡<應用程式名>使用8.3格式(DOS)被偵錯程式文件名(不帶路徑和副檔名)。

下面看一個簡單的.arg文件實例:


INFO Simple .ARG file that decodes CreateHatchBrush
TYPE HS_X
IF 0 "HS_HORIZONTAL"
IF 1 "HS_VERTICAL"
IF 2 "HS_FDIAGONAL"
IF 3 "HS_BDIAGONAL"
IF 4 "HS_CROSS"
IF 5 "HS_DIAGCROSS"
ELSEINT
END
TYPE COLORREF
IF 0 "<BLACK>"
IF 00FFFFFF "<WHITE>"
OTHERWISE
TEXT "RGB("
FIELD 000000FF
UINT
TEXT ","

FIELD 0000FF00
UINT
TEXT ","
FIELD 00FF0000
UINT
TEXT ")"
END
STDFUNC CreateHatchBrush
"style" HS_X
"colorref" COLORREF
END

標準Windos API函數CreateHatchBrush(int style,int colorref) 有兩個參數。第一個必須是陰影風格〔hatch style〕,第二個是常量由紅色、綠色、藍色組成,並用一個32
位整數的低三字元表示。為瞭解碼這些參數,文件定義了兩個新的參數檔案類型:HS_X 和 COLORREF。

陰影風格是一個簡單的枚舉檔案類型,如0表示HS_HORIZONTAL(水準風格)、1表示HS_VERTICAL(垂直風格)。IF關鍵字比較參數與第一個操作數(注意:其總是十六進制的),如果相同則顯示第二個操作數里的文本。但萬一匹配失敗會如何?關鍵字ELSEINT 會然OllyDbg會將參數解釋為一個整數。

COLORREF 更複雜一些。首先嘗試解碼兩個廣泛使用的顏色值:黑(全0組成)與白(全0xFF組成)。如果匹配失敗,COLORREF嘗試解碼顏色為一個結構包含紅、綠、藍的亮度。FIELD會用第一個操作數與參數進行邏輯與操作。然後轉換結果為整數,並同時按位右移第一個操作及該整數,直到第一個操作數的二進制個位數位為1,這時整數按位右移的結果以無符號10進制顯示出來。這個例子做了三次這樣的操作,以分離出每個顏色成份。TEXT關鍵字用於無條件顯示文本。如果參數為00030201,那麼
COLORREF將其解碼為RGB(1.,2.,3.)。

大多斷API函數都會從棧中移除參數並保護暫存器EBX, EBP, ESI 和 EDI。宣告這樣的函數為STDFUNC,以告訴分析器該函數做了這樣的事情。否則請其描述為FUNCTION


萬一某個參數由多個域及位元 值組成,比如上面提到的fdwPitchAndFamily ,我們該怎麼辦?請看下面這個例子:


TYPE FF_PITCH
MASK 03
IF 00 "DEFAULT_PITCH"
IF 01 "FIXED_PITCH"
IF 02 "VARIABLE_PITCH"
ELSEHEX
TEXT "|"
MASK 0C
BIT 04 "4|"
BIT 08 "8|"
MASK FFFFFFF0
IF 00 "FF_DONTCARE"
IF 10 "FF_ROMAN"
IF 20 "FF_SWISS"
IF 30 "FF_MODERN"
IF 40 "FF_SCRIPT"
IF 50 "FF_DECORATIVE"
ELSEHEX
END

前兩個位元 位(第0和等1位)表示傾斜度,必須一起解碼。我們使用 MASK 03 來抽取這兩個位元 並通過IF序列來解碼。增加了連接符「|」,分別抽取第2和第3個位元 位,並分別單獨解碼。最後抽取剩餘部分並進行解碼。

OllyDbg 會移除產生串尾部的連接符「|」、空格、冒號、逗號、分號和等號。

目前版本的分析僅能夠解碼32位參數。如您不能解碼雙精度浮點或長雙精度浮點的函數參數。


格式描述

自訂解碼訊息由函數描述和檔案類型描述兩部分組成。函數描述部分非常的簡單:


FUNCTION|STDFUNC [模組名]函數名
<第一個參數的名稱> <第一個參數的檔案類型>
……
<最後一個參數的名稱> <最後一個參數的檔案類型>
END

如果函數從棧中移除參數並保護暫存器EBX, EBP, ESI 和 EDI,請使用關鍵字STDFUNC。大多少函數都遵循這樣的規則。其他情況則宣告為FUNCTION。模組(EXE 或 DLL)名是可選的。如果模組名被忽略,OllyDbg會對嘗試匹配任何模組。模組名不區分大小寫。

函數名稱總是區分大小寫的。有針對UNICODE的函數必須使用後面 A 或 W 加以區分,比如SetWindowTextA.。

參數的順序又C風格的參數使用慣例一致。而16位Windows和32位API函數也是按慣例使用。如果參數名由多個字組成,或者包含特殊字串,那麼請將其用兩個單引號引起來。與在C語言中一樣,省略號(參┤且桓鎏厥獾募鍬加糜詒硎靜問靠殺洹K匭朐諍枋齙淖詈蟆llyDbg不會嘗試解碼這樣的參數。如果函數的參數為空,則按functionname(void)對待

OllyDbg 僅支持32位的參數。某些參數已經預定義好了:


INT 以十六進制和帶符號整數兩種格式顯示值
UINT 以十六進制和無符號整數兩種格式顯示值
HEX 以十六進制格式顯示值
BOOL TRUE 或 FALSE
CHAR ASCII 字串
WCHAR UNICODE 字串
FLOAT 32位浮點數
ERRCODE 系統錯誤程式碼(像由函數GetLastError()報告的)
ADDR, PTR 位址(特殊情況:NULL)
ASCII ASCII 串游標
UNICODE UNICODE 串游標
FORMAT 在類似函數printf()(不包括wscanfW()!)使用的 ASCII 格式串
WFORMAT 類似函數wsprintfW()(不包括scanf()!)使用的 UNICODE 格式串
RECT RECT(矩形)結構游標
MESSAGE MSG(ASCII 視窗消息)結構游標
WMESSAGE MSG(UNICODE 視窗消息)結構游標
HANDLE 關鍵句(特殊情況:NULL, ERROR_INVALID_HANDLE)
HWND 視窗關鍵句
HMODULE 模組關鍵句
RSRC_STRING 帶索引的資源串
NULL, DUMMY 有參數,但解碼時跳過了
您不能重定義預定義檔案類型。自訂檔案類型允許您將參數分離成幾個域並分別解碼。檔案類型描述有以下幾種格式:


TYPE 檔案類型名
[TEXT "任何文本"]
[<域選項器>]
<域解碼>
<域解碼>
[TEXT "任何文本"]
[PURGE]
...
<域選項器>
<域解碼>
<域解碼>
[TEXT "任何文本"]
END

檔案類型名的程度限制在16個字串以內。 OllyDbg會無條件將"任何文本"作為產生的解碼。域選項器抽取一部分參數用於解碼。以下域選項器,可以用於抽取域:


MASK 十六進制掩碼 - 域等於參數同十六進制掩碼按位與(AND)的結果。

FIELD 十六進制掩碼 - 參數同十六進制掩碼按位與(AND)的數值,然後OllyDbg同時按位右移掩碼和計算的數值直到掩碼的二進制個位為1,這時數值按位右移的結果就是域的值。例如參數0xC250, FIELD F0,得到的結果是5。

SIGFIELD十六進制掩碼 -參數同十六進制掩碼按位與(AND)的數值,然後OllyDbg同時按位右移掩碼和計算的數值直到掩碼的二進制個位為1,這時數值按位右移的結果轉成帶符號32位數就是域的值。例如參數0xC250 ,SIGFIELD FF00,得到的結果是0xFFFFFFC2。

簡單域的解碼會一次顯示整個域的內容:


HEX - 以十六進制形式顯示域內容;

INT - 以帶符號十進制形式顯示域內容(帶小數點);

UINT -以無符號十進制形式顯示域內容(帶小數點);

CHAR - 以 ASCII 字串形式顯示域內容。

域若是一個枚舉檔案類型,則可以使用IF序列,如果必要的話還可以在IF序列後跟關鍵字 TRYxxx 與 ELSExxx:


IF 十六進制值 "文本" - 如果域等於十六進制值,則將文本作為輸出字串串;

TRYASCII - 如果域是一個指向ASCII串的游標,則顯示這個串;

TRYUNICODE - 如果域是一個指向UNICODE串的游標,則顯示這個串;

TRYORDINAL - 如果域是一序號(有16位均為0),則會顯示為序號(「#」後跟整數);

OTHERWISE - 如果前面IF語句為真,則停止解碼,否則繼續解碼;


ELSEINT - 如果前面所有的 IF 和 TRYxxx 語句均失敗,則以帶符號十進制數形式(帶小數點)顯示這個域;

ELSEHEX -如果前面所有的 IF 和 TRYxxx 語句均為失敗,則以十六進制形式顯示這個域;

ELSECHAR -如果前面所有的 IF 和 TRYxxx 語句均為失敗,則以 ASCII 字串形式顯示這個域;

ELSEWCHAR -如果前面所有的 IF 和 TRYxxx 語句均為失敗,則以 UNICODE 字串形式顯示這個域。

如果域是一個二進制位集,則可以使用BIT序列,如果必要的話可以後面跟關鍵字 BITZ 與 BITHEX :

BIT 十六進制掩碼 "文本" - 如果值與十六進制掩碼按位與(AND)的結果不是0,則將文本做為輸出串;

BITZ十六進制掩碼 "文本" - 如果值與十六進制掩碼按位與(AND)的結果是0,則將文本做為輸出串;

BITHEX十六進制掩碼 - 如果值與十六進制掩碼按位與(AND)的結果不是0,則將結果以十六進制形式顯示。

特殊關鍵字 PURGE 會從輸出串尾部移除以下幾種符號:


空格 ' '
逗號 ','
或 '|'
冒號 ':'
等於 '='
這會讓某些解碼情況變的簡單。關鍵字END是檔案類型定義結尾標記並會自動執行PURGE指令。


預編譯檔案類型

OllyDbg在預編譯資源時,已經包含150多種檔案類型描述。以下列出了一部分。您可以在自訂文件中直接使用這些檔案類型:


LANG_X - 作業系統語言ID(0 - 未知、 9 - 語言、 C - 法語,等等)

GENERIC_X - 訪問檔案類型(GENERIC_READ, GENERIC_WRITE...)

FILE_SHARE_X - 共享檔案類型(FILE_SHARE_READ, FILE_SHARE_WRITE)

CREATEFILE_X - 文件新增模式(CREATE_NEW, OPEN_EXISTING...)

FILE_ATTRIBUTE_X - 文件內容(READONLY, SYSTEM, DELETE_ON_CLOSE...)

RT_AXX - 資源檔案類型(RT_CURSOR, RT_GROUP_ICON, ASCII string...)

RT_WXX - 資源檔案類型(RT_CURSOR, RT_GROUP_ICON, UNICODE string...)

COORD - 坐標結構 "(X=xxx,Y=yyy)"

STD_IO_X - 標準關鍵句(STD_INPUT_HANDLE, STD_ERROR_HANDLE...)

GMEM_X - 全局記憶體檔案類型(GMEM_FIXED, GPTR...)

LMEM_X - 局部記憶體檔案類型(LMEM_FIXED, LPTR...)

FSEEK_X - 文件尋找檔案類型(FILE_BEGIN, FILE_CURRENT...)

OF_X - 文件模式(fOF_READ, OF_SHARE_COMPAT, OF_VERIFY...)

O_X - 文件新增模式(O_RDONLY, O_BINARY, SH_COMPAT...)

SEMAPHORE_X - 信號量檔案類型(SEMAPHORE_ALL_ACCESS, SYNCHRONIZE...)

SLEEP_TIMEOUT - 超時(INFINITE 或時間)

ROP - 一些標準柵格運算標誌程式碼(ROP)(SRCCOPY, MERGEPAINT...)

COLORREF - RGB 顏色值("<WHITE>", "RGB(rr.,gg.,bb.)"...)

WS_X - 視窗風格(WS_OVERLAPPED, WS_POPUP...)

WS_EX_X - 增強視窗風格(WS_EX_DLGMODALFRAME, WS_EX_TOPMOST...)

MF_X - 表單標誌(MF_BYPOSITION, MF_ENABLED...)

WM_X - ASCII視窗消息檔案類型(WM_CREATE, WM_KILLFOCUS, CB_SETCURSEL...)

WM_W - UNICODE視窗消息檔案類型(WM_CREATE, WM_KILLFOCUS, CB_SETCURSEL...)

VK_X - 虛擬鍵盤程式碼(VK_LBUTTON, VK_TAB, VK_F10...)

MB_X - message box style (MB_OK, MB_ICONHAND...)

HKEY_X - 預定義註冊表關鍵句(HKEY_CLASSES_ROOT, HKEY_LOCAL_MACHINE...)

還有更多的預編譯檔案類型。如果常量在它文件被定義為ABC_ xxxxxxxx,那麼一般就有ABC_X預編譯檔案類型。


注意:
1.如果OllyDbg是即時偵錯器,並且在Windows 95下掛接執行了DebugBreak() 的應用程式,則這個應用程式在掛接後,還會執行。在關於NT的系統下,應用程式應該會在
DebugBreak()暫停。
2. 指令 SMSW (儲存機器狀態字〔Store Machine Status Word〕)。 這個指令僅接受暫存器 AX 作為參數,而程序編譯成EAX接受參數。
__________________
http://bbsimg.qianlong.com/upload/01/08/29/68/1082968_1136014649812.gif
psac 目前離線  
送花文章: 3, 收花文章: 1630 篇, 收花: 3204 次
向 psac 送花的會員:
Jamaalacugs (2018-04-20)
感謝您發表一篇好文章