版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 第二十章-OllyDbg反調(diào)試之檢測(cè)OD進(jìn)程名本章我們介紹通過(guò)查找OD進(jìn)程名來(lái)進(jìn)行反調(diào)試技巧,首先我們有必要對(duì)OD進(jìn)行相應(yīng)的設(shè)置。我們選擇主菜單項(xiàng)Option-Debugging options-Security。我們可以看到這里有3個(gè)復(fù)選框,我們知道通常情況下,我們給某個(gè)API函數(shù)設(shè)置斷點(diǎn),當(dāng)我們重啟OD后,剛剛給API函數(shù)設(shè)置的斷點(diǎn)就被清除了。但是勾選上這3個(gè)復(fù)選框,再給API函數(shù)設(shè)置斷點(diǎn),重啟OD后我們會(huì)發(fā)現(xiàn)剛剛設(shè)置的斷點(diǎn)依然存在,這就避免了重啟OD后需要重新給API設(shè)置斷點(diǎn)的麻煩。實(shí)際上,我也不知道OD關(guān)于這個(gè)功能的實(shí)現(xiàn)原理,我們只需要知道這3個(gè)復(fù)選框可以讓我們?cè)O(shè)置的API斷點(diǎn)在OD
2、重啟后仍然有效。這個(gè)設(shè)置我覺(jué)得很有必要,避免了很多麻煩,現(xiàn)在我們開(kāi)始討論通過(guò)查找OD進(jìn)程名來(lái)進(jìn)行反調(diào)試的話題吧。打開(kāi)OD,接著通過(guò)Ctrl+ Alt + Delete快捷鍵打開(kāi)任務(wù)管理器。我們可以看到進(jìn)程名稱列表,我們可以通過(guò)檢測(cè)進(jìn)程名稱是否為OllyDbg,如果是就結(jié)束進(jìn)程,哈哈。我們來(lái)看一個(gè)CrackMe,這個(gè)CrackMe運(yùn)用我們前面介紹的知識(shí)暫時(shí)還解決不了,我們只是來(lái)看看它是如何檢測(cè)OllyDbg的進(jìn)程名,以及我們?nèi)绾蝸?lái)繞過(guò)它的檢測(cè),嘿嘿。這個(gè)CrackMe的名字叫做daxxor,如果我們先運(yùn)行這個(gè)CrackMe,然后打開(kāi)OD,會(huì)發(fā)現(xiàn)OD馬上就退出了。如果我們用OD加載該CrackMe
3、然后運(yùn)行起來(lái),會(huì)發(fā)生兩者一起退出了。如何來(lái)應(yīng)對(duì)這種情況呢,我們先用OD加載這個(gè)CrackMe。停在了入口點(diǎn)處,我們先看看該程序使用了哪些API函數(shù)。我們可以看到有很多API函數(shù),但都不是用于檢測(cè)進(jìn)程名的,可能這些重要的API函數(shù)被隱藏起來(lái)了,沒(méi)有出現(xiàn)該列表中。很顯然如果程序不直接導(dǎo)入某些API的話,會(huì)使用GetProcAddress這個(gè)API 函數(shù)來(lái)獲取這些API函數(shù)的地址進(jìn)行間接調(diào)用。使用GetProcAddress函數(shù)加載的一些API函數(shù)并不會(huì)出現(xiàn)該API函數(shù)列表中,我們給GetProcAddress設(shè)置一個(gè)斷點(diǎn)。運(yùn)行起來(lái)。斷在了GetProcAddress的入口點(diǎn)處,當(dāng)前待獲取的函數(shù)是_
4、CPPdebugHook,該函數(shù)檢測(cè)進(jìn)程名沒(méi)有關(guān)系,繼續(xù)運(yùn)行。我們繼續(xù)按F9鍵運(yùn)行直到待獲取的API是與檢測(cè)進(jìn)程名相關(guān)的為止,這里待獲取的API函數(shù)是EnumProcesses,這里通過(guò)選擇主菜單項(xiàng)Debug-Execute till return執(zhí)行到返回,這個(gè)時(shí)候EAX寄存器中保存的就是EnumProcesses這個(gè)API函數(shù)的地址了。我們接著就可以給該地址設(shè)置斷點(diǎn)了。這里EAX就保存了EnumProcesses的函數(shù)地址,我的機(jī)器上是76BB3A9A(可能與你機(jī)器上的不一樣)。另外,OD的API的函數(shù)列表中并沒(méi)有列出EnumProcesses這個(gè)名稱,所以我們直接bp EnumProce
5、sses是設(shè)置不了斷點(diǎn)的,我們可以給EnumProcesses函數(shù)的地址設(shè)置斷點(diǎn)。設(shè)置成功了。好了,我們已經(jīng)給EnumProcesses設(shè)置了斷點(diǎn),繼續(xù)我們剛才的步驟,看看還有什么API函數(shù)被加載。這里是獲取枚舉進(jìn)程模塊函數(shù)的地址,我們還是執(zhí)行到返回,接著給EAX中保存的地址設(shè)置斷點(diǎn)。我們直接在命令欄中輸入bp EAX。同理,我們給所有與檢測(cè)進(jìn)程名相關(guān)的API函數(shù)設(shè)置斷點(diǎn)。這里是另外一個(gè)可疑的API函數(shù)GetModuleBaseNameA,我們跟之前一樣給該函數(shù)設(shè)置斷點(diǎn),然后我們運(yùn)行起來(lái),斷在了EnumProcesses函數(shù)的入口處。我們通過(guò)雙擊反匯編窗口的注釋區(qū)域來(lái)給該函數(shù)添加注釋,注釋上該
6、函數(shù)的名稱EnumProcesses。我們給這些通過(guò)GetProcAddress加載的API設(shè)置斷點(diǎn),并且斷下來(lái)了,但是OD并沒(méi)有在API函數(shù)列表中找到與之對(duì)應(yīng)的項(xiàng),所以O(shè)D也沒(méi)有提示該函數(shù)相關(guān)信息。我們谷歌一下“EnumProcesses”。找到一個(gè)微軟的網(wǎng)站頁(yè)面:上面的解釋是該函數(shù)返回正在運(yùn)行的每個(gè)進(jìn)程的標(biāo)識(shí)即PID。好了,接下來(lái)我們看看神馬是PID,嘿嘿。PID是系統(tǒng)分配給每個(gè)正在運(yùn)行的進(jìn)程的標(biāo)識(shí)符-每次啟動(dòng)的時(shí)候都會(huì)發(fā)生變化。我們來(lái)看看進(jìn)程列表。我們可以看到,這里,OD的PID是724-十進(jìn)制。我們用windows自帶的計(jì)算器將該P(yáng)ID值轉(zhuǎn)化為十六進(jìn)制。單擊Hex按鈕,就以十六進(jìn)制顯示
7、了。PID對(duì)應(yīng)的十六進(jìn)制為2D4。可以關(guān)閉OD然后重新打開(kāi)一個(gè)OD,會(huì)發(fā)現(xiàn)PID發(fā)生了變化。進(jìn)程每次重新啟動(dòng),PID都改變了。很不走運(yùn),API的參數(shù)提示也沒(méi)有了。根據(jù)MSDN我們知道該函數(shù)有3個(gè)參數(shù)。在我們的機(jī)器上12EDE4該地址指向了保存所有進(jìn)程PID的數(shù)組,我們執(zhí)行到返回看看該API函數(shù)返回了什么,我們通過(guò)數(shù)據(jù)窗口查看一下。在PID列表中我們找到了OD的PID的值,嘿嘿。我們給該P(yáng)ID設(shè)置內(nèi)存訪問(wèn)斷點(diǎn),看看哪里使用了它。運(yùn)行起來(lái)。可以看到這里將要調(diào)用OpenProcess,如果調(diào)用成功,就會(huì)獲取OD進(jìn)程的句柄。PID跟句柄有什么區(qū)別呢?很簡(jiǎn)單。PID是用于區(qū)別不同進(jìn)程的標(biāo)示符,一個(gè)進(jìn)程被
8、創(chuàng)建后這個(gè)進(jìn)程的PID就是不變的,除非進(jìn)程重新啟動(dòng)。當(dāng)前,OD的進(jìn)程PID是2D4。而句柄實(shí)際上是一個(gè)指針,它指向一個(gè)包含具體數(shù)據(jù)結(jié)構(gòu)的內(nèi)存,可能當(dāng)做索引,所以句柄是你每次訪問(wèn)該進(jìn)程的時(shí)候獲取的,使用完畢后要釋放,然后通過(guò)該句柄可以對(duì)該進(jìn)程進(jìn)行相應(yīng)操作。下面是OpenProcess其他參數(shù)參數(shù)解釋,我們并不感興趣。返回值為指定進(jìn)程的句柄。我們F8單步直到調(diào)用該函數(shù)。EAX中返回了OllyDbg進(jìn)程的句柄,我這里是58。我們也可以通過(guò)單擊工具欄上面的H按鈕查看OD的句柄列表。我們可以看到58對(duì)應(yīng)的類型是Process,它標(biāo)識(shí)的是OllyDbg的進(jìn)程句柄。如果另一個(gè)進(jìn)程調(diào)用EnumProcesse
9、s獲取OD的進(jìn)程PID的話,仍然會(huì)是2D4,但是獲取進(jìn)程句柄的話,會(huì)是另外一個(gè)值,因?yàn)榫浔谙到y(tǒng)中是獨(dú)一無(wú)二的。這里,OllyDbg進(jìn)程就比較危險(xiǎn)了,有了OD的進(jìn)程句柄,該程序就可以做很多事情了(比如結(jié)束OD進(jìn)程),以上只是檢測(cè)OllyDbg步驟的一部分,現(xiàn)在還需要來(lái)驗(yàn)證一下進(jìn)程名稱是否為OllyDbg,很明顯該程序會(huì)對(duì)進(jìn)程列表的所有進(jìn)程做以上操作,我們跳過(guò)這些步驟直接給對(duì)應(yīng)的PID設(shè)置內(nèi)存訪問(wèn)斷點(diǎn)。我們繼續(xù)F8鍵單步。我們看到了EnumProcessModules這個(gè)函數(shù),我們看看MSDN上面關(guān)于這個(gè)函數(shù)的說(shuō)明。該函數(shù)是枚舉指定進(jìn)程的模塊,我們F7鍵跟進(jìn)到該函數(shù)的入口處。我們?cè)诙褩4翱谥衼?lái)看
10、看參數(shù)情況:58是OD的進(jìn)程句柄作為第一個(gè)參數(shù)。這里,你需要清楚一點(diǎn):當(dāng)我們請(qǐng)求獲取進(jìn)程中模塊句柄的時(shí)候,系統(tǒng)會(huì)返回該模塊在進(jìn)程內(nèi)存中基地址(模塊起始地址),這里,系統(tǒng)給我返回的是400000,該基地址對(duì)應(yīng)的OllyDbg進(jìn)程中的。繼續(xù)跟,我們可以看到另一個(gè)API函數(shù)。GetModuleBaseNameA 該函數(shù)是獲取指定進(jìn)程模塊的名稱,lpBaseName這個(gè)參數(shù)是用來(lái)保存模塊名稱的緩沖區(qū)首地址,我們執(zhí)行到返回。堆棧窗口中參數(shù)情況如下:58是OllyDbg的進(jìn)程句柄,400000是OD主模塊的基地址,用于保存模塊名稱的緩沖區(qū)首地址為12ECE0,我們?cè)跀?shù)據(jù)窗口中定位到這個(gè)地址。呵呵,很顯然,
11、我們執(zhí)行到返回以后獲取到了進(jìn)程的模塊名稱,同理,該程序會(huì)依次判斷每個(gè)進(jìn)程的名稱是否為”O(jiān)LLYDBG.exe”。好了,現(xiàn)在我們看到了CloseHandle這個(gè)API函數(shù),該函數(shù)用來(lái)關(guān)閉指定的句柄,即58將從句柄列表中消失。好了,現(xiàn)在進(jìn)程句柄被關(guān)閉了,我們不能再依賴它了。這里有一個(gè)CALL指令,我們按F7鍵跟進(jìn)。這里,我們可以看到將要壓入堆棧的是“OLLYDBG”字符串的第一個(gè)字母(4F),然后調(diào)用一個(gè)CALL指令,我們繼續(xù)跟進(jìn)。我們可以看到這個(gè)CALL里面沒(méi)有什么特別的,所以我們跟出來(lái),然后跟到下一個(gè)CALL指令處。跟進(jìn)。嘿嘿,這里在比較進(jìn)程名稱是否為”O(jiān)LLYDBG.EXE”,如果是,就會(huì).
12、嘿嘿,我們現(xiàn)在執(zhí)行到返回,看看會(huì)發(fā)生什么。如果進(jìn)程名不為”O(jiān)LLYDBG.EXE”,EAX就不等于0,JNZ條件跳轉(zhuǎn)將會(huì)發(fā)生,如果EAX為0,條件跳轉(zhuǎn)不會(huì)發(fā)生,將執(zhí)行后面結(jié)束OD進(jìn)程等一系列操作。跳轉(zhuǎn)不會(huì)發(fā)生,將會(huì)再次調(diào)用OpenProcess打開(kāi)OD進(jìn)程并且獲得其句柄,然后調(diào)用TerminateProcess結(jié)束掉該OD進(jìn)程。我們按F8鍵單步。返回的是58,我們繼續(xù)。正如你所看到的,調(diào)用TerminateProcess這個(gè)API函數(shù),指定進(jìn)程的句柄,結(jié)束調(diào)用OllyDbg進(jìn)程。我們按F8鍵,OD被關(guān)閉了。這就是我們研究的如何檢測(cè)OllyDbg進(jìn)程名的原理。好吧,我們重新啟動(dòng)OD,然后在Ope
13、nProcess入口處設(shè)置斷點(diǎn)。斷了下來(lái),我們可以修改該API函數(shù),讓它總是返回0,程序就會(huì)認(rèn)為沒(méi)有其他程序正在運(yùn)行,獲取不到任何進(jìn)程句柄,要做到這一點(diǎn),我們修改最后一行。這樣,這個(gè)API函數(shù)就總是返回0了?,F(xiàn)在我們刪除之前設(shè)置的所有斷點(diǎn)。接著設(shè)置一下主菜單項(xiàng)中的調(diào)試選項(xiàng)中的異常,如下:這里,我們勾選上忽略所以異常,因?yàn)檫@些異常中(有的必須按Shift + F9鍵,才能忽略異常繼續(xù)執(zhí)行,這里我們直接忽略掉)運(yùn)行起來(lái)。正常運(yùn)行,其實(shí)你也可以這么做:將JNZ修改為JMP,讓其直接跳過(guò)下面的關(guān)閉OllyDbg進(jìn)程的代碼。運(yùn)行起來(lái),主窗口顯示出來(lái)了,我們單擊Try按鈕。會(huì)彈出一個(gè)錯(cuò)誤信息框。顯示您已經(jīng)成功繞過(guò)該反調(diào)試。以上的方法并
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版城市綜合體安保服務(wù)合同書范本3篇
- 2025版新能源車輛定期維護(hù)合同3篇
- 2025版無(wú)利息教育培訓(xùn)機(jī)構(gòu)設(shè)備購(gòu)置貸款合同示范文本3篇
- 2025年度個(gè)人裝修工程售后服務(wù)合同
- 二零二五年度車棚租賃與智能交通系統(tǒng)融合合同4篇
- 二零二五年度林業(yè)資產(chǎn)評(píng)估與交易合同3篇
- 2025版文山凍干三七種植基地農(nóng)業(yè)生態(tài)循環(huán)經(jīng)濟(jì)合作合同3篇
- 2024門窗安裝工程節(jié)能環(huán)保驗(yàn)收合同3篇
- 二零二五年度汽車玻璃更換與售后服務(wù)協(xié)議范本3篇
- 2025版無(wú)房產(chǎn)證房屋買賣合同標(biāo)準(zhǔn)范本精裝3篇
- 高中物理競(jìng)賽真題分類匯編 4 光學(xué) (學(xué)生版+解析版50題)
- 西方經(jīng)濟(jì)學(xué)-高鴻業(yè)-筆記
- 幼兒園美術(shù)教育研究策略國(guó)內(nèi)外
- 高中英語(yǔ)選擇性必修一單詞表
- 物業(yè)公司介紹
- 2024屆河南省五市高三第一次聯(lián)考英語(yǔ)試題及答案
- 【永輝超市公司員工招聘問(wèn)題及優(yōu)化(12000字論文)】
- 孕婦學(xué)校品管圈課件
- 《愿望的實(shí)現(xiàn)》交流ppt課件2
- 中國(guó)直銷發(fā)展四個(gè)階段解析
- 2024屆浙江省寧波市鎮(zhèn)海區(qū)鎮(zhèn)海中學(xué)高一物理第一學(xué)期期末質(zhì)量檢測(cè)試題含解析
評(píng)論
0/150
提交評(píng)論