有趣的二進(jìn)制軟件安全與逆向分析_第1頁
有趣的二進(jìn)制軟件安全與逆向分析_第2頁
有趣的二進(jìn)制軟件安全與逆向分析_第3頁
有趣的二進(jìn)制軟件安全與逆向分析_第4頁
有趣的二進(jìn)制軟件安全與逆向分析_第5頁
已閱讀5頁,還剩238頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、書名:有趣的二進(jìn)制:安全與逆向分析作者:日 愛甲健二譯者:ISBN:978-7-115-40399-5本書由文化發(fā)展數(shù)字版。,。您的您個(gè)人使用,愿意相信讀者具有這樣的良知和覺悟,與共同保護(hù)。如果者有行為,可能對該用戶實(shí)施包括但不限于關(guān)閉該帳號等措施,并可能社區(qū)會員 或許未必不過() 專享 尊重譯者序免責(zé)關(guān)于商標(biāo)和 前言商標(biāo)第 1 章 通過逆向工程學(xué)習(xí)如何讀懂二進(jìn)制代碼1.1先來實(shí)際體驗(yàn)一下分析吧1.1.1通過 Pros Monitor 的日志來確認(rèn)程序的行為中能發(fā)現(xiàn)些什么1.1.2從表1.1.3逆向工程嘗試靜態(tài)分析靜態(tài)分析與動態(tài)分析用二進(jìn)制編輯器查看文件內(nèi)容看不懂匯編語言也可以進(jìn)行分析在沒有源

2、代碼的情況下搞清楚程序的行為確認(rèn)程序的源代碼嘗試動態(tài)分析設(shè)置 Pros Monitor 的過濾規(guī)則1.3.2調(diào)試器是干什么用的用 OllyDbg 洞察程序的詳細(xì)邏輯對反匯編代碼進(jìn)行分析將分析結(jié)果與源代碼進(jìn)行比較1.4學(xué)習(xí)最基礎(chǔ)的匯編指令沒必要記住所有的匯編指令匯編語言是如何實(shí)現(xiàn)條件分支的參數(shù)存放在棧中從匯編代碼聯(lián)想到 C 語言源代碼通過匯編指令洞察程序行為給函數(shù)設(shè)置斷點(diǎn)1.5.2反匯編并觀察重要邏輯第 2 章 在射擊中防止玩家解讀內(nèi)存轉(zhuǎn)儲射擊的規(guī)則修改 4 個(gè)字節(jié)就能得高分獲取內(nèi)存轉(zhuǎn)儲從進(jìn)程異常終止瞬間的狀態(tài)查找有效運(yùn)用實(shí)時(shí)調(diào)試通過轉(zhuǎn)儲文件尋找出錯(cuò)原因的原因2.2如何防止被別人分析反調(diào)試技術(shù)通

3、過代碼來防止分析將可執(zhí)行文件進(jìn)行壓縮將壓縮過的可執(zhí)行文件解壓縮:解包通過手動解包 UPX 來理解其工作原理用硬件斷點(diǎn)對 ASPack 進(jìn)行解包第 3 章 利用的進(jìn)行3.1利用緩沖區(qū)溢出來執(zhí)行任意代碼3.1.1緩沖區(qū)溢出的示例程序讓普通用戶用管理員權(quán)限運(yùn)行程序權(quán)限是如何被奪取的棧是如何使用內(nèi)存空間的3.1.5者如何執(zhí)行任意代碼3.1.6用 gdb 查看程序運(yùn)行時(shí)的情況3.1.7代碼示例生成可用作 scode 的機(jī)器語言代碼對 0 x00 的改進(jìn)3.2防御的技術(shù)地址隨機(jī)化:ASLR除存放可執(zhí)行代碼的內(nèi)存空間以外,對其余內(nèi)存空間盡量禁用執(zhí)行權(quán)限:Exec-Shield3.2.3在編譯時(shí)檢測棧數(shù)據(jù)完整

4、性的代碼:StackGuard3.3繞開安全機(jī)制的技術(shù) 3.3.1使用 libc 中的函數(shù)來進(jìn)行:Return-o-libc3.3.2:ROP利用未隨機(jī)化的模塊內(nèi)部的匯編代碼進(jìn)行第 4 章 控制程序運(yùn)行方式的編程技巧4.1通過調(diào)試器來理解其原理親手做一個(gè)簡單的調(diào)試器,在實(shí)踐中學(xué)習(xí)調(diào)試器到底是怎樣工作的實(shí)現(xiàn)反匯編功能運(yùn)行改良版調(diào)試器4.2在其他進(jìn)運(yùn)行任意代碼 :代碼注入向其他進(jìn)程注入代碼用 SetWindowsHookEx 劫持系統(tǒng)消息4.2.3將 DLL 路徑配置到表的 AppInit_DLLs 項(xiàng)通 過 CreateRemoteThread 在其他進(jìn)注入函數(shù)創(chuàng)建線程任意替換程序邏輯 :API

5、 鉤子API 鉤子的兩種類型用 Detours 實(shí)現(xiàn)一個(gè)簡單的 API 鉤子修改消息框的標(biāo)題欄第 5 章 使用工具探索更廣闊的世界5.1用 Metasploit Framework 驗(yàn)證和5.1.1Metasploit Framework5.1.2安全的信息從何而來5.1.3搭建用于測試的環(huán)境5.1.4利用進(jìn)行5.1.5一個(gè) ROP 的實(shí)際例子5.2用 EMET 觀察反 ROP 的機(jī)制5.2.1EMET5.2.2Anti-ROP 的設(shè)計(jì)獲得了藍(lán)帽獎(jiǎng)如何防止搞清楚加載器的邏輯DLL 的程序邏輯CALL-RETN 檢查如何防止誤判檢查棧的5.3用 REMnux 分析5.3.1REMnux更新特征數(shù)

6、據(jù)庫掃描目錄5.4用 ClamAV 檢測ClamAV 的特征文件解壓縮 .cvd 文件被檢測到的文件詳細(xì)信息5.4.4檢測所使用的打包器以及疑似用 Zero Wine Tryouts 分析REMnux 與 Zero Wine Tryouts 的區(qū)別 5.5.2運(yùn)行機(jī)制顯示用戶界面確認(rèn)分析盡量減少人工分析 :啟發(fā)式技術(shù).2啟發(fā)式技術(shù)5.6.3用兩個(gè)附錄A.1安裝 IDAA.2安裝 OllyDbg A.3安裝 WinDbgA.4安裝 Visual Studio 2010 A.5安裝 MetasploitA.6分析工具Stirling / BZ EditorPros MonitorP

