或许这篇帖子的标题应该叫做如何自学windowsC/C++内核
本帖最后由 最后的戴托纳 于 2021-8-31 20:13 编辑写在前面:
这是一篇从入门到进阶的指南
这篇帖子最终的导向为windows内核岗 其他岗位我的确不太清楚(例如逆向岗) 但是前面几个步骤是完全一致的
其中的书单每一本也是经过群友验证讨论最终得出的 包括顺序也是
---
我见过最多新手问的一个问题就是
"怎么自学C++"
当他自己提出这个问题的时候我觉得他都还没玩明白C++是啥
我还在群里看到过有人提出"C++要在哪下载"这种问题
每当有人提出这种问题的时候 云科学家就开始乱云了 比如上来就推荐某某某视频 或者王爽汇编语言 又或者intel白皮书
我讲道理他可能自己都没看过intel白皮书 只是人家这样推荐 所以就跟着推荐
不止是自学的新手 即便计算机专业在校学生也对我提出过类似的问题 其中不乏211985学生
"我应该看什么书?"
对于计算机软件工程专业的学生来说 学习windows c/c++内核开发同样是需要自学 也就是说起点一样 那么带有同样的疑问也就说得通了
因为我接下来要说的内容太过于劝退 所以提前打一针强心针
对于我们这样一个80人左右的小群来说 群成员已经将国内所有互联网大厂全部覆盖完毕 每一个大厂几乎都能找到一个甚至多个对应的群员
但即便如此 群成员学历不高(比如初中) 但是通过自学学成的人并不算罕见 我本人也是其中之一
任何人在入门的时候都会感到迷茫 因为知识体系还没能完全建立起来 根本不知道何去何从
很多人的情况都是我会写一些功能 但是我不知道这个功能为什么要这样写
比如我会在32位上做内核SSDT 但到x64 SSDT 在有PG的情况下该怎么处理?
知识体系是一步步构建起来的
比如你只学了C语言 想去写windows窗口程序 完全不知道该如何下手 写来写去都还是在那个黑框里面
网上找了一份窗口的代码 抄下来窗口有了 但是如何运转的根本不清楚 这时去学windows api 根本不知道该从何入手 越学越迷茫
最突出的一个表现就是 这些内容不知道从哪里来的 也不知道该从哪里学习到这些内容
这是因为知识根本没有成体系 底层的知识没学 光学了上面 比如很多人学习汇编 看了王爽的汇编语言
看完了还是不懂 比如去看OD IDA里面的反汇编代码 每一句每一条指令 现在都知道是干什么的了
但是当他们组在一起 就不清楚这些汇编语言到底有什么意义了
或者说是 知道mov add sub都是干什么的 但是多出来了这么多指令又是什么 EAX和RAX书上也从没提过 百度虽然有答案 但完全不知道这些东西哪里来的
计算机是很多年的一部发展史 如果不从最底层开始往上爬 光站在上面是没有任何作用的
最后这篇帖子中不会出现任何一个视频 因为不看任何视频只看书一样能做到同样的效果 所以至于对应视频各位就自己寻找吧
第一本 入门书:
编码 CODE [美] Charles Petzold 电子工业出版社
"本书讲述的是计算机工作原理。作者用丰富的想象和清晰的笔墨将看似繁杂的理论阐述得通俗易懂,你丝毫不会感到枯燥和生硬。更重要的是,你会因此而获得对计算机工作原理较深刻的理解。这种理解不是抽象层面上的,而是具有一定深度的。"
这是我当初入门的时候 老板推荐给我的
这是一本任何人入门都能看懂的书
你不需要任何专业知识 这本书能带你快速浏览整个计算机发展历史 同时也能帮助你了解计算机究竟是什么
或许有些人觉得这本书没必要看 但是部分群员还是赞同当做第一本 以及我自己入门 老板也是这样推荐的
第二本 汇编语言:
x86汇编语言:从实模式到保护模式 李忠 王晓波 电子工业出版社
这本就是开始正式迈向内核的起点了
王爽的<汇编语言>我看过无数人推荐了 尼玛2021年了依旧还有人推荐那本书
不是你知道8086到如今的CPU经历了多少年 多少发展史么?推荐那本书的人你自己到底看过没看过啊?
还有一上来就推荐intel 白皮书的
不好意思 麻烦告诉你白皮书你看了多少页?
或者你直接了当的告诉我 你到底看没看过?
讲道理 80+人的群 正儿八经看过白皮书的 可能不超过20个...这还是因为群大佬好多都看过的情况下才有这个比例
第三本 C语言入门:
C语言三剑客:C陷阱与缺陷、C和指针、C专家编程
这一套书是非常有名的 即便是在各种C语言 C++讨论群中也经常能看到推荐
C语言本身并不难 但是这些都是基础中的基础 或许三本没必要全部看完 这个看个人
第四本 C++入门:
C++ Primer[美] Stanley B. Lippman / [美] Josée Lajoie / [美] Barbara E. Moo 电子工业出版社
你想问我只学C不学C++可以么是吧?
这问题我见过N次
统一回复
不行
原因很简单
你去github看看
到底是纯C的代码多 还是C++的代码多
只学C 或者你自己用没关系
但你要用别人代码的时候怎么办?
当然也不是没有某些奇葩群员根本不懂C++的情况出现
一搞去github看不懂了 就问在不在?有空没 帮忙把C++翻译成C语言...
这个奇葩群员在52还算的上知名 是谁我就不点名了...
第五本 计算机操作系统入门:
深入理解计算机系统 Randal E.Bryant / David O'Hallaron 机械工业出版社
别说写内核的 搞逆向的要看
隔壁写JAVA 搞.net的都得看这本书...
随便找个编程群问 必有这本书的推荐
第六本 自制操作系统:
操作系统真象还原 郑钢 人民邮电出版社
不好意思这本我也没看过 来自群大佬的推荐
不知道各位有没有听说过公司招聘 要基础好的
或者说什么大公司都看中基础
OK以上这六本就是所谓大公司最看重的基础了
群里正儿八经自己动手写过操作系统的不多
但是如果能写下来 后面的东西如履平地
第七本 windows入门:
Windows核心编程Jeffrey Richter / Christophe Nasarre 清华大学出版社
到这里终于开始进入windows操作系统了
一般来说 走到这一步所需要的时间全部用来学什么易语言的话 估计这个时候已经有所谓大手子(半吊子)的水平了
不用慌 反超的机会在后面
第八本 深入windows系统相关:
深入解析Windows操作系统 (美)罗斯(Russinovich,M.E.) / (美)所罗门(Solomon,D.A.)电子工业出版社
Windows Sysinternals实战指南 Mark,Russinovich(马克·拉西诺维),Aaron,Margosis(艾伦·马格西斯) 人民邮电出版社
这两本完工以后 你会对在整个windows平台上开发任何东西都有深入的了解
这个时候再回头做点什么东西的时候 视角完全不同
第九本 逆向相关入门:
C++反汇编与逆向分析技术揭秘钱林松 / 赵海旭 机械工业出版社华章公司
ida权威指南 Chris Eagle 人民邮电出版社
windows PE:
Windows PE权威指南 戚利 机械工业出版社华章公司
https://docs.microsoft.com/en-us/windows/win32/debug/pe-format
https://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/Authenticode_PE.docx
写内核绕不开逆向的 不想学的还是放弃吧
其中winpe群友都推荐的是直接去看微软文档
我自己当初是看PE权威指南 所以各取所需吧
第十本 软件调试:
软件调试 张银奎 电子工业出版社
Inside Windows Debugging
学到这里的时候 你翻开这两本书就知道是干嘛的了 虽然书名叫做软件调试 但是内容远远不是教你怎么debug一个软件
其中对windbg调试器的学习尤其重要
顺便一提 如果你想写内核 就别想着用什么OD X64DBG了
我们都知道windbg丑的要死 难用的要死
但为啥我们还是在用windbg?
你没想过这个问题么?
第十一本
windows内核原理与实现 潘爱民 电子工业出版社
Windows Kernel Programming -Pavel Yosifovich -CreateSpace Independent Publishing Platform
windows kernel programming是纯英文的 关于这本书 两位群友找了一下 发现有中文版
(Jev0n: windows kernel programming 貌似有中文翻译版本
(重黎: Windows内核编程
欢迎来到内核的世界
不用怀疑 在你走到这一步的时候 你已经超越了99%的人
即便是某些知名线下培训班 在学期快结束的时候 人数往往与刚开班的人数差距不小
因为在这中途学不下去退出的人太多了
如果你成功走到这一步 那么你几乎已经成为我们当中的一员了
但是接下来也是极其困难的挑战
windows nt内核是上个世纪九十年代的产品
这也就意味着 你需要学习的是上个世纪九十年代一直到今天 由最出色 最顶尖的一小波人所做出的优异设计(或许很多地方并不怎么优异...)
也就是你要学习的是 跨越三十多年而且还在更新迭代的复杂设计
不过好消息是
windows nt到win10可以说是变化巨大 但也可以说是基本没任何变化
还是熟悉的配方
内核最后的挑战:
WRK源代码(xp 2003源代码
看上面两本书的时候需要对照这些代码看
这一步暂时没有完结点 书或许能看完
但是能给整个源代码看完的
的确有 寥寥无几...
一些小建议
在进入内核之前 可以先从学习github如何使用开始
github有一些非常经典的项目可以学习
processhacker
x64dbg
....
其他相关的群友推荐:
Intel 汇编语言程序设计(第五版) Kip R. Irvine (美) 清华大学出版社(个人推荐)
x86/x64体系探索及编程 邓志 电子工业出版社(个人推荐)
(C++ STL)(群友觉得C++都学了 为啥不学STL?)
C++标准库 [德] Nicolai M·Josuttis 电子工业出版社
Boost程序库完全开发指南 罗剑锋 电子工业出版社
C++11/14高级编程 罗剑锋 清华大学出版社
不好意思 我把这本搞忘了
以上提到的这些书我会尽量收集一下放到这个git地址里 直接下载即可 gitee也会做一份镜像仓库 避免github下载缓慢的情况
但是我实体书比较多 电子书比较少 所以需要一点时间去收集
https://github.com/DragonQuestHero/Book
最后是关于时间问题
从零入门要花多久我不清楚
我是JAVA转过来的
走到读内核源码前这一步花了大概2年吧
再往后就是不断在github看别人的代码 或者读内核源码了
剩下一些乱七八糟的书我就不推荐了 想学什么看什么
最后放上一些我的部分书库吧 我不喜欢看电子书 所以都买的实体
最后的戴托纳 发表于 2021-8-31 20:10
能大概看懂啥意思就行
以前群里好多都是内核CPP党
现在全体都转C 已经完全没人在内核用C++了
主要是工作原因用不上,(目前一直在几K到几十K的芯片上写代码,能用汇编就用汇编,不会汇编就用C,确实没动力去学C++) 飘零星夜 发表于 2021-8-31 20:07
确实不会, 买了一本c++ ;就看了前面1/3,然后一直吃灰,没看完 .
能大概看懂啥意思就行
以前群里好多都是内核CPP党
现在全体都转C 已经完全没人在内核用C++了
CPP害人不浅哈哈哈哈 入门到放弃系列书 bigcan 发表于 2021-8-31 19:46
入门到放弃系列书
这就是大佬,头发秃了吗{:1_918:}{:1_918:} bigcan 发表于 2021-8-31 19:46
入门到放弃系列书
学习本来就是劝退的过程...这是没办法的... 我太难了:'(weeqw 我就是会C ,不会C++ ; //还好我在52没名声,//知道你说的不是我. //开心 飘零星夜 发表于 2021-8-31 20:02
我就是会C ,不会C++ ; //还好我在52没名声,//知道你说的不是我. //开心
只会C 不会C++的比例真的很少...大多都还是能看懂一些的 有些是能看懂 但从来不用C++ 最后的戴托纳 发表于 2021-8-31 20:05
只会C 不会C++的比例真的很少...大多都还是能看懂一些的 有些是能看懂 但从来不用C++
确实不会, 买了一本c++ ;就看了前面1/3,然后一直吃灰,没看完 . 好家伙,专业书籍这么多,还有修车的,哈哈哈