底層安全學習路線

學習週期:php

咱們把學習劃分爲十一個階段。首先來看下學完這十一個階段花費的時間,也就是學習週期。
自學模式:階段一到階段十應計劃1年時間;階段十一應計劃1年時間,共2年時間
培訓模式:若是參加一些系統的優質的培訓可少走彎路,能夠將學習週期縮減爲1年時間

注意:在看書學習的時候,要習慣性的打開VC,常常實踐書中的理論和例子。一些重要的代碼在理解了以後應該再揹着寫一遍(注意:不是照着抄),加深印象,當揹着寫不出來的時候,再回頭看看書中的代碼。要明白,書看懂了,離會寫代碼還有一段距離,在寫代碼的時候還會遇到不少問題。遇到問題不要怕,解決了,纔是學會了。html

階段一,C語言學習

要進入IT行業,作碼農,首先就得精通一兩門計算機編程語言。就比如你想成爲一個偉大的做家,首先也得會一兩門人類語言同樣。不然,你即便能力再大,想法再多,也是沒法實現的。計算機編程語言,是人類與計算機交流的主要途徑。正是程序員經過編程語言,讓計算機完成相應的任務。python

 

做爲程序員的入門編程語言,咱們推薦選擇C語言。曾經就任於Amazon和Google的卓越程序員Steve Yegge在他的文章《幾種編程語言的優缺點》以及《程序員的吶喊》中指出「你必須懂C」,由於C最懂馮諾依曼計算機,而馮諾依曼計算機是當今計算機的架構標準。mysql

 

C語言是一門很好很實用的入門編程語言。C語言運行效率高,它是作底層和安全開發的必備語言。不少低效率的編程語言,也提供了訪問C語言庫的接口,就是由於C語言的執行效率高。時至今日,絕大多數的底層軟件,包括操做系統(如Windows, Linux, UNIX等),數據庫軟件(如MySQL),辦公軟件(如OpenOffice),殺毒軟件,網絡通訊協議,包括JAVA語言的實現,互聯網,以及各類內核驅動等都是用C語言開發的。C語言做爲編程語言之王,是當之無愧的。截止2016年9月,C語言在TIOBE(http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html)編程語言使用排行榜上依然佔據TOP2的位置,僅次於排名第一的Java語言。linux

 

可是C語言的學習有必定的難度,這使得一些初學者望而生畏,學到中途就半途而廢。某些高校爲了減輕你們的學習負擔,也放棄將C語言做爲編程入門的教學語言,而選擇更容易的語言好比Java做爲編程語言。可是,只要堅持學習,C語言是能夠學會的。並且只要把C語言掌握了,學習其它語言,就變得很是容易。事實上,不少優秀的程序員只懂C和彙編。程序員

 

在C語言學習過程當中,須要重點掌握的地方包括:redis

  1. l         整數編碼與存儲;算法

  2. l         二進制,八進制,十六進制與轉換;sql

  3. l         變量的類型,做用域,存儲空間,生命週期;數據庫

  4. l         字符串的定義以及常見操做;

  5. l         函數的傳參:傳值,傳指針,(傳引用);

  6. l         函數的調用約定:cdecl,stdcall,fastcall,nakedcall,(thiscall);

  7. l         指針,指針定義,*與&,指針加減運算,指針與數組關係,常量指針與指針常量,數組指針與指針數組,函數指針與指針函數,二級指針;

  8. l         內存佈局,分配與泄漏;

  9. l         結構體,天然對齊與sizeof計算大小,結構體賦值(淺拷貝,深拷貝);

  10. l         位運算與應用

  11. l         學會調試工具的使用

  12.  

入門C以後,須要進一步學習的書籍包括《高質量C/C++編程》--林銳博士,《C語言編程精粹》--姜靜波

階段二,數據結構學習

數據結構是算法的基礎。算法又是程序的核心。因此,學完C語言後,應該當即學習數據結構。數據結構包含:字符串,數組,鏈表,堆棧,隊列,二叉樹,排序,查找,HASH表等等,這些都要牢固掌握。

 

