Rootkits,黑客之顛!內(nèi)核方向應(yīng)該怎么學(xué)?
大家好,我是周杰倫。
繼續(xù)咱們的三個(gè)月入門(mén)系列文章,上次的三個(gè)月入門(mén)Web安全發(fā)布后,有讀者留言讓我寫(xiě)一寫(xiě)內(nèi)核方面的,今天就來(lái)了。
不過(guò)學(xué)習(xí)內(nèi)核方向,需要的基本功確實(shí)有點(diǎn)多,梳理發(fā)現(xiàn)再怎么著壓縮,三個(gè)月時(shí)間還是不夠,最后壓縮到了四個(gè)月。

內(nèi)核方向可能不如Web安全那么讓人熟知,搞安全的學(xué)習(xí)內(nèi)核干什么?
安全領(lǐng)域中,主要有這幾個(gè)方向會(huì)需要學(xué)習(xí)內(nèi)核技術(shù):
1、Rootkit開(kāi)發(fā),開(kāi)發(fā)內(nèi)核級(jí)病毒木馬程序
2、內(nèi)核安全開(kāi)發(fā),比如ARK開(kāi)發(fā)、安全軟件開(kāi)發(fā),數(shù)據(jù)防泄漏、透明加解密等
3、內(nèi)核漏洞攻擊技術(shù),Kernel Exploit
因?yàn)樵诎踩I(lǐng)域研究?jī)?nèi)核技術(shù)主要是Windows比較多,所以本文講述路線僅適用于Windows操作系統(tǒng)。
廢話不多說(shuō),上學(xué)習(xí)路線!先來(lái)一個(gè)總覽:
第一個(gè)月
計(jì)算機(jī)系統(tǒng)基礎(chǔ)
C語(yǔ)言編程一
C語(yǔ)言編程二
系統(tǒng)編程初探
第二個(gè)月
x86匯編基礎(chǔ)
軟件調(diào)試技術(shù)
逆向分析技術(shù)
HOOK技術(shù)
第三個(gè)月
系統(tǒng)編程深入
x86內(nèi)核基礎(chǔ)、內(nèi)存管理
Windows進(jìn)程與線程知識(shí)
系統(tǒng)調(diào)用、中斷與異常
第四個(gè)月
驅(qū)動(dòng)開(kāi)發(fā)入門(mén)
ARK工具使用
內(nèi)核編程
Rootkit技術(shù)
第一個(gè)月:C語(yǔ)言基礎(chǔ)
第一個(gè)月,主要是通過(guò)學(xué)習(xí)C語(yǔ)言編程來(lái)掌握一些計(jì)算機(jī)的基礎(chǔ)知識(shí)。
第一周
:計(jì)算機(jī)系統(tǒng)基礎(chǔ)
新手小白一開(kāi)始先從計(jì)算機(jī)基本概念學(xué)起,計(jì)算機(jī)的基礎(chǔ)架構(gòu)模型,馮諾伊曼體系是什么,CPU的基本工作原理,了解操作系統(tǒng)的基礎(chǔ)概念,編程是怎么一回事。
第一周的工作主要是掃盲,了解計(jì)算機(jī)系統(tǒng)的一些基礎(chǔ)名詞和概念,可以不用掌握的非常深,但腦子里要有一個(gè)初步的印象。
第二周
:C語(yǔ)言基礎(chǔ)一
第二周開(kāi)始來(lái)進(jìn)入C語(yǔ)言的學(xué)習(xí),現(xiàn)代主流操作系統(tǒng)基本都是使用C語(yǔ)言開(kāi)發(fā),系統(tǒng)編程也基本使用C語(yǔ)言,學(xué)習(xí)C語(yǔ)言對(duì)未來(lái)學(xué)習(xí)操作系統(tǒng)和內(nèi)核知識(shí)是必須的基礎(chǔ)。
這一周,主要掌握一些基本的語(yǔ)法,main函數(shù)、輸入輸出、基礎(chǔ)數(shù)據(jù)類型、基本運(yùn)算符、分支判斷、循環(huán)、數(shù)組,宏···能編寫(xiě)一些簡(jiǎn)單的程序。
第三周:C語(yǔ)言基礎(chǔ)二
這一周,還是學(xué)習(xí)C語(yǔ)言,因?yàn)镃語(yǔ)言實(shí)在太重要了,一周時(shí)間根本不夠。相比上一周,這一周會(huì)學(xué)的更深入一些。重點(diǎn)掌握函數(shù)、指針、結(jié)構(gòu)體、聯(lián)合體、位域、sizeof、typedef、malloc/free這些知識(shí)。
學(xué)習(xí)的時(shí)候不要光看書(shū),一定要每一個(gè)知識(shí)點(diǎn)在編譯器里動(dòng)手寫(xiě)代碼去實(shí)踐,反復(fù)練習(xí)加深鞏固對(duì)知識(shí)點(diǎn)的理解。
同時(shí)在這個(gè)階段,學(xué)習(xí)使用編譯器(Visual Studio、Clion等)自帶的調(diào)試工具進(jìn)行代碼調(diào)試,學(xué)習(xí)打斷點(diǎn)、查看變量、單步執(zhí)行等基礎(chǔ)操作。
第四周
:系統(tǒng)編程初探
有了一定的C語(yǔ)言編程功底,是時(shí)候來(lái)學(xué)習(xí)一些跟操作系統(tǒng)相關(guān)的編程,在這個(gè)過(guò)程中接觸一些操作系統(tǒng)相關(guān)的知識(shí)。
比如文件操作、多進(jìn)程、多線程、堆內(nèi)存分配與釋放,了解Windows 32位平臺(tái)上進(jìn)程模型,內(nèi)存地址空間格局,進(jìn)程里有哪些內(nèi)容等。
第二個(gè)月:二進(jìn)制分析基礎(chǔ)
第二個(gè)月,學(xué)習(xí)一些二進(jìn)制安全的基礎(chǔ),這一些東西,做漏洞、破解PWN、內(nèi)核都需要掌握。
第五周
:x86匯編基礎(chǔ)
這一周,開(kāi)始來(lái)學(xué)習(xí)x86匯編語(yǔ)言,做內(nèi)核安全,經(jīng)常會(huì)進(jìn)行逆向分析、HOOK掛鉤等操作,所以需要具備一定的匯編語(yǔ)言功底??梢詮?6位匯編開(kāi)始,了解CPU有哪些寄存器,每個(gè)寄存器是做什么的,了解內(nèi)存分段機(jī)制等。
學(xué)習(xí)基本的常用指令語(yǔ)法:mov、add、sub、push、pop、call、ret、jmp、je/jle/jbe、xor、mul、div、nop···
有了16位的基礎(chǔ),拓展了解32位下的區(qū)別,寄存器的變化。
第六周
:軟件調(diào)試技術(shù)
前面在學(xué)習(xí)C語(yǔ)言編程等時(shí)候,學(xué)習(xí)過(guò)使用編譯器自帶的調(diào)試器進(jìn)行簡(jiǎn)單的調(diào)試,在這一周,咱們?cè)賮?lái)系統(tǒng)的學(xué)習(xí)一下在匯編層面進(jìn)行調(diào)試。
在VisualStudio中調(diào)試的時(shí)候,除了源碼調(diào)試,還可以打開(kāi)匯編窗口查看匯編指令,而且最關(guān)鍵的是,VS將每一行C語(yǔ)句都和匯編指令對(duì)照起來(lái)了,非常方便我們的學(xué)習(xí)。
除了在VS中學(xué)習(xí)調(diào)試,這一周主要學(xué)習(xí)OllyDbg、WinDbg兩款調(diào)試工具的使用,有了匯編語(yǔ)言的基礎(chǔ)和在VS中調(diào)試的經(jīng)歷,學(xué)習(xí)這兩款調(diào)試工具應(yīng)該會(huì)輕松不少。

