学习周期:
我们把学习划分为十一个阶段。首先来看下学完这十一个阶段花费的时间,也就是学习周期。
自学模式:阶段一到阶段十应计划1年时间;阶段十一应计划1年时间,共2年时间
培训模式:如果参加一些系统的优质的培训可少走弯路,可以将学习周期缩减为1年时间
注意:在看书学习的时候,要习惯性的打开VC,经常实践书中的理论和例子。一些重要的代码在理解了之后应该再背着写一遍(注意:不是照着抄),加深印象,当背着写不出来的时候,再回头看看书中的代码。要明白,书看懂了,离会写代码还有一段距离,在写代码的时候还会遇到很多问题。遇到问题不要怕,解决了,才是学会了。
阶段一,C语言学习
要进入IT行业,做码农,首先就得精通一两门计算机编程语言。就好比你想成为一个伟大的作家,首先也得会一两门人类语言一样。否则,你即使能力再大,想法再多,也是无法实现的。计算机编程语言,是人类与计算机交流的主要途径。正是程序员通过编程语言,让计算机完成相应的任务。
作为程序员的入门编程语言,我们推荐选择C语言。曾经就职于Amazon和Google的卓越程序员Steve Yegge在他的文章《几种编程语言的优缺点》以及《程序员的呐喊》中指出“你必须懂C”,因为C最懂冯诺依曼计算机,而冯诺依曼计算机是当今计算机的架构标准。
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语言。
但是C语言的学习有一定的难度,这使得一些初学者望而生畏,学到中途就半途而废。某些高校为了减轻大家的学习负担,也放弃将C语言作为编程入门的教学语言,而选择更容易的语言比如Java作为编程语言。但是,只要坚持学习,C语言是可以学会的。而且只要把C语言掌握了,学习其它语言,就变得非常容易。事实上,很多优秀的程序员只懂C和汇编。
在C语言学习过程中,需要重点掌握的地方包括:
-
l 整数编码与存储;
-
l 二进制,八进制,十六进制与转换;
-
l 变量的类型,作用域,存储空间,生命周期;
-
l 字符串的定义以及常见操作;
-
l 函数的传参:传值,传指针,(传引用);
-
l 函数的调用约定:cdecl,stdcall,fastcall,nakedcall,(thiscall);
-
l 指针,指针定义,*与&,指针加减运算,指针与数组关系,常量指针与指针常量,数组指针与指针数组,函数指针与指针函数,二级指针;
-
l 内存布局,分配与泄漏;
-
l 结构体,自然对齐与sizeof计算大小,结构体赋值(浅拷贝,深拷贝);
-
l 位运算与应用
-
l 学会调试工具的使用
-
入门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安全软件漏洞分析技术》