數據結構教材推薦使用清華嚴蔚敏老師的《數據結構(C語言版)》教材。除了嚴蔚敏的教材,還推薦一本李春葆老師的《數據結構習題與解析》 李春葆 C語言版。這兩本書結合看效果最好。此外,也一樣能夠參考麥洛克菲官網入門專區的《數據結構》部分。

 

數據結構是程序設計中的關鍵。所以咱們必定要多花精力把數據結構學好,打下牢固的基礎。不能急於求成,數據結構都沒學好,就想用VC等開發工具,寫一個不錯的軟件出來,固然這也是不可能的。

 

數據結構中須要重點掌握的包括:

l         鏈表常規操做:建立,遍歷,查找,插入,修改,刪除

l         隊列:先進先出,出隊,入隊,隊空判斷,鏈隊與數組隊列實現

l         棧:後進先出,堆棧,入棧,棧空判斷,鏈棧和數組棧實現

l         樹:二叉樹定義,遍歷(先序,中序,後序),二叉排序樹,平衡二叉樹

l         排序:插入(希爾排序),選擇(堆排序),交換排序(冒泡排序,快速排序)思想,實現與複雜度

l         查找:折半查找,hash查找,平衡二叉樹查找

 

階段三,彙編語言學習

彙編是一門頗有價值的課程。在調試程序,逆向和漏洞挖掘等方面都會涉及到彙編知識。有了程序設計和C語言的基礎,咱們能夠緊接着學習彙編語言。與C語言相比,彙編語言顯得晦澀難懂。彙編語言包括各類各樣的寄存器,內存地址,尋址方法,8086的經常使用匯編指令,再加上一些僞操做,還有 DOS和BIOS中斷的調用。有了這些概念和彙編基礎,咱們就能夠看懂書上的彙編程序了。到此,你應該會對計算機的理解更深一層。學好彙編語言,對於理解計算機程序執行的底層機制,以及之後程序調試和分析,都有很大的幫助。推薦彙編學習書籍:《彙編語言》--王爽,《天書夜讀》--邵堅磊。

 

彙編語言學習重點

1,CPU與寄存器(X86,X64)

2,彙編指令集

  • (1)CISC VS RISC

  • (2)傳送指令:Mov/lea/push/pop

  • (3)算術指令

  • (4)邏輯指令

  • (5)串操做指令

  • (6)控制轉移指令

  • (7)處理機控制指令

  • (8)指令機器碼

3,C語句、函數調用的彙編分析

(1)循環語句(for,while,do-while)與彙編

(2)條件語句與彙編

(3)數組訪問與彙編

(4)結構體訪問與彙編

(5)結構體數組與彙編

(6)cdecl調用匯編

(7)stdcall調用匯編

(8)fastcall調用匯編

 

階段四,C++與面向對象

C是面向過程語言,C++是面嚮對象語言。一個程序員,是須要掌握面向對象的思想的。以把大象裝入冰箱爲例子,雖然一樣是爲了解決問題,在面向過程的程序員眼裏,須要分爲3步,第一步打開冰箱,第二步把大象放進冰箱,第三步關上冰箱門,而後每一步實現一個函數;可是在面向對象程序員眼裏,首先是分析解決問題中各類不一樣的對象,這裏涉及的對象有3個:人,冰箱,和大象。而後再分析各個對象的屬性和行爲以及它們之間的關係。

 

找本C++上手的書(推薦《C++ Primer》),用一個月的時間去了解C++和麪向對象語言程序設計思想,包括數據的封裝,關係的繼承,和多態等。C++的推薦書籍包括:《C++Primer》,《Effective C++》,《Thinking in C++》,《More Effective C++》。

 

C++重點學習內容:

l         封裝

l         繼承

l         多態

l         STL模板庫

 

階段五,多線程與進程通訊

如今大多數程序,爲了提升本身任務的併發,都使用了多線程。在多線程環境裏,程序爲了保證全局資源的一致性,而提供了各類同步與互斥機制。

 

多線程與多進程重點學習內容:

l         線程與進程的概念和區別:資源分爲基本單位,調度基本單位

l         事件

l         互斥體

l         信號量

l         臨界區

l         死鎖

l         共享內存

l         管道

 

階段六,網絡協議與編程學習

