首先,向小姐姐致敬~
然后,拜一下祖師爺~
重要聲明
本培訓中提到的技術僅適用于合法CTF比賽和獲得合法授權的滲透測試,請勿用于其他非法用途,如有違反,與本文作者無關。
逆向工程定義
逆向工程(reverse engineering),也稱為反向工程,是一種技術過程,通過對目標產品進行逆向分析和研究,從而推斷出其處理流程、組織結構、功能性能規格等設計要素,以制作出功能相近但不完全相同的產品。
逆向工程起源于商業及軍事領域的硬件分析,其主要目的是在無法輕易獲得必要的生產信息的情況下,直接從成品分析中推導出產品的設計原理。
雖然逆向工程可能會被誤認為是對知識產權的嚴重侵害,但在實際應用中,它反而可能保護知識產權所有者。例如,在集成電路領域,如果懷疑某公司侵犯知識產權,可以使用逆向工程技術來尋找證據。
為什么要進行逆向工程呢?原因包括分析惡意代碼、了解軟件的技術細節、破解收費軟件(嘿嘿)、加固軟件安全(與滲透測試類似)、漏洞分析等。
逆向工程必備技能
- 必須熟練掌握各基礎匯編指令,能夠理解普通的匯編代碼。
首先說一下第一點,這應該不需要多解釋吧,逆向工程如果不懂匯編怎么進行逆向分析啊哈哈哈。
比如需要知道基本的計算機中棧空間和內存空間是如何存取數據的,EAX、EBX、ECX、EDX、ESI等寄存器的作用。
但這里有一個小問題:怎樣才算熟練掌握各基礎匯編指令呢?
我這里貼一段小小的匯編代碼,如果你能不看下面的解釋,就能明白這段代碼的大概操作,那么恭喜你,你已經熟練掌握了基礎的匯編指令。
第三行是將eax所指向的地址上的數據取出來,賦給edx,最后將edx的值賦到ecx指向的地址上。
可能不是經常做惡意代碼分析的人一看這個代碼就懵了。
現在我們來說說第二點,為什么要熟練使用C語言?剛剛那段匯編代碼,看起來肯定很難理解,我們可以將其轉換成C語言,這樣分析起來就容易多了,尤其是在代碼量極大的時候。
將匯編轉換成等價的C語言代碼,會節省我們很多分析時間(不要跟我說有插件)。
如果你能獨立完成匯編到C語言代碼的轉換,那么說明第二點你也是合格的了~
比如剛剛那段代碼,我們轉換一下看看(我喜歡用Linux的C風格),這里我就不定義各個變量了。
可能這樣寫出來有些同學還是一臉懵逼,這和看匯編差不多啊。
但是在某些逆向分析中,出現的結構體等,用匯編分析就是一連串的地址變地址,如果寫成C語言的形式,看上去就清爽多了。
- 需要了解基本的Win32編程和Linux編程。
比如惡意代碼調用了哪個庫,不需要記住每個Windows的API,但你要知道哪里去查,比如Windows就是MSDN,如果是Linux,就是man。
當然,對于逆向來說,最重要的還是長期堅持不懈的努力和知識的積累。
在逆向的世界里,不管你是Java很6,還是Python很6,只要你是第一次接觸逆向的話,都是一樣的起點,除非你C語言很6,啊哈哈哈。