學(xué)習(xí)調(diào)試函數(shù)調(diào)用過(guò)程,分析函數(shù)調(diào)用過(guò)程中涉及到的傳參、跳轉(zhuǎn)、返回地址、堆棧變化,理解函數(shù)調(diào)用在底層的過(guò)程,了解線程的棧里面都有哪些東西。
第七周
:逆向分析技術(shù)
有了匯編語(yǔ)言和操作系統(tǒng)的一些基礎(chǔ)知識(shí),現(xiàn)在可以正式的來(lái)接觸逆向分析技術(shù)了。
首先了解高級(jí)語(yǔ)言編譯成可執(zhí)行文件的過(guò)程,然后學(xué)習(xí)PE文件格式。
之后學(xué)習(xí)反編譯工具IDA,學(xué)習(xí)IDA的一些基礎(chǔ)操作,查找字符串、查找函數(shù)、圖形模式和非圖形模式的使用、反編譯成高級(jí)語(yǔ)言F5功能等。

第八周
:HOOK技術(shù)
這一周學(xué)習(xí)HOOK技術(shù),HOOK技術(shù)是搞二進(jìn)制安全和內(nèi)核技術(shù)方向的基本功。
學(xué)習(xí)常見(jiàn)的HOOK技術(shù)原理,并編程實(shí)踐:inline HOOK、IAT HOOK、Windows消息HOOK。
第三個(gè)月:Windows內(nèi)核入門(mén)
進(jìn)入第三個(gè)月,開(kāi)始全面接觸Windows平臺(tái)系統(tǒng)編程的這一套東西,為進(jìn)一步學(xué)習(xí)內(nèi)核打前站。
第九周
:系統(tǒng)編程深入
學(xué)習(xí)Win32編程,掌握DLL編寫(xiě)、文件讀寫(xiě)、文件遍歷、進(jìn)程遍歷、線程遍歷、模塊遍歷、遠(yuǎn)程線程注入等基礎(chǔ)操作。
通過(guò)這些編程,熟悉Windows上進(jìn)程、線程、模塊、句柄等基礎(chǔ)概念,了解kernel32.dll、user32.dll、ntdll.dll這些文件是做什么的。
學(xué)習(xí)使用工具:ProcMon監(jiān)控進(jìn)程行為。
第十周
:x86內(nèi)核基礎(chǔ)、內(nèi)存管理
這一周開(kāi)始接觸內(nèi)核的基礎(chǔ)知識(shí),從x86的特權(quán)級(jí)別和內(nèi)存管理方式入手,了解現(xiàn)代操作系統(tǒng)和CPU管理內(nèi)存的底層原理。
學(xué)習(xí)x86平臺(tái)特權(quán)級(jí)Ring0-Ring3模型,了解分段式內(nèi)存管理機(jī)制、分頁(yè)式內(nèi)存管理機(jī)制,虛擬內(nèi)存原理。
第十一周
:Windows進(jìn)程與線程知識(shí)
這一周,學(xué)習(xí)Windows內(nèi)核中管理進(jìn)程和線程的知識(shí),學(xué)習(xí)進(jìn)程和線程的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)EPROCESS、ETHREAD、PEB。
重點(diǎn)學(xué)習(xí):Windows創(chuàng)建一個(gè)進(jìn)程的基本過(guò)程,細(xì)節(jié)可以不用深究,但基本流程要知道,有哪些關(guān)鍵的步驟。
這一周完成后,對(duì)一個(gè)進(jìn)程在Windows系統(tǒng)中是一個(gè)怎樣的存在,從應(yīng)用層到內(nèi)核,有一個(gè)基本的認(rèn)識(shí)。
第十二周
:系統(tǒng)調(diào)用、中斷與異常
這一周,重點(diǎn)弄懂系統(tǒng)調(diào)用和中斷與異常兩個(gè)最基本的內(nèi)核概念,弄清楚它們的詳細(xì)過(guò)程,Win32 API進(jìn)入內(nèi)核的路徑和原理,內(nèi)核分發(fā)系統(tǒng)調(diào)用的SSDT、SSDTShadow,分發(fā)中斷的IDT。通過(guò)查看內(nèi)核源碼分析詳細(xì)過(guò)程。
這一個(gè)階段,可以結(jié)合微軟曾經(jīng)開(kāi)源的Windows部分內(nèi)核源碼WRK來(lái)學(xué)習(xí)。
第四個(gè)月:內(nèi)核技術(shù)進(jìn)階
進(jìn)入第四個(gè)月,正式進(jìn)入神秘的內(nèi)核區(qū)域?qū)崙?zhàn)了!
第十三周
:驅(qū)動(dòng)開(kāi)發(fā)入門(mén)
這一周,終于要開(kāi)始正式編寫(xiě)Windows驅(qū)動(dòng)啦!
首先學(xué)習(xí)使用WDK開(kāi)發(fā)Windows內(nèi)核驅(qū)動(dòng)的基本步驟,了解DriverEntry函數(shù)、DriverObject、DeviceObject、SymbolLink、IRP這些基本概念。
然后學(xué)習(xí)驅(qū)動(dòng)安裝加載和卸載,同時(shí)學(xué)會(huì)使用工具加載和自己編程加載。
同時(shí),學(xué)習(xí)內(nèi)核日志輸出,使用DebugView查看驅(qū)動(dòng)輸出的日志。
最后,掌握VirtualKD + VMware進(jìn)行虛擬機(jī)內(nèi)核調(diào)試,學(xué)會(huì)調(diào)試自己的驅(qū)動(dòng)程序。
第十四周
:ARK工具使用
這一周來(lái)學(xué)習(xí)一下ARK工具的使用,如PChunter,學(xué)習(xí)使用這些工具查看內(nèi)核中的進(jìn)程、驅(qū)動(dòng)、系統(tǒng)調(diào)用表、內(nèi)核鉤子、應(yīng)用層鉤子等信息,并對(duì)前幾周學(xué)習(xí)的內(nèi)核知識(shí)進(jìn)行復(fù)習(xí)鞏固。