7、ros ExplorerSysernals 工具兔耳旋風(fēng) 參考文獻(xiàn)后記TANOSHII BANNARI NO ARUKIKATA by Kenji AikoCopyright 2013 Kenji Aikos.Original Japaedition published by Gijyutsu-Hyoron Co.,., TokyoThis Simplified Chilanguage edition published by arrangement withGijyutsu-Hyoron Co.,., Tokyoin care of Tuttle-Mori Agency, Inc., Tok

8、yo本書中文簡體字版由 Gijyutsu-Hyoron Co.,版者., Tokyo人民郵電獨(dú)家。出,。譯者序這是一本講“底層”知識的書,不過似乎現(xiàn)在大部分計(jì)算機(jī)用戶都跟底層沒多少緣分了。很多人說,寫匯編語言的時(shí)候總得操心寄存器,寫 C語言的時(shí)候總得操心內(nèi)存,而如今到了Web 當(dāng)?shù)赖臅r(shí)代,不但底層的事情完全用不著操心了,就連應(yīng)用層的事情也有大把的框架來替你搞定。想想看,現(xiàn)在連大多數(shù)程序員都不怎么關(guān)心底層了,更不數(shù)量的一般用戶了。當(dāng)然,這其實(shí)是一件好事,這說明技術(shù)進(jìn)步了,分工細(xì)化了,只需要一小部分人去研究底層,剩下大部分人都可以享受他們的偉大成果,把精力集中在距離解決實(shí)際問題更近的地方,這樣才能

9、出的生產(chǎn)力。話說回來,底層到底指的是什么呢?現(xiàn)代數(shù)字計(jì)算機(jī)自問世以來已經(jīng)過了將近 60 年,在這60年中,計(jì)算機(jī)的制造技術(shù)、性能、外觀等都發(fā)生了翻天覆地的變化,然而其基本原理和結(jié)構(gòu)依然還是 1946 年馮 大神所描繪的那一套。馮 結(jié)構(gòu)的精髓在于,處理器按照順序執(zhí)行指令和操作數(shù)據(jù),而無論指令還是數(shù)據(jù),它們的本質(zhì)并沒有區(qū)別,都是一串二進(jìn)制數(shù)字的序列。換句話說,“二進(jìn)制”就是現(xiàn)代計(jì)算機(jī)的最底層?,F(xiàn)在用計(jì)算機(jī)上網(wǎng)、聊天、看、玩,根本不會去考慮二進(jìn)制層面的問題,不過較早接觸計(jì)算機(jī)的一代人,其實(shí)都曾經(jīng)離底層很近,像這本書里面所講的調(diào)試器、反匯編器、二進(jìn)制編輯器、內(nèi)存編輯器等,當(dāng)初可都是必備的法寶,也給這一

10、代人帶來過很多樂趣。在 MS-DOS 時(shí)代,很多人都用過一個(gè)叫 debug令,這就是一個(gè)非常典型的調(diào)試器。準(zhǔn)確地說,debug的功能已經(jīng)超出了調(diào)試器的范疇,除了調(diào)試之外,它還能夠進(jìn)行匯編、反匯編、內(nèi)存轉(zhuǎn)儲,甚至直接修改磁盤扇區(qū),儼然是那個(gè)年代的一把“候,學(xué)校上計(jì)算機(jī)課用的電腦在 BIOS 里禁用了軟驅(qū),而且還設(shè)置了 BIOS,于是我運(yùn)行 debug,寫幾條匯編指令,調(diào)用系統(tǒng)中斷強(qiáng)行抹掉 CMOS 數(shù)據(jù),重啟之后顯示 CMOS 數(shù)據(jù)異常,于是 BIOS 設(shè)置被恢復(fù)到默認(rèn)狀態(tài),軟驅(qū)也就可以用了,小伙伴們終于可以把帶來玩了。當(dāng)然,學(xué)校老師后來還是找到我談話,原因僅僅是因?yàn)槲以谛畔W(xué)奧賽得過獎(jiǎng),他們覺

11、得除了我以外不可能有別人干得出這種事了很多資歷比較老的 PC玩家其實(shí)也都和二進(jìn)制打過交道,比如說,大家應(yīng)該還記得一個(gè)叫“整人FPE”的。如果你曾經(jīng)用過“整人”,那么這本書第 2 章中講的那個(gè)修改得分的橋段你一定是再熟悉不過了。除了修改內(nèi)存中的數(shù)據(jù),很多玩家應(yīng)該也用二進(jìn)制編輯器修改過存檔,比如當(dāng)年的群俠傳仙劍奇?zhèn)b傳,改金錢能力值那還是初級技巧,還有一些高級技巧,比如改各種中的 flag,這樣錯(cuò)過開啟隱藏分支的條我也曾經(jīng)用 SoftICE 玩過一點(diǎn)逆向工程,找到判斷是否激活的邏輯,然后用一個(gè)無條件跳轉(zhuǎn)替換它,或者是跳過序列號的校驗(yàn)邏輯,不管輸入什么序列號都能激活。精通二進(jìn)制的人還懂得如何壓榨出每一

12、個(gè)比特的能量。說到這一點(diǎn),不得不提鼎鼎大名的64k-ro 大賽。所謂 64k-ro,就是指用一來產(chǎn)生包含圖像和聲音的演示動畫,而這(可執(zhí)行文件)的大小被限制為 64KB(65536 字節(jié))。想想看,用隨便拍一張就得差不多 2MB 大小,相當(dāng)于 64KB 的 32 倍,然而大神們卻能在 64KB 的空間里塞下長達(dá)十幾分鐘的 3D 動畫和音樂,著實(shí)令人驚嘆不已。我第一次看到 64k-ro 作品是在上初中的時(shí)候,當(dāng)時(shí)某一期大眾雜志對此做了介紹,光盤里還附帶了相應(yīng)的程序文件。當(dāng)我在自己的電腦上親自運(yùn)行,看到美輪美奐的 3D 動畫時(shí),瞬間就被二進(jìn)制的奇妙感動了。件也不怕不怕啦。此外,各種二進(jìn)制的樂趣不勝

13、枚舉,其實(shí)最大的樂趣莫過于“打開黑箱”所帶來的那種抽絲剝繭的??鋸堻c(diǎn)說,這和物理學(xué)家們探求“大理論”,不斷逼近宇宙終極規(guī)律的過所體驗(yàn)到的那種頗有異曲同工之妙。誠然,二進(jìn)制的可能性是無窮無盡的,這本書所涉及的也只是其中很小的一方面,但正如作者言中所說的那樣,希望大家能夠借此體會到底層技術(shù)所特有的。燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙2015 年 8 月于免責(zé)本書的內(nèi)容以提供信息為目的,在使用本書的過,讀者需要自己做出判斷并承擔(dān)相應(yīng)的責(zé)任。對于讀者因使用本信息所造成的任何,作者、技術(shù)評論社、譯者、人民郵電恕不負(fù)責(zé)。本 化。內(nèi)容基于