如今是互聯網時代,而網絡協議是互聯網的基礎協議。所以,必須學會網絡編程。在網絡學習這塊,最重要的就是TCP/IP協議的學習,SOCKET編程的學習。學會如何使用SOCKET進行通訊,傳輸數據。

 

推薦的書籍包括:《TCP/IP 詳解 卷1-2》 W. RICHARD STEVENS 機械工業出版社。

網絡協議學習重點:

l         TCP/IP協議:協議分層,TCP創建鏈接握手,斷開鏈接,UDP協議,IP協議,ARP協議等

l         HTTP協議:GET,POT,PUT,DEL等

l         SOCKET編程:ip/port,socket,accept,recv,send,recvfrom,sendto等

l         服務器端IO通訊模型:好比完成端口模型(IOCP),SELECT模型,以及EPOLL模型等。

 

階段七,數據庫與sql學習

後臺程序通常都須要管理數據,好比註冊的用戶信息,訂單信息等。這些信息通常都是存放在各類數據庫中。所以,咱們有必要系統的學習一下數據庫。數據庫的學習,最重要的就是SQL編程的學習,包括insert,update,delete,select等語句的靈活使用。學習SQL編程能夠結合具體的MySQL數據庫來學習。各個編程語言都提供了訪問數據庫和執行SQL語句的接口。

 

此外,還必須瞭解一些非關係數據庫,好比redis,mecached等。這些數據庫比傳統的關係數據庫有更高的執行效率,通常用來作後臺的優化和性能的提高。

 

SQL的學習推薦網站: http://www.w3school.com.cn/sql/index.asp。書籍:《sql語句用法與講解》

,《MySQL中文參考手冊》等。

 

階段八,界面開發學習

後臺服務器端程序,能夠不用界面。但若是要寫客戶端程序,就必然會涉及到界面的開發。做爲底層程序員,界面開發能夠不精通,但必需要會。界面開發就是要處理各類控件來接受數據的輸入和輸出用做人機交互,好比按鈕,編輯框,單選,多選,列表等等,此外還須要掌握控件的消息處理機制。

 

在WINDOWS平臺能夠學習MS官方的MFC界面庫(對WIN32 SDK的封裝,但開發更容易了),也能夠學習跨平臺的QT界面庫,以及開源的DUILIB庫。Linux中有GTK或者是QT界面庫。固然還包括移動端的Android界面,IOS界面開發等。

 

實際上界面開發的原理都差很少,都是在處理各類控件和消息,因此入門仍是很容易的,掌握了其中一個界面庫,學習新的界面庫也很容易。

 

界面開發推薦書籍:《VC技術內幕》,《深刻淺出MFC》,《瘋狂的Android》等。

 

階段九,Linux與開源項目學習

曾經WINDOWS是一統天下,不可一世的WINTEL聯盟長期佔據IT市場絕對支配地位。可是,時過境遷,隨着LINUX不但完善和發展,尤爲是在Android將Linux選爲底層操做系統以後,Linux系統獲得了極大的普及和發展。如今誰也不敢小覷Linux了。

 

做爲程序員,掌握Linux系統與開發成爲必要,Linux平臺的程序設計與開發是必備技巧。很難想象一個程序員,不懂Linux意味着什麼。

Linux入門書籍推薦:《UNIX環境高級編程第二版》,《Linux程序設計(第四版)》

 

Linux系統學習重點:

l         Linux各類管理命令

l         LINUX文件系統

l         VIM or EMACS

l         GCC

l         GDB

l         LINUX開源項目:lamp/mysql,redis,memcached,curl,json等

 

階段十,其它語言學習

通常來講,程序員應該精通一門語言,熟悉2到3種語言,因此有必須學習一些其它語言。這裏的其它語言包括JAVA Python等。在學好了C語言以後,若是再學習Java,python,php,C#等別的語言,就很是容易了。由於語言都是舉一反三的,拿來就用了,並且C和C++算是語言中最難掌握的,若是都學會了,那麼其它語言都很容易的了。

 