第十五周
:內(nèi)核編程
這一周繼續(xù)來(lái)深入學(xué)習(xí)內(nèi)核編程,掌握使用DeviceIoCtrol與內(nèi)核通信的編程,掌握內(nèi)核中內(nèi)存分配與釋放。
學(xué)習(xí)內(nèi)核的一些基本過(guò)濾框架和回調(diào)通知(進(jìn)程、線程、模塊、注冊(cè)表等),實(shí)現(xiàn)一些安全防御功能(如進(jìn)程保護(hù)、文件保護(hù)、注冊(cè)表防護(hù))。
第十六周
:Rootkit技術(shù)
這一周,主要來(lái)學(xué)習(xí)一些Rootkit經(jīng)常用到的技術(shù):文件隱藏、進(jìn)程隱藏等。
學(xué)習(xí)內(nèi)核中一些關(guān)鍵數(shù)據(jù)結(jié)構(gòu):比如SSDT、IDT、GDT、全局進(jìn)程列表、全局驅(qū)動(dòng)模塊列表、關(guān)機(jī)回調(diào)等,編程操作對(duì)這些數(shù)據(jù)結(jié)構(gòu)進(jìn)行操作(HOOK、Patch、斷鏈等),通過(guò)修改內(nèi)核數(shù)據(jù)結(jié)構(gòu),達(dá)到隱藏、回寫(xiě)等功能。
最后,再學(xué)習(xí)了解下64位下內(nèi)核技術(shù)的一些區(qū)別,學(xué)習(xí)了解PatchGuard。
推薦學(xué)習(xí)資料
1、《windows核心編程》

2、《深入解析Windows操作系統(tǒng)》

3、《天書(shū)夜讀:從匯編語(yǔ)言到Windows內(nèi)核編程》

4、《寒江獨(dú)釣 windows內(nèi)核安全編程》

5、《Rootkits--Windows內(nèi)核的安全防護(hù)》

總結(jié)
以上就是四個(gè)月入門(mén)內(nèi)核安全的學(xué)習(xí)路線了,需要說(shuō)明的是,四個(gè)月的時(shí)間可能還是不太夠,很多東西只能學(xué)個(gè)皮毛,但足夠大家摸到這個(gè)門(mén)檻了。
大家在學(xué)習(xí)的時(shí)候,可以結(jié)合自己的實(shí)際情況進(jìn)行縮短和增加學(xué)習(xí)時(shí)間。
比如你對(duì)C語(yǔ)言已經(jīng)有基礎(chǔ)了,就可以跳過(guò)這一部分。又比如你覺(jué)得匯編部分,一周不夠,那就多加一周,適合自己的節(jié)奏就好。
大家對(duì)這份學(xué)習(xí)路線有什么疑問(wèn)都可以在評(píng)論區(qū)告訴我哦。
【W(wǎng)eb安全學(xué)習(xí)】