14、 2013 年 7 月 12 日的最新信息編寫,在讀者實(shí)際閱讀時(shí)可能已經(jīng)發(fā)生變此外,方面由于其版本的更新,可能會與本書中所描述的功能和畫面存在差異。在本書之前,請務(wù)必確認(rèn)您所使用的版本。各位讀者在閱讀本書之前,請同意并遵守上述注意事項(xiàng)。如果沒有閱讀上述事項(xiàng),那么對于由此產(chǎn)生的問題,和作譯者可能也無法解決,敬請各位讀者理解。關(guān)于商標(biāo)和商標(biāo)本書中所涉及的產(chǎn)品名稱,一般皆為相應(yīng)公司的商標(biāo)或者、 等標(biāo)記。商標(biāo),在本書正文中已省略前言如今,計(jì)算機(jī)已經(jīng)深入千家萬戶,為的生活帶來了很多方便。但與此同時(shí),計(jì)算機(jī)系統(tǒng)也變得越來越復(fù)雜,技術(shù) 理解的黑箱也越來越多了。需要學(xué)習(xí)的知識也與日俱增。和過去相比,計(jì)算機(jī)技術(shù)

15、中難以操作系統(tǒng)到底是干什么的?CPU 和內(nèi)存到底是干什么的?為什么能夠運(yùn)行?為什么會存在安全?為什么者能夠運(yùn)行任意代碼?要想回答上面這些問題,需要用到以匯編為代表的二進(jìn)制層面的知識。盡管現(xiàn)在正是 Web 應(yīng)用如日中天的時(shí)候,但二進(jìn)制層面的知識依然能夠在關(guān)鍵時(shí)刻發(fā)揮作用。例如:“用 C/C+ 開發(fā)的程序出現(xiàn)了不明原因的 bug,看了源代碼還是找不到原因?!痹谶@樣的情況下,即便不會編寫匯編代碼,只要能看懂一些匯編語言,就可以通過調(diào)試器立刻鎖定發(fā)生 bug 的位置,迅速應(yīng)對。有 bug,那么即便看不到源代碼,此外,如果別人編寫的也能夠?qū)ζ鋬?nèi)部結(jié)構(gòu)進(jìn)行分析,并找到避開問題的方法,也可以為庫的開發(fā)者提供

16、更有幫助的信息。再舉個(gè)例子。學(xué)習(xí)匯編能夠更好地理解 CPU 的工作原理,從而能夠處理系統(tǒng)內(nèi)核、驅(qū)動程序這一類近乎于黑箱的底層問題,對于實(shí)際的底層開發(fā)工作也非常有幫助。不過,說實(shí)在的,“有沒有幫助”“流不流行”這些都不重要,從個(gè)人經(jīng)驗(yàn)來看,因?yàn)楦杏X“好像有用”“好像有幫助”而開始學(xué)習(xí)的東西,最后基本上都沒有真正掌握(笑)。當(dāng)然,也許是因?yàn)槲姨熨Y愚鈍,不過在上學(xué)的時(shí)候,老師天天教導(dǎo)要好好學(xué)習(xí),實(shí)際上有1%幾個(gè)人真的好好學(xué)習(xí)了呢?雖然我沒做過統(tǒng)計(jì),但從感覺來看,整個(gè)吧。也許還不到那么問題來了,要想真正學(xué)會一件事,到底需要什么呢?我是從初中時(shí)始學(xué)習(xí)編程的,盡管當(dāng)時(shí)完全沒有想過將來要當(dāng)程序員,靠技術(shù)吃飯

17、,但我依然癡迷于計(jì)算機(jī),每天編程到深更半夜,甚至影響了學(xué)習(xí)成績,令父母擔(dān)憂。為什么當(dāng)時(shí)的我如此癡迷于計(jì)算機(jī)而無法自拔呢?那是因?yàn)椤熬幊烫腥ち恕薄W约壕帉懙拇a能夠按照設(shè)想運(yùn)行起來,或者是沒有按照設(shè)想運(yùn)行起來,再去查找原因,這些事情都為我?guī)砹说臉啡?。我編寫這本書,也是為了讓大家對技術(shù)感到“有趣”,并且“想了解得”。而在編寫這本書,我再一次感到,在不計(jì)其數(shù)的編程語言中,匯編語言是最“有趣”的一種。的過如果你突然覺得“講底層問題的書好像挺有意思的”而買了這本書,那么我相信,這本書一定能夠?yàn)槟銕沓鲱A(yù)期的價(jià)值。希望大家能夠通過這本書,感受到二進(jìn)制世界的樂趣。第 1 章通過逆向工程學(xué)習(xí)如何讀懂二進(jìn)

18、制代碼大家是否聽說過“逆向工程”這個(gè)詞呢?逆向工程原本是指通過拆解機(jī)器裝置并觀察其運(yùn)行情況來推導(dǎo)其制造方法、工作原理和原始設(shè)計(jì)的行為,但在領(lǐng)域,逆向工程主要指的是閱讀反匯編(將機(jī)器語言代碼轉(zhuǎn)換成匯編語言代碼)后的代碼,以及使用調(diào)試器行為等工作。程序員都應(yīng)該知道,處理器是通過解釋和執(zhí)行機(jī)器語言代碼來運(yùn)行程序的,但對現(xiàn)在的程序其行為并不是一項(xiàng)必備技能。換句話說,“知道員來說,對機(jī)器語言代碼進(jìn)行反匯編并是知道,但沒親自嘗試過”這種情況比較普遍。筆者是一位喜愛匯編語言的工程師,但也并不認(rèn)為上面的現(xiàn)象問題。實(shí)際上,除了匯編以外,平時(shí)也經(jīng)常使用 C、JavaScript 等其他語言。不過,有些東西適合用C

19、、JavaScript 來編寫,同樣也有一些東西適合用匯編語言來編寫。更進(jìn)一步說,在某些技術(shù)領(lǐng)域中,不懂匯編就無法工作。經(jīng)常和處理器層面的東西打交道的工程師被稱為Binarian1。盡管這些人并不能說多么偉看呢?大,但他們的確運(yùn)用著很多鮮為人知的技術(shù),你想不想1 這是一個(gè)人造出來的詞,英文中沒有這個(gè)詞。譯者注在本章中,通過的逆向工程,探索一下二進(jìn)制世界的奧秘。1.1先來實(shí)際體驗(yàn)一下分析吧下面就來動手嘗試一下逆向工程?!斑??你還什么都沒教呢!”沒關(guān)系,也許大家印象里覺得逆向工程是很難的,其實(shí)這里面有一半是誤會,因?yàn)榉治龅碾y度取決于你要分析的對象。有些很難進(jìn)行分析,但也有一些則很容易。這里準(zhǔn)備了一

