freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

ollydbg圖文入門教程資料(已改無錯字)

2022-12-16 05:21:35 本頁面
  

【正文】 數(shù)參考》中的內(nèi)容嗎?在那篇文章中我們分析后發(fā)現(xiàn)一個 ESI 寄存器值不知是從什么地方產(chǎn)生的,要弄清這個問題必須要找到生成這個 ESI 值的計算部分。今天我們的任務(wù)就是使用 OllyDBG 的內(nèi)存斷點(diǎn)功能找到這個地方,搞清楚這個值是如何算出來的。這次分析的目標(biāo)程序還是上一篇的那個 crackme,附件 我就不再上傳了,用上篇中的附件就可以了。下面我們開始: 還記得我們上篇中所說的關(guān)鍵代碼的地方嗎?溫習(xí)一下: 00401323 |. E8 4C010000 CALL JMP.amp。 。 GetWindowTextA 00401328 |. E8 A5000000 CALL 。 關(guān)鍵,要按 F7 鍵跟進(jìn)去 0040132D |. 3BC6 CMP EAX,ESI 。 比較 0040132F |. 75 42 JNZ SHORT 。 不等則完蛋 我們重新用 OllyDBG 載入目標(biāo)程序, F9運(yùn)行來到上面代碼所在的地方(你上次設(shè)的斷點(diǎn)應(yīng)該沒刪吧?),我們向上看看能不能找到那個 ESI 寄存器中最近是在哪里賦的值。哈哈,原來就在附近啊: 我們現(xiàn)在知道 ESI 寄存器的值是從內(nèi)存地址 40339C 中送過來的,那內(nèi)存地址 40339C 中的數(shù)據(jù)是什么時候產(chǎn)生的呢?大家注意,我這里信息窗口中顯示的是 DS:[0040339C]=9FCF87AA,你那可能是 DS:[0040339C]=XXXXXXXX,這里的 XXXXXXXX 表示的是其它的值,就是說與我這里顯示的 9FCF87AA 不一樣。我們按上圖的操作在數(shù)據(jù)窗口中看一下: 從上圖我們可以看出內(nèi)存地址 40339C 處的值已經(jīng)有了,說明早就算過了?,F(xiàn)在怎么辦呢?我們考慮一下,看情況程序是把這個值算出來以后寫在這個內(nèi)存地址,那我們要是能讓 OllyDBG 在程序開始往這個內(nèi)存地址寫東西的時候中斷下來,不就有可能知道目標(biāo)程序是怎么 算出這個值的嗎?說干就干,我們在 OllyDBG 的菜單上點(diǎn) 調(diào)試 重新開始,或者按 CTR+F2 組合鍵(還可以點(diǎn)擊工具欄上的那個有兩個實心左箭頭的圖標(biāo))來重新載入程序。這時會跳出一個 “ 進(jìn)程仍處于激活狀態(tài) ” 的對話框(我們可以在在調(diào)試選項的安全標(biāo)簽下把 “ 終止活動進(jìn)程時警告 ” 這條前面的勾去掉,這樣下次就不會出現(xiàn)這個對話框了),問我們是否要終止進(jìn)程。這里我們選 “ 是 ” ,程序被重新載入,我們停在下面這一句上: 00401000 /$ 6A 00 PUSH 0 。 pModule = NULL 現(xiàn)在我們就要來設(shè)內(nèi)存斷點(diǎn)了。在 OllyDBG 中一般我們用到的內(nèi)存斷點(diǎn)有內(nèi)存訪問和內(nèi)存寫入斷點(diǎn)。內(nèi)存訪問斷點(diǎn)就是指程序訪問內(nèi)存中我們指定的內(nèi)存地址時中斷,內(nèi)存寫入斷點(diǎn)就是指程序往我們指定的內(nèi)存地址中寫東西時中斷。更多關(guān)于斷點(diǎn)的知識大家可以參考 論壇精華 7基礎(chǔ)知識 斷點(diǎn)技巧 斷點(diǎn)原理 這篇 Lenus 兄弟寫的《如何對抗硬件斷點(diǎn)之一 調(diào)試寄存器》文章,也可以看這個帖: 根據(jù)當(dāng)前我們調(diào)試的具體程序的情況,我們選用內(nèi)存寫入斷點(diǎn)。還記得前面我叫大家記住的那個 40339C 內(nèi)存地址嗎?現(xiàn)在我們要用上了。我們先在 OllyDBG 的數(shù)據(jù)窗口中左鍵點(diǎn)擊一下,再右擊,會彈出一個如下圖所示的菜單。我們選擇其中的轉(zhuǎn)到 表達(dá)式(也可以左鍵點(diǎn)擊數(shù)據(jù)窗口后按 CTR+G 組合 鍵)。如下圖: 現(xiàn)在將會出現(xiàn)這樣一個對話框: 我們在上面那個編輯框中輸入我們想查看內(nèi)容的內(nèi)存地址 40339C,然后點(diǎn)確定按鈕,數(shù)據(jù)窗口中顯示如下: 我們可以看到, 40339C 地址開始處的這段內(nèi)存里面還沒有內(nèi)容。我們現(xiàn)在在 40339C 地址處后面的 HEX 數(shù)據(jù)或 ASCII 欄中按住左鍵往后拖放,選擇一段。內(nèi)存斷點(diǎn)的特性就是不管你選幾個字節(jié), OllyDBG 都會分配 4096 字節(jié)的內(nèi)存區(qū)。這里我就 選從 40339C 地址處開始的四個字節(jié),主要是為了讓大家提前了解一下硬件斷點(diǎn)的設(shè)法,因為硬件斷點(diǎn)最多只能選 4 個字節(jié)。選中部分會顯示為灰色。選好以后松開鼠標(biāo)左鍵,在我們選中的灰色部分上右擊: 經(jīng)過上面的操作,我們的內(nèi)存斷點(diǎn)就設(shè)好了(這里還有個要注意的地方:內(nèi)存斷點(diǎn)只在當(dāng)前調(diào)試的進(jìn)程中有效,就是說你如果 重新載入程序的話內(nèi)存斷點(diǎn)就自動刪除了。且內(nèi)存斷點(diǎn)每一時刻只能有一個。就是說你不能像按 F2 鍵那樣同時設(shè)置多個斷點(diǎn))?,F(xiàn)在按 F9 鍵讓程序運(yùn)行,呵, OllyDBG 中斷了! 7C932F39 8808 MOV BYTE PTR DS:[EAX],CL 。 這就是我們第一次斷下來的地方 7C932F3B 40 INC EAX 7C932F3C 4F DEC EDI 7C932F3D 4E DEC ESI 7C932F3E ^ 75 CB JNZ SHORT 7C932F40 8B4D 10 MOV ECX,DWORD PTR SS:[EBP+10] 上面就是我們中斷后反匯編窗口中的代碼。如果你是其它系統(tǒng),如 Win98 的話,可能會有所不同。沒關(guān)系,這里不是關(guān)鍵。我們看一下領(lǐng)空,原來是在 內(nèi)。系統(tǒng)領(lǐng)空,我們現(xiàn)在要考慮返回到程序領(lǐng)空。返回前我們看一下數(shù)據(jù)窗口: 現(xiàn)在我們轉(zhuǎn)到反匯編窗口,右擊鼠標(biāo),在彈出菜單上選擇斷點(diǎn) 刪除內(nèi)存斷點(diǎn),這樣內(nèi)存斷點(diǎn)就被刪除了。 現(xiàn)在我們來按一下 ALT+F9 組合鍵,我們來到下面的代碼: 00401431 |. 8D35 9C334000 LEA ESI,DWORD PTR DS:[40339C] 。 ALT+F9 返回后來到的位置 00401437 |. 0FB60D EC334000 MOVZX ECX,BYTE PTR DS:[4033EC] 0040143E |. 33FF XOR EDI,EDI 我們把反匯編窗口往上翻翻,呵,原來就在我們上一篇分析的代碼下面啊? 現(xiàn)在我們在 0040140C 地址處那條指令上按 F2 設(shè)置一個斷點(diǎn),現(xiàn)在我們按 CTR+F2 組合鍵重新載入程序,載入后按 F9 鍵運(yùn)行,我們將會中斷在我們剛才在 0040140C 地址下的那個斷點(diǎn)處: 0040140C /$ 60 PUSHAD 0040140D |. 6A 00 PUSH 0 。 /RootPathName = NULL 0040140F |. E8 B4000000 CALL JMP.amp。 。 \GetDriveTypeA 00401414 |. A2 EC334000 MOV BYTE PTR DS:[4033EC],AL 。 磁盤類型參數(shù)送內(nèi)存地址 4033EC 00401419 |. 6A 00 PUSH 0 。 /pFileSystemNameSize = NULL 0040141B |. 6A 00 PUSH 0 。 |pFileSystemNameBuffer = NULL 0040141D |. 6A 00 PUSH 0 。 |pFileSystemFlags = NULL 0040141F |. 6A 00 PUSH 0 。 |pMaxFilenameLength = NULL 00401421 |. 6A 00 PUSH 0 。 |pVolumeSerialNumber = NULL 00401423 |. 6A 0B PUSH 0B 。 |MaxVolumeNameSize = B (11.) 00401425 |. 68 9C334000 PUSH 。 |VolumeNameBuffer = 0040142A |. 6A 00 PUSH 0 。 |RootPathName = NULL 0040142C |. E8 A3000000 CALL JMP.amp。 。 \GetVolumeInformationA 00401431 |. 8D35 9C334000 LEA ESI,DWORD PTR DS:[40339C] 。 把crackme 程序所在分區(qū)的卷標(biāo)名稱送到 ESI 00401437 |. 0FB60D EC334000 MOVZX ECX,BYTE PTR DS:[4033EC] 。 磁盤類型參數(shù)送 ECX 0040143E |. 33FF XOR EDI,EDI 。 把 EDI 清零 00401440 | 8BC1 MOV EAX,ECX 。 磁盤類型參數(shù)送 EAX 00401442 |. 8B1E MOV EBX,DWORD PTR DS:[ESI] 。 把卷標(biāo)名作為數(shù)值送到 EBX 00401444 |. F7E3 MUL EBX 。 循環(huán)遞減取磁盤類型參數(shù)值與卷標(biāo)名 值相乘 00401446 |. 03F8 ADD EDI,EAX 。 每次計算結(jié)果再加上上次計算結(jié)果保存在 EDI 中 00401448 |. 49 DEC ECX 。 把磁盤類型參數(shù)作為循環(huán)次數(shù),依次遞減 00401449 |. 83F9 00 CMP ECX,0 。 判斷是否計算完 0040144C |.^ 75 F2 JNZ SHORT 。 沒完繼續(xù) 0040144E |. 893D 9C334000 MOV DWORD PTR DS:[40339C],EDI 。 把計算后值送到內(nèi)存地址 40339C,這就是我們后來在 ESI 中看到的值 00401454 |. 61 POPAD 00401455 \. C3 RETN 通過上面的分析,我們知道基本算法是這樣的:先用 GetDriveTypeA 函數(shù)獲取磁盤類型參數(shù),再用 GetVolumeInformationA 函數(shù)獲取這個 crackme 程序所在分區(qū)的卷標(biāo)。如我把這個 Crackme 程序放在 F:\OD 教程\crackhead\ 目錄下,而我 F 盤設(shè)置的卷標(biāo)是 GAME,則這里獲取的就是 GAME, ASCII 碼為 “47414D45”。但我們發(fā)現(xiàn)一個問題:假如原來我們在數(shù)據(jù)窗口中看到的地址 40339C 處的 16 進(jìn)制代碼是 “47414D45”,即 “GAME”,但經(jīng)過地址 00401442 處的那條 MOV EBX,DWORD PTR DS:[ESI] 指令后,我們卻發(fā)現(xiàn) EBX 中的值是“454D4147”,正好把我們上面那個 “47414D45”反過來了。為什么會這樣呢?如果大家對 x86 系列 CPU 的存儲方式了解的話,這里就容易理解了。我們知道 “GAME”有四個字節(jié),即 ASCII 碼為 “47414D45”。我們看一下數(shù)據(jù)窗口中的情況: 0040339C 47 41 4D 45 00 00
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1