學習了JAVA,就能夠進一步學習移動編程,好比Android應用編程(好比 《瘋狂的Android》)了,而在一開始又學習了MFC的消息映射的思想,學習ANDROID界面編程也應該很容易理解裏面的事件和監聽機制,Android的界面佈局與MFC不同,是經過XML來進行獨立佈局的,這個須要從新理解。從長遠來看,程序員起碼應該掌握:C,C++,Java,Python這幾種語言,是頗有必要的。

 

推薦書籍:《Java語言程序設計-基礎篇》,《Java語言程序設計-進階篇》,《簡明 Python 教程》,《Python學習手冊》

 

階段十一,底層安全學習

在有了C語言基礎以後,咱們就能夠向本身最感興趣和最擅長的領域發展了。對於安全專業來說,能夠分爲以下幾個領域,固然這些領域不是孤立的,而是互相聯繫,相輔相成的。

內核開發

主要分爲Windows內核驅動開發和Linux內核驅動開發。所用語言主要爲C語言,負責爲系統編寫.sys驅動或者.ko驅動。用來完成各類底層監控和管理工做。這是各種安全軟件,主動防護,防火牆,自保護等必須用到的底層技術。

 

Windows平臺內核驅動開發的重點內容爲:

 

l         SSDT,SHADOW SSDT ,INLINE HOOK

l         各類回調框架

l         SFILTER文件過濾

l         MINIFILTER文件過濾

l         DISKPERF磁盤過濾

l         TDI/NDIS/WFP網絡防火牆

l         主動防護HIPS

l         ARK等

 

LINUX內核重點內容包括:

l         內核的編譯與裁剪

l         內核模塊的開發與編譯

l         內核內存分配

l         內核同步與互斥

l         內核中斷上半部與下半部機制

l         內核HOOK與調試

l         基於linux內核的網絡防火牆開發

 

推薦書籍:《Windows Internal》,《Windows 2000設備驅動程序設計指南》,《寒江獨釣:Windows內核安全編程》,《Linux設備驅動程序第三版》,《Linux內核設計與實現第三版》,《Linux設備驅動開發詳解》,《Linux_內核徹底註釋_V11_趙炯》,《深刻分析Linux內核源碼》

逆向技術

逆向技術就是使用反彙編工具,將二進制程序還原成彙編代碼,而後再基於彙編代碼分析整理,獲得程序的算法邏輯,甚至還原出C語言代碼。逆向工具通常都是使用強大的IDA Pro工具。固然,現實中不少程序爲了防止被逆向,會使用一些保護措施,好比加殼加花指令等。注意,逆向技術與開發技術是相輔相成的。而且學習逆向技術,必須以開發技術爲前提。若是開發技術都沒有掌握好,甚至想繞過開發技術的學習,直接學習逆向技術,早晚會讓你付出代價。你們能夠關注下全部招聘逆向工做的帖子裏,都會對開發能力提出明確要求,要求熟練掌握C和相關平臺的開發技術。


推薦書籍:《The IDA Pro Book》

移動安全

隨着移動互聯網的普及,移動安全問題愈來愈突出,尤爲是開放平臺Android系統,面臨着日益突出和嚴重的安全問題,針對手機安全的威脅層出不窮。所以,移動安全是將來必須重點面對的技術領域。

推薦學習書籍:《Android軟件安全與逆向分析》

移動安全學習的重要內容:

l         NDK編程

l         SMALI語言

l         ARM彙編

l         HOOK

l         ROOT

l         動態調試

 

漏洞挖掘

漏洞分析與挖掘是系統安全的一個重要分支。每當IT界有重大漏洞曝出,都讓人心驚膽戰,更況且還有不少黑客手握0Day而還沒有曝光的各類漏洞,利用這些未公開的漏洞,能夠隨時入侵用戶的計算機,竊取各類機密數據。

漏洞挖掘重要內容:

l         緩衝區溢出漏洞:棧溢出,堆溢出

l         任意地址寫入任意數據攻擊

l         XSS攻擊

l         SQL注入攻擊

l         競爭條件漏洞攻擊

l         PATH攻擊等

l         FUZZ測試

l         操做系統安全機制:Security cookie, SAFE SHE ,DEP, ASLR, SEHOP, Safe Unlink等

l         安全編碼

 

相關書籍推薦:《0day安全軟件漏洞分析技術》

相關文章
相關標籤/搜索