20、個(gè)簡單的“”程序,然后從下面三個(gè)要點(diǎn)來進(jìn)行分析。文件的創(chuàng)建、修改和刪除表項(xiàng)目的創(chuàng)建、修改和刪除網(wǎng)絡(luò)通信如果能對上述三個(gè)方面進(jìn)行,那么就不難的行為。這里需要下面三個(gè)工具。Stirling2 (二進(jìn)制編輯器)Pros Monitor(文件和表)en-us/sysernals/bb896645Wireshark(網(wǎng)絡(luò))2 這個(gè)僅在的圈子里有名,也只有日文界面,如果不可以使用其他類似工具(如 WinHex)來替代。譯者注先啟動 Pros Monitor 和 Wireshark,修改配置以啟用日志輸出。本所有示例文件均可從以下地址。kenjiaiko/binarybook 33 譯者 fork 了這個(gè)項(xiàng)

21、目,并對其中的說明文件和源代碼注釋等進(jìn)行了翻譯,大家可以從這里者注:/shyujikou/binarybook 。譯本次的分析對象為 chap01sample_malRelease 目錄中的 sample_mal.exe 文件,請大家運(yùn)行這個(gè)文件。運(yùn)行 sample_mal.exe 后,應(yīng)該會彈出一個(gè)內(nèi)容為“o Malware!”的框??蛑?,sample_mal.exe 文件本身也會關(guān)閉。1.1.1通過 Pros Monitor 的日志來確認(rèn)程序的行為下面來看一下 Pros Monitor 的日志。 Pros Monitor 的運(yùn)行結(jié)果(文件)通過Pros Monitor 的日志,可以發(fā)現(xiàn)程

22、序在以下位置進(jìn)行了 CreateFile 操作。C:s and SettingsXPMUser開始菜單 程序 啟動 0.exeWindows XP 的情況。C:Users用戶名AppDataRoamingWindowsStartProgramsStartup0.exeWindows Vista 及更高版本的情況。AppData 為隱藏文件夾。存放在“啟動”文件夾中的程序,會隨著 Windows 啟動自動運(yùn)行。的示例程序連續(xù)執(zhí)行了 CreateFile、WriteFile 和 CloseFile 這幾個(gè)操作,這請大家注意,些操作加起來的功能相當(dāng)于“在指定文件夾創(chuàng)建并寫入一個(gè)名為 0.exe 的文

23、件”。來實(shí)際確認(rèn)一下。 確認(rèn)“啟動”文件夾中的內(nèi)容果然和日志所描述的一樣,創(chuàng)建了一個(gè) 0.exe 文件。用二進(jìn)制編輯器 Stirling 對比一下 0.exe 和 sample_mal.exe 的內(nèi)容。在菜單中點(diǎn)擊搜下面索 / 移動比較,在彈出的窗口中選擇比較對象,點(diǎn)擊 OK 即可。通過對比發(fā)現(xiàn),兩個(gè)文件的內(nèi)容完全一致,也就是說,程序?qū)⒆约毫艘环荨?用 Stirling 對文件進(jìn)行對比(在菜單中點(diǎn)擊搜索 / 移動比較) 44 圖出的框中的日文“違”是“沒有差異”的意思。譯者注由于“啟動”文件夾中的程序會在Windows啟動時(shí)自動運(yùn)行,因此當(dāng)重啟Windows時(shí),0.exe看。就會被運(yùn)行。這個(gè)程

24、序并不會帶來什么實(shí)際的危害,所以大家可以重啟系統(tǒng)試試1.1.2從表中能發(fā)現(xiàn)些什么下面來確認(rèn)一下表的情況。Pros Monitor 會列出程序過的表項(xiàng)目和文件。表是 Windows 系統(tǒng)提供給應(yīng)用程序的一個(gè)用于保存配置信息的數(shù)據(jù)庫,其中保存的數(shù)據(jù)包括瀏覽器設(shè)置、文件類型關(guān)聯(lián)、用戶等。通過查看 Pros Monitor 輸出的日志,可以知道程序向“啟動”文件夾了一個(gè)文件。進(jìn)一步分析日志,還可以發(fā)現(xiàn)程序?qū)Ρ磉M(jìn)行了一些可疑的。 Pros Monitor 的運(yùn)行結(jié)果(表)看來程序在 HKEY_LOCAL_MACHINESoftwareWindowsCurrentVerRun 中創(chuàng)建了一個(gè)名為 sampl

25、e_mal 的表項(xiàng)目。HKEY_LOCAL_MACHINESoftwareWindowsCurrent VerRun 和“啟動”文件夾一樣,其中的程序會在 Windows 重啟時(shí)自動運(yùn)行。Windows 重啟時(shí)自動運(yùn)行的程序可以在下列任一表的位置。HKEY_LOCAL_MACHINESoftwareWindowsCurrentVerRunHKEY_CURRENT_USERSoftwareWindowsCurrentVerRunHKEY_LOCAL_MACHINESoftwareWindowsCurrentVerRunOnceHKEY_CURRENT_USERSoftwareWindowsCur

26、rentVerRunOnce此外,發(fā)現(xiàn)程序還在 C:s andSettingsXPMUserMys目錄下,也就是“文檔”文件夾下創(chuàng)建了一個(gè)名為 1.exe 的文件。 確認(rèn)“文檔”文件夾的內(nèi)容和 0.exe 一樣,1.exe 也是 sample_mal.exe 的一個(gè)副本。1.exe由于的路徑已經(jīng)被在表HKEY_LOCAL_MACHINESoftwareWindowsCurrentVerRun下面,因此當(dāng)Windows 啟動時(shí)就會自動運(yùn)行 1.exe。來看一下 Windows表的內(nèi)容。使用 Windows 自帶的 regedit 工具就可以查看注下面冊表,點(diǎn)擊開始菜單運(yùn)行,輸入 regedit

27、即可。 確認(rèn)表內(nèi)容可以發(fā)現(xiàn)表里面的確了 C:s and SettingsXPMUserMys1.exe 這樣的內(nèi)容。刪除 0.exe 和 1.exe,那么 Windows 重啟時(shí)就不會再運(yùn)行 sample_mal.exe 了。因此,如果其實(shí),sample_mal.exe 只會彈出一個(gè)o Malware! 的框,并沒有進(jìn)行其他任何操作。因此,只要將“啟動”文件夾、“文檔”以及表中新增的內(nèi)容(文件路徑)刪除,系統(tǒng)環(huán)境就可以完全恢復(fù)原狀了。1.1.3逆向工程可以發(fā)現(xiàn),sample_mal.exe 程序會執(zhí)行以下操作。通過上面的結(jié)果修改表以便在系統(tǒng)重啟時(shí)自動運(yùn)行到“啟動”文件夾以便在系統(tǒng)重啟時(shí)自動運(yùn)行

28、將自己暫時(shí)不需要用到 Wireshark。由于程序沒有進(jìn)行網(wǎng)絡(luò)通信,因此當(dāng)然,由于在一開始不知道要分析的具體會執(zhí)行怎樣的操作,因此應(yīng)該盡可能地收集完整的操作日志,對于不需要的部分只要放著不用就好了。進(jìn)行分析并搞清楚其行為的工作就是“逆向工程”。逆向工程是指一般意義像上面這樣對上的分析,其對象不僅限于,因此也不一定和計(jì)算機(jī)安全有關(guān)。逆向工程原本是指通過拆解機(jī)器裝置并觀察其運(yùn)行情況來推導(dǎo)其制造方法、工作原理和原始設(shè)計(jì)的行為,但在領(lǐng)域,逆向工程主要指的是閱讀反匯編(將機(jī)器語言代碼轉(zhuǎn)換成匯編語言代碼)后的代碼,以及使用調(diào)試器行為等工作。一直以來,在計(jì)算機(jī)分析、防止使用的防拷貝技術(shù),以及評估強(qiáng)度的抗篡改

29、測試等領(lǐng)域都會用到逆向工程技術(shù)。一般認(rèn)為,和開發(fā)所使用的編程技術(shù)相比,逆向工程屬于另一種完全不同的技能。此外,由于逆向工程常常被用于領(lǐng)域,因此也經(jīng)常被歸為安全技術(shù)的一種。分析、防拷貝等專欄:逆向工程技術(shù)大賽和民間社區(qū)會舉辦一些以 CTF(Capture the Flag)為代表的逆向工程在一些國家,技術(shù)大賽,以推動技術(shù)的發(fā)展。SECCON CTF()DEFCON CTF()CODEGATE CTF(韓國)近年來,隨著需求的不斷增加,世界各地都開始開展各種安全競賽活動。這些競賽基本上都是通過線上預(yù)賽選出成績最好的 10 20 個(gè)隊(duì)伍進(jìn)入決賽。盡管很多比賽的水平很高,但比賽本身也十分有趣,有可。的

30、話去參加一下也未嘗不1.2嘗試靜態(tài)分析1.2.1靜態(tài)分析與動態(tài)分析分析從方法上可大體分為“靜態(tài)分析”和“動態(tài)分析”兩種。簡單來說,它們的區(qū)別如下。靜態(tài)分析:在不運(yùn)行目標(biāo)程序的情況下進(jìn)行分析動態(tài)分析:在運(yùn)行目標(biāo)程序的同時(shí)進(jìn)行分析剛才對 sample_mal.exe 進(jìn)行分析的方法就屬于動態(tài)分析。相對地,靜態(tài)分析主要包括以下方法。閱讀反匯編代碼提取可執(zhí)行文件中的字符串,分析使用了哪些單詞從廣義上來看,用二進(jìn)制編輯器查看可執(zhí)行文件的內(nèi)容也可以算作是一種靜態(tài)分析。先來對 chap01wsample01aRelease 中的示例程序 wsample01a.exe 進(jìn)行靜態(tài)分下 面,析。wsample01

31、a.exe 的運(yùn)行結(jié)果如下所示。 wsample01a.exe 的運(yùn)行結(jié)果運(yùn)行之后,發(fā)現(xiàn)這個(gè)程序只是簡單地顯示了一個(gè)o! Windows框而已。,這個(gè)程序真的就這么簡單嗎?讓再仔細(xì)一下。首先,用二進(jìn)制編輯器打開 wsample01a.exe文件。文本編輯器還是有很多人經(jīng)常使用的,不過會使用二進(jìn)制編輯器的人可就不多了。在分析中,二進(jìn)制編輯器要從頭用到尾的。就我個(gè)人來說,二進(jìn)制編輯器、計(jì)算器、反匯編器和調(diào)試器可謂是逆向工程的四大法寶,不過在這方面使用什么工具也是因人而異,我說的也并不是唯一標(biāo)準(zhǔn)。在二進(jìn)制編輯器中,比較流行的主要是以下兩種。StirlingBZ Editor這兩個(gè)工具可以說各有,大多

32、數(shù)分析者都是兩者并用的。筆者也是兩個(gè)工具都安裝Stirling,本了,但如果一定要二者選其一的話,筆者比較Stirling 為前提來進(jìn)行的(理由請參見專欄)。講解也是以使用專欄:Stirling 與 BZ Editor 的區(qū)別剛才提到“Stirling 和 BZ Editor 這兩個(gè)工具各有”,但使用 Stirling 基本上可以應(yīng)付大多數(shù)情況。然而,盡管 Stirling 功能強(qiáng)大,可以應(yīng)付各種情況,但處理尺寸較大的文件會消耗過多的內(nèi)存,因此無法處理幾個(gè) GB 大小的文件。一般來說,處理大文件的機(jī)會還是比較少的,因此通常情況下使用 Stirling 就足夠了,不過 BZ Editor 卻能夠

33、彌補(bǔ)這一缺點(diǎn),它可以輕松打開大文件,而且反應(yīng)更敏捷。盡管現(xiàn)實(shí)總是不完美,但其實(shí)心希望這兩個(gè)工具能夠被整合起來,變成一個(gè)既擁有強(qiáng)大功能,又能夠輕松處理大文件的二進(jìn)制編輯器。能如此,?1.2.2用二進(jìn)制編輯器查看文件內(nèi)容下面用 Stirling 打開 wsample01a.exe 看一看。 用 Stirling 打開 wsample01a.exe 的樣子用 Stirling 打開 wsample01a.exe 后,可以看到屏幕上顯示出一串進(jìn)制字符。這就是Windows 可執(zhí)行文件格式,即“PE 格式”的文件內(nèi)容。關(guān)于 PE 格式的詳細(xì)信息,可以通過閱讀文檔來搞明白,不過這一次還不用了解得那么深入,

34、只要看個(gè)大概就行了,不需要理解這些數(shù)據(jù)的含義。乍一看,就能夠發(fā)現(xiàn)下面這些內(nèi)容。字符串 MESSAGE 和o! Windows文件路徑C:sandSettingsXPMUserMysVisualStudio2010Projectswsample01aReleasewsample01a.pdb字符串 KERNEL32.dll、MessageBoxW除此之外還有其他一些字符串貌似也能看出什么意思,不過好像又看不太明白,總之現(xiàn)在到這一步就可以了。1.2.3看不懂匯編語言也可以進(jìn)行分析試試看對 wsample01a.exe 進(jìn)行反匯編。接下來本書中使用 IDA 5.0 Freeware 版(免費(fèi)版)作為

35、反匯編工具。和正式版相比,免費(fèi)版支持的處理器數(shù)量較少,而且還有一些功能限制,但它的性能依然出眾,在反匯編領(lǐng)域可以說無出其右。工具的安裝方法請參見附錄。最新的 6.2 D e m o 版,不過這個(gè)版本有使用時(shí)間限制。大家也可以IDA 6.2 Demo ver, IDA 5.0 Freeware verhttp:products/ida/support/download.shtml也許大家印象里覺得匯編語言非常難懂,但其實(shí)現(xiàn)在有很多功能強(qiáng)大的工具,可以像看流程圖一樣對進(jìn)行分析。下面讓來體驗(yàn)一下。首先,將 wsample01a.exe 拖曳到 IDA 的圖標(biāo)上,然后會顯示一個(gè) About將它關(guān)閉。按

36、 OK框,接下來,會彈出一個(gè) Load a new file框,詢問用什么格式打開指定的文件。選擇 Portable executable for 80386 (PE),然后按 OK。這里隨后可能還會彈出一些消息,只要點(diǎn)擊 OK 就可以了。接著,IDA 會彈出一個(gè)分析窗口。右邊有一個(gè)名叫Nameswindow的窗口,它默認(rèn)是打開的,如果沒有打開的話可以按Shift+F4 打開,或者也可以點(diǎn)擊菜單 View Open subviews Names。在 Names window 窗口的最上方會顯示 wWain 這個(gè)函數(shù)名,雙擊它。接下來,IDA View-A 窗口中會顯示出反匯編代碼。 用 IDA

37、 打開 wsample01a.exe(Load a new file) 用 IDA 打開 wsample01a.exe(分析窗口)也可以函數(shù)名,從菜單中選擇 Text view 或者是 Graph view,用不同的視圖來查看代碼,默認(rèn)視圖為 Graph view。 wWain 函數(shù)的反匯編代碼(Graph view)在這個(gè)視圖中,IDA 會顯示出調(diào)用的函數(shù)以及傳遞的參數(shù),十分容易理解。也許你曾經(jīng)認(rèn)為“匯編語言很難懂”,但現(xiàn)在有了很多工具,甚至在分析中已經(jīng)幾乎用不到匯編語言的知識了,大家看看 IDA 顯示出來的匯編語言代碼應(yīng)該就能夠明白了。1.2.4在沒有源代碼的情況下搞清楚程序的行為下面來看

38、看wWain函數(shù)里面的邏輯,除了o!Windows、MESSAGE、MessageBoxW 等字符串以外,還能發(fā)現(xiàn)下列字符串。2012lstrcmpWGetActiveWindowo! Windows 和o! 2012 這兩個(gè)字符串,它們是在不同的條件分其中尤其值得尋味是支中顯示的。嘗試在命令行中用 2012 作為參數(shù)來運(yùn)行一下 wsample01a.exe。 運(yùn)行示例C:wsample01a.exe 2012 向 wsample01a.exe 傳遞參數(shù) 2012 后的運(yùn)行結(jié)果和無參數(shù)的情況相比,這次顯示出來的消息變成了o! 2012??赡苡腥艘獑枺骸澳怯秩绾危俊卑l(fā)現(xiàn)了通過傳遞 2012 這個(gè)

39、參數(shù),程序的顯示結(jié)果會發(fā)生在“完全沒有源代碼的情況下,搞清楚了程序的行為”。變化,這很重要。因?yàn)檫@就是逆向工程。剛才這個(gè)參數(shù)是猜測出來的,其實(shí)只要閱讀匯編語言代碼,就可以發(fā)現(xiàn)其中使用了lstrcmpW 對字符串 2012 和命令行參數(shù)進(jìn)行了比較操作。 wsample01a.exe stdcall wW00401000;ain(,LPCWSTR lpString1,)00401000004010000040100000401000004010000040100100401003004010060040100B0040100C0040101200401014004010190040101B0040

40、101D00401022wWain proc nearlpString1= dword ptr 10hpush mov mov push push call push push test jnz push callebp ebp, espeax, ebp+lpString1 offset String2 ; 2012eax; lpString1ds: imp lstrcmpW8 ; lstrcmpW(x,x)0;uType MESSAGEoffset Caption ; eax, eaxshort loc_401035offset Text;o! 2012ds: imp GetActiveWi

41、ndow0 ;GetActiveWindow()0040102800401029push calleax; hWndds: imp MessageBoxW16 ;MessageBoxW(,x)eax, eax ebp10h0040102F0040103100401032xor pop retn; lpCaption00401035004010350040103Aloc_401035:push calloffset aoWindows ; o! Windowsds: imp GetActiveWindow0 ;GetActiveWindow()0040104000401041push calle

42、ax; hWndds: imp MessageBoxW16 ;MessageBoxW(,x)eax, eax ebp10h00401047004010490040104A0040104Axor pop retnwWainendp當(dāng)然,沒必要看懂全部的匯編語言代碼。和剛才使用二進(jìn)制編輯器的時(shí)候一樣,只要一眼望去能大概理解這段代碼做了什么事就可以了。1.2.5確認(rèn)程序的源代碼wsample01a.exe真正的源代碼(chap01wsample01a最后讓來看一下中的wsample01.cpp)。要編譯這段代碼需要安裝 Visual Studio。關(guān)于參見附錄,關(guān)于如何編譯請參見 readme 文件

43、。Visual Studio的安裝方法請 wsample01a.cpp#include #include APIENTRY _tWain(HINSTANCE HINSTANCE LPTSTRhInstance, hPrevInstance, lpCmdLine, nCmdShow)if(lstrcmp(lpCmdLine, _T(2012) = 0) MessageBox(GetActiveWindow(),_T(o! 2012), _T(MESSAGE), MB_OK);elseMessageBox(GetActiveWindow(),_T(o! Windows), _T(MESSAGE),

44、 MB_OK);return 0;現(xiàn)在大家能夠理解 IDA 的反匯編結(jié)果是何等容易理解了吧。剛一聽到“逆向工程”“匯編”這些詞的時(shí)候,大家總會以為它們很難,但實(shí)際上并非如此。使用 IDA,就可以將可執(zhí)行文件轉(zhuǎn)換成像 C 語言一樣容易理解(實(shí)際上還是有差距的)的匯編代碼。尤其是它的Graphview十分強(qiáng)大,可以讓十分清晰地看出程序的分支邏輯。只要一定程度上掌握這些工具的使用方法,大家就可以完成很多分析工作了。1.3嘗試動態(tài)分析設(shè)置 Pros Monitor 的過濾規(guī)則接下來,來嘗試一下動態(tài)分析。相對于靜態(tài)分析而言,動態(tài)分析是在目標(biāo)程序運(yùn)行的同時(shí)其行為的方法。在這里,主要用調(diào)試器來程序邏輯,除此

45、以外,下面這些方法也被稱為動態(tài)分析。獲取文件和表日志抓取網(wǎng)絡(luò)包來分析一下 chap01wsample01bRelease 中的示例程序 wsample01b.exe。下面先來看一下 wsample01b.exe 的運(yùn)行結(jié)果。 wsample01b.exe 的運(yùn)行結(jié)果這個(gè)程序看起來只是在屏幕上顯示了一條 Copied! 消息,實(shí)際上背后發(fā)生了什么呢?還不得而知。下面來仔細(xì)一下。可以用 Pros Monitor 來輸出示例程序 wsample01b.exe 的運(yùn)行日志。啟動 Procmon.exe 之后,會彈出過濾規(guī)則設(shè)置窗口,在這里設(shè)置為 wsample01b.exe。如果沒有彈出過濾規(guī)則設(shè)置窗

46、口,可以按下 Ctrl+L 或者點(diǎn)擊菜單中的 Filter Filter.。 在 Pros Monitor 的過濾規(guī)則中設(shè)置 wsample01b.exe在過濾規(guī)則里面可以進(jìn)行各種設(shè)置。希望實(shí)現(xiàn)的是“當(dāng)進(jìn)程名稱為 wsample01b.exe 時(shí)輸出日志”,設(shè)置好之后顯示的文字這里描述如下。Pros Name is wsample01b.exe then Include輸入規(guī)則后,按下 Add 按鈕,這條規(guī)則就會被添加到下面的列表中。設(shè)置完成,點(diǎn)擊 OK 關(guān)閉設(shè)置窗口,然后運(yùn)行 wsample01b.exe。 運(yùn)行 wsample01b.exe 并輸出日志運(yùn)行 wsample01b.exe,會

47、彈出一個(gè)寫著 Copied! 的消息框。與此同時(shí),Pros Monitor 也會輸出文件和表的日志。通過日志,可以看出 wsample01b.exe了以下文件。C:s and SettingsXPMUser開始菜單 程序 啟動 wsample01b.exe和 sample_mal.exe 很像吧? 對“啟動”文件夾的可以打開“啟動”文件夾確認(rèn)一下,里面果然有 wsample01b.exe 文件。筆者的測試環(huán)境是 Windows XP SP3,請大家注意不同環(huán)境下“啟動”文件夾的名稱和位置可能會有所不同。在 Vista 及更高版本中,“啟動”文件夾位于以下位置。C:Users 用戶名 AppDa

48、taRoamingWindowsStartProgramsStartup1.3.2調(diào)試器是干什么用的通過 Pros Monitor只能知道上面這些信息,如果要進(jìn)一步程序邏輯,需要使用調(diào)試器。調(diào)試器是一種幫助發(fā)現(xiàn)程序問題和 bug 的,一般來說至少應(yīng)具備以下功能。斷點(diǎn)單步跳入、跳出查看寄存器和內(nèi)存數(shù)據(jù)可以在可能會發(fā)生 bug 的地方稍斷點(diǎn)是能夠讓程序在任意位置中斷、恢復(fù)運(yùn)行的功能。往前一點(diǎn)設(shè)置一個(gè)斷點(diǎn),以便找到導(dǎo)致問題的程序邏輯。一般來說,如果是機(jī)器語言,則以指令為來設(shè)置斷點(diǎn);而如果是高級語言,則以源代碼的行為來設(shè)置斷點(diǎn)。斷點(diǎn)能夠在任意位置中斷和恢復(fù)運(yùn)行,而每執(zhí)行一條指令都中斷一次就叫作單步跳入

49、或跳出。通過單步運(yùn)行功能,可以以一條指令或者一行代碼為逐個(gè)運(yùn)行程序中的邏輯,仔細(xì)確認(rèn)內(nèi)存和變量的狀態(tài)。跳入和跳出的區(qū)別如下所示。跳入:調(diào)用函數(shù)時(shí)進(jìn)入函數(shù)內(nèi)部跳出:調(diào)用函數(shù)時(shí)不進(jìn)入函數(shù)內(nèi)部,而是將函數(shù)調(diào)用作為一條指令來執(zhí)行最后就是查看寄存器和內(nèi)存數(shù)據(jù)了,這個(gè)功能可以在程序中斷運(yùn)行的狀態(tài)下確認(rèn)寄存器、內(nèi)存和變量的狀態(tài)。使用的調(diào)試器為 OllyDbg 1.10,安裝方法請參見附錄。本章中OllyDbg1.3.3用 OllyDbg 洞察程序的詳細(xì)邏輯wsample01b.exe 拖曳到 OllyDbg 的圖標(biāo)上。現(xiàn)在 用 OllyDbg 打開 wsample01b.exeOllyDbg 的畫面包括以下

50、幾個(gè)部分。左上:主要反匯編窗口左下:內(nèi)存數(shù)據(jù)窗口右上:寄存器右下:當(dāng)前棧這些窗口各自的功能可以慢慢學(xué),現(xiàn)在先按下面任意方式進(jìn)行操作,然后在彈出的窗口中輸入 00401000,按下 OK 按鈕。在反匯編窗口中按 Ctrl+G在單擊右鍵彈出的菜單中點(diǎn)擊 Go To Expres 跳轉(zhuǎn)到地址 00401000這時(shí),反匯編窗口中會顯示出地址 00401000 以后的程序邏輯。這些程序邏輯對應(yīng)的匯編代碼如下。004010000040100100401003004010080040100D 0040101200401014004010170040101C004010220040102300401025/$

51、|.|.|.|.558BECPUSH EBPMOV MOVEBP,ESP EAX,2004B8 E8 A104200000D3080000 00304000CALL wsample0._chkstkPTR DS: security_MOVEAX,DWORD|.|.|.|.|.|.|.33C58945 FC68 00100000XOR MOVEAX,EBP DWORD PTRSS:EBP-4,EAXPUSH 10008D85 FCD506A 00FFLEAEAX,DWORDPTR SS:EBP-2004PUSH PUSH CALLEAX ; |PathBuffer0; |hModule = NU

52、LLFF15 04204000DWORD PTRDS:0040102B00401031004010320040103400401036004010380040103A|.|.|.|.|.|.|.8D8D FCE51FFLEAECX,DWORD PTR SS:EBP-1004PUSH PUSH PUSH PUSH PUSH CALLECX 0070DWORD PTR6A6A6A6A00000700FF15 B4204000DS:00401040004010450040104B0040104C00401052004010540040105A0040105B004010610040106200401

53、068|.|.|.|.|.|.|.|.|.|.|.68 14214000PUSHOFFSET wsample01b.exe8D9552FF15FCEFFLEAEDX,DWORD PTR SS:EBP-1004PUSH CALL PUSHEDX ; |ConcatString DWORD PTR DS:082040006A 000; /FailIfExists = FALSE8D85508D8D51FF15 8B4DFCEFFLEAEAX,DWORD PTR SS:EBP-1004PUSH EAX ; |NewFileNameFCDFFLEAECX,DWORD PTR SS:EBP-2004PU

54、SH ECX ; |ExistingFileName CALL DWORD PTR DS: FC MOV ECX,DWORD PTR SS:EBP-4002040000040106B0040106D0040106F004010740040107600401077|.|.|.|.|.33CD33C0E8 2F000000 8BE55D C3XOR ECX,EBP XOR EAX,EAXCALL wsample0. security_check_ MOV ESP,EBPPOP EBP RETN也許你會問:“我看不懂這些匯編代碼,是不是沒辦法繼續(xù)分析了呢?”其實(shí)看不懂匯編并沒有大礙,分析的目標(biāo)是搞清

55、楚程序到底干了什么,和實(shí)際的編程是不同的。不需要完全理解所有的邏輯,只要能看出個(gè)大概就可以了。1.3.4對反匯編代碼進(jìn)行分析00401000現(xiàn)在讓來仔細(xì)看看之后的程序邏輯。發(fā)現(xiàn)程序依次調(diào)用了GetModuleFileNameW、SHGetFoldathW、lstrcatW、CopyFileW 這幾個(gè)函數(shù)?;叵胍幌?,剛才用 Pros Monitor 已經(jīng)發(fā)現(xiàn)程序會向“啟動”文件夾文件,可以推測“上面的 CopyFileW 函數(shù)就是用來執(zhí)行這一操作的”。你看,即便看不懂匯編代碼,只要能大概推測出程序的邏輯就行了。那么,的推測是否正確呢?可以通過單步運(yùn)行功能來確認(rèn)一下。首先選中地址 00401000

56、 所在的行,然后按 F2 鍵,或者單擊右鍵從菜單中選擇 BreakpoToggle。這時(shí),地址 00401000 的背景會變成紅色,這說明了一個(gè)斷點(diǎn)。已經(jīng)在 00401000 的位置設(shè)置接下來按下 F9鍵,或者在窗口上方菜單中點(diǎn)擊 DebugRun。這時(shí),OllyDbg會啟動wsample01b.exe,當(dāng)?shù)竭_(dá)斷點(diǎn)所在的 00401000 位置時(shí),程序會暫停運(yùn)行。 程序在 00401000 的斷點(diǎn)處暫停運(yùn)行接下來,可以通過單步運(yùn)行,逐條運(yùn)行程序中的指令。按 F7 表示單步跳入,按 F8 表示單步跳出。由于不需要進(jìn)入 GetModuleFileNameW 和 SHGetFoldathW 函數(shù)的內(nèi)

57、部,因按 F8。此在這里隨著每次按下F8,程序都會執(zhí)行一條指令,同時(shí)右上方的寄存器窗口和右下方的棧窗口的內(nèi)容也會發(fā)生變化。讓程序一直運(yùn)行到 00401062 的地方,也就是調(diào)用 CopyFileW 之前的位置。這時(shí),現(xiàn)在通過寄存器窗口和棧窗口,可以看到要的文件源路徑和目標(biāo)路徑。由于現(xiàn)在 CopyFileW 還沒有被調(diào)用,因此在“啟動”文件夾中還沒有文件。這時(shí)如果再次按下 F8 鍵,程序就會調(diào)用 CopyFileW 函數(shù),現(xiàn)在再看一下“啟動”文件夾,中已經(jīng)出現(xiàn)了 wsample01b.exe 文件。就會發(fā)現(xiàn)其通過使用調(diào)試器,可以逐一運(yùn)行程序中的指令,從而搞清楚在哪個(gè)時(shí)間點(diǎn)執(zhí)行了怎樣的操作,這是動

58、態(tài)分析的一個(gè)優(yōu)點(diǎn)。專欄:寄存器寄存器是位于 CPU內(nèi)部的空間,每個(gè)寄存器都有自己的名字,分別叫作 EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI、EIP。這些寄存器都有各自的用途。例如 ESP 和 EBP 用于管理?xiàng)?,而指令。EIP 則指向當(dāng)前執(zhí)行的OllyDbg 右上方的寄存器窗口中會顯示當(dāng)前所有寄存器的值。 OllyDbg 的寄存器窗口在 OllyDbg 中按下 F8 或者 F7,程序就會執(zhí)行一條指令,這時(shí)如果可以看到EIP 的值會根據(jù)所執(zhí)行指令的長度不斷增加。在 EIP 的下方還有 C、P、A、Z、S、T、D、O 這幾個(gè)字母,它們代表標(biāo)志。一般會在這些字母后面加上一個(gè)字母

59、 F(Flag 的首字母),寫作 CF、PF、AF、ZF,這些標(biāo)志主要用于條件分支,比如下面這樣。若 ZF為1 則跳轉(zhuǎn)若 CF 為 1 則不跳轉(zhuǎn)基本上只要理解了 EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI、EIP 以及各個(gè)標(biāo)志寄存器的作用,就可以進(jìn)行分析了。除此之外畫面上還會顯示其他一些寄存器的值,關(guān)于這些寄存器,等上手一些之后再去了解也不遲。1.3.5將分析結(jié)果與源代碼進(jìn)行比較照例會列出 wsample01b.exe 的源代碼,大家可以將自己分析的結(jié)果以及頭腦中設(shè)最后,想的程序邏輯與源代碼進(jìn)行比較。 wsample01b.cpp#include #include #inc

60、ludecpy(void)/ 獲取自身文件路徑TCHAR szThis2048;GetModuleFileNa/ 獲取“啟動”文件夾路徑LL, szThis, sizeof(szThis);TCHAR szStartup2048;SHGetFoldath(NULL, CSIDL_STARTUP, NULL, SHGFP_TYPE_CURRENT, szStartup);lstrcat(szStartup, _T(wsample01b.exe);/ 將自身到“啟動”文件夾CopyFile(szThis, szStartup, FALSE); return 0;APIENTRY _tWain(HI

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論