年轻时的linus

最近,在看雪论坛上看到了一个高中生分享的自学经历,想起我第一次学习编程时候,当年高考后,由于大学选了计算机专业,就好奇去了看一本c语言编程(书是亲戚的)书籍,好奇心驱使我们主动去探索未知,这种探索精神正是极客所必须的,但自学也需要克服很多困难(自学成才需要天时地利人和),分享给大家看一看。


以下是正文内容:

我有很大的研究技术的热情,今年18,从初中开始,就已经种下了自由控制电脑这种欲望的种子。

到了高一,我第一次从信息技术课本上看到编程二字,并且书上带走一个vb写的画二次函数图像的小例子,但是家里没有电脑,我也没大重视。

从高一暑假开始,我拥有了一台电脑。我想学习编程,但是电脑没联网,于是我经常从别人家里下载资料软件,回家研究。

每次都下载一堆的东西,包括网上的教程,别人的经验,大学的课件,还有pdf格式的电子书等等。那时在网上搜编程资料,最多的就是vc vb,看到人家都说vb最简单,所以就选了vb,自己在家研究了一个月,由于没有接触过编程,一些高级术语都不懂,所以研究过程坎坎坷坷,最终还只是会一些最基本的语句,用一些基本的控件。

最令我骄傲也最令我感到可耻的是我用vb模仿推箱子这个小游戏:在窗体上拖上三个图片框,一个作为目的地,一个作为游动的箱子,一个作为被推的箱子。仅用if else 和赋值语句就基本完成了对推箱子这个游戏的模拟(让我感到可耻的是当时脑子里函数的概念,写了大量重复的代码,关键是也不会用vb写一个函数,学的很垃圾)。

我用vb始终不会调用api,虽然有一些网上的源代码可以参考,但是都看不懂,对于我来说,不懂就意味着什么也不会,什么也做不出来。离高二开学还有十几天的时候,我下载了谭浩强的c语言教程在家研究。

后来发现,用c语言虽然做不出vb那样的窗口 控件(因为一开始都是用控制台的界面学习),但是我感觉很简洁,头脑里能搞清程序的来龙去脉,不像vb那种面向对象的语言,一个方法就搞定一切,自己都不知道为什么这样。我对c语言一见钟情,用了3天时间把谭浩强300多页的ppt看完了(我是跳跃式学习的,大部分感觉都很好理解,少部分也没大弄懂),随后就是多看些例子代码,以及写一些简单的小程序。

高二上学期我利用课余时间看完了吴文虎的《程序设计基础》,这使我在算法和数据结构上有了些提高(从那以后,我才真算是迈进了编程的大门,知道了学习编程语言最基本的是了解它的变量定义方式,各种流程控制语句,自定义函数,程序入口点,赋值语句基本都一样,还有基本的输入输出函数、库函数等等)。

高二上学期我还先后读过《计算机组成原理》(大部分没看懂)《操作系统》(大部分都看懂了) 以及Charles petzold的《Windows程序设计》(初步踏入Windows应用程序编程的大门),高二寒假期间我用vc采用sdk(也只会sdk编程)编程方式写过一个聊天程序,界面结构很简单,一个窗口,两个编辑框,加上一个发送按钮。寒假快要结束的时候,我又接触了汇编语言。

荣哥:对于初学者来说,刚开始不懂,不要紧,多多实践,后面慢慢就理解了,但如果一直不去查缺补漏,就可能为后来基础落下隐患,还有一点,视野也很重要,很明显,这位高中生有问题,没有请教和讨论,如果有高人指点,可能进步会更快。

高二下学期开学前一天晚上,偶尔翻开了王爽老师的汇编语言教程(为什么是偶尔呢?我平时都下载很多资料,这一份看不下去了,再去看另一份,就这样在各种资料的跳跃互补之间,我构建起了自己的知识网络),本来没想学习汇编的,不过看了一部分都看懂了,于是就对它产生了兴趣,并且在淘宝上买了一本王爽的《汇编语言》,到学校去研究(当时心里还不断想着,要是我再学会了汇编语言,那我离高手就又进一步了)。在学校里,我一有空就看王爽的《汇编语言》,越看越带劲,心里深深地佩服王爽老师详细透彻的知识屏蔽的讲解方式,自己看完全能看懂。

荣哥:初生牛犊不怕虎,值得学习,不害怕所有东西,汇编复杂度比高级语言要少很多,只是需要对硬件熟悉和一些简单的规则。

纸上得来终觉浅,不真枪实弹的写点程序,是夯实不了基础的。回家后,先按照书上的例子用记事本写好了汇编程序,然后用masm等工具编译连接,自己用Windows自带的debug进行调试,虽然只是一个黑乎乎的运行在保护模式下的一个dos窗口,什么输出也没有,不过能看到自己的数据在debug里面按照自己想的结果正确的运行出来真的很开心。(当时还看些关于编程的小说,比如《疯狂的程序员》《重生之王牌黑客》,后者里面的主人公竟然能直接用debug写应用程序,从此我心里就偷偷地告诉自己,将来我也要达到这样的目标。现在看来,这几乎是不可能的了)

后来又用16位的汇编写了个直接读取cmos来显示当前时间的程序,和底层硬件打交道的过程真的很爽,但是书上还有很多的东西我还都没有实践过,比如直接读写硬盘扇区,开机引导程序,安装中断程序等等,因为我又迷上了两本书:一本是罗云彬的《Windows32位环境下的汇编语言程序设计》,另一本是我在网上搞到的电子书《黑客防线2009 黑客编程vc专辑》。

高二下学期的下半阶段,我已经完全投入到技术学习中去,上课偷偷地看,下课也看,在宿舍里也看,晚上12点之前一般不睡觉,常常因睡眠不足而感到难受,达到了一种走火入魔的境界。看了这两本书,我才意识到,之前所做的东西虽然是在Windows上做的,但是和系统一点关系都没有。也正是从那时起,我才感到自己步入了Windows的殿堂。

也正是因为这,我的成绩从高二一入学的班级第10名掉到了30多名。(搞技术的,成绩不提也罢) 非常感谢那两本书,让我对神秘的Windows有了一个初步的了解,给了我一些实际的编程例子参考。

在读这两本书的过程中,我对c语言和汇编语言的关系了解的更加透彻,这让我以后在写c代码的过程中还能想象出编译后的汇编代码,用od查看,确实是那么回事。

第一次学习hook API时,在网上下了一个例子代码,是靠修改输入表来hook的,二话不说,先编译一下看看,果然一次通过(是一个dll的代码)。然后用罗云彬介绍的方法写了个注入dll的程序,拿到虚拟机上一试,果然阻止了任务管理器结束程序(hook的TerminateProcess函数)。

但是在物理机上就不行了,初步怀疑是系统的问题(虚拟机上是xp,物理机上是win7)。后来用od挂上了win7的任务管理器,发现它的输入表里根本没有TerminateProcess这一项,我想它应该不会不调用这一个函数吧,于是下断TerminateProcess,没断着。在继续跟踪调试的过程中发现它原来是直接调用了ntdll里的ZwTerminateProcess函数。

既然知道了原理,那就想对策。后来才知道,我的方法叫做inline hook。修改机器码来hook函数是我自己想到的,只不过我还不知道他在这个世界已经存在而已

高二的暑假终于到来了,自从步入Windows的殿堂后,我的兴趣就多了起来,比如说加壳脱壳,游戏外挂,内核驱动等等。我看郁金香的教程,看《加密与解密》,曾经用od手动脱过UPX,ASPack等一些简单的壳,用IDA分析过论坛里的几个小程序的加密算法,写过QQ对对碰的游戏外挂,还有零散的写过几个win32汇编小程序,都是些搬不上台面的东西。

总之就是什么也玩过了,但是什么也研究的不深,始终停留在初学者的水平。玩过内核,下载的那些介绍内核编程的书也没大看下去,最终也还就是写个hello world之类的内核程序。眼看还有半月就开学了,怎么感觉什么东西也没学到。所以我决定得做点什么。那就写一个远控吧,用c语言,纯sdk编程。

荣哥:不断去实践,实在不懂可以请教前辈,设立有难度的实战目标,不断去完成目标,会促使你挑战自己的能力边界,突破舒适区,技术实力得到真正的提高,

这个东西,我也没怎么好好的架构一下,蒙着头就开始了。首先写的是图像传输的,技术含量不高,也就是截取屏幕像素数据,压缩,传送。后来又确定了用一个大的对话框作为软件的主界面,增添了文件管理,文件传输,CMDShell以及文字对话的功能。因为没有架构好,所以每写一个功能,我都要追踪出好多bug,然后依次消灭,其实编码的时间并不多,关键是调试改进上花了很多时间。

高三开学前两天,各个功能如期完成,我把控制端拷到u盘上(纯sdk编程,才大约100k!),到邻居家里去测试。(因为技术含量不够,所以不能穿透内网。而且我家里用的广电的CableModem,不能做端口映射,所以只能作为受控端测试了)。经过测试,除了图像传输有点蹩脚外,其他的功能都可用,因为之前在虚拟机上都测试过了。

因为是纯sdk编程,界面也很难看,看上去很不讨人喜欢。不管怎么说,这次实际的开发让我体验到了做工程师的感觉,也算是夯实了一次c语言,也为以后的开发增长了经验。

高三开学了,在家长的压力下,我决定好好学一学校内的课程,考一所好点的大学。开学后的一个星期里还可以,后来我总是为我那残缺的技术感到惶恐。所以以生病的理由请了假,回家拿手机。

从此,我决定利用高三的业余时间好好的研究内核编程。一开始我看的是《Windows内核安全编程从入门到实践》,这本书介绍的范围很广,但是都不详细,不过我不大理解的地方大部分都从张帆的《Windows驱动开发详解》以及网络上找到了答案。还有一本比较好的书《寒江独钓...》,里面的过滤驱动例子讲解的也都很详细。当然,我也不可能总是看内核的东西,我需要思维的切换。以前总是用c语言写程序,也没正儿八经的看看c++。

于是先正儿八经的看了看c++,后来在家里又学了一会的BCB,能够简单的用一些基本的控件,学这个的目的主要是快速的处理界面。后来感觉到用c++找不到想象出汇编代码的感觉,而且在论坛里看到了《c++逆向与反汇编揭秘》这本书,于是就在网上下了一本pdf格式的电子书在手机上看。

认真的看了一段时间后,总算对c++的反汇编有了基本的了解。看到网上都用mfc编程,于是我也搞到一本《深入浅出mfc》,粗略看了一段时间,对mfc的机制也有了些粗浅的认识。

后来到了家里,在百度文库里找了一份 vs2010 mfc教程  比书上的容易理解多了。看了一会就写出了一个基于对话框的加法计算器程序,而且界面也比以前用sdk编程的好看多了。

目前,我正在写一个拦截窗口创建的程序。内核层hook ShadowSSDT里的NtCreateWindowEx函数,应用层用mfc设计一个基于对话框的界面,能够自定义拦截规则(根据窗口名,类名,以及窗口大小)。

写这个程序的初衷是阻止迅雷酷狗等软件的广告窗口,目的还是为了实践一下学到的东西。我觉得只有做出实用的程序来才算掌握了那些知识。返校时我已经把内核层的代码和应用层的代码都分别写好了,并做了简单的测试,还剩下内核层与应用层的通信代码没写好,下次回家先做完它。(下次回家也就放寒假了,我们这高三一般都是一个月回家一次。不过为了学习编程,我也经常请假回家。)

这次寒假我也要做一个软件来实践我从书上学到的东西,想来想去,还是要做一个远控(除了这东西,我好像也不知道要做什么了),不过这次要运用大量的内核编程。(给大家简单的介绍一下这个远控:

  • 用mfc做一个基于对话框的界面,用skin皮肤库美化界面(之前没用过,现学现用吧)。

  • 在内核层要做的有隐藏进程,绕过杀软的函数钩子,清理回调钩子,还有键盘记录。

  • 主要的功能有文件管理,文件传输,执行cmd命令,截屏。

  • 采用邮件系统通信(这样可以通过手机发送邮件来进行控制),不要求实时传输的效率。

还有,这只是一个初步的设想,用邮件系统通信我还没试过。)

如果寒假里还有足够的时间,我还得研究一下免杀。以后还打算自己做几个小游戏的外挂,主要是想提高一下自己的逆向分析调试能力,然而做这些的基础还是正向的编程经验。

为了学习编程,成绩下降,家长也因此而感到失望,老师也经常找我谈话。发此帖的目的,还是要朋友们帮我参谋一下,我到底是应该继续学习编程,还是拚一年高三的生活来考一个好学校继续进修?有人说在大学里这些东西什么也学不到,但是我总觉得好大学里的学习气氛可能比较好。

我很迷惘,最近一直不能静下心来去学习校内课程。未来的路到底在哪呢?朋友们给点意见吧

荣哥:如果自己学习能力无法兼顾到学业,建议先好好考大学,大学是很重要的文凭,至少以后多很多朋友,大学同学都是非常宝贵的人脉,大学可以扩展你的视野,让你看到更广阔世界,大学也是人生中非常美好的时间节点,这四年可以为自己的梦想打好坚实的基础。上大学后会有大量充分时间给我们折腾,折腾我们热爱的一切。

最后,我想说一下,这位高中生,可能最大的问题就是,没有主动去找前辈指导(或者是没有遇到一个好的老师),导致兴趣爱好无法和学业配合起来(很明显,他学习技术很吃力,花了太多时间在技术上),自学成才是需要天时地利人和,虽然刚开始大家都很有热情,但随着学习深入,必然会遇到很多困难,很多难以快速理解概念和技术,如果这些不理解东西越来越多后,就很容易让人失去信心和热情,对自己产生怀疑,这位同学现在已经开始产生怀疑,对前途开始迷茫,导致最终放弃,中国又会失去一位计算机高手,什么时候我们国家能够像欧美那样出现很多的计算机高手,首先我们得快速把现存技术精华全部吸收(前人们留下来技术精华),才能有所创新,年轻人敢打敢拼,不能让基本功和视野狭隘阻断了他们热爱的道路。

原文链接:https://bbs.pediy.com/thread-183512.htm

欢迎大家加入极客星球,极客星球是一个全面提升技术的社区,我会在极客星球分享很多核心技术的理解,帮助大家快速成长,学习和掌握后台核心技术,深入理解Linux系统,理解技术核心概念,夯实基本功,扩展技术视野,疑难解答,带领大家长期坚持学习,掌握核心技术,对星球感兴趣的,点击查看-> 极客星球:

论师傅引领的重要性

- END -


看完一键三连在看转发点赞

是对文章最大的赞赏,极客重生感谢你

推荐阅读

定个目标|建立自己的技术知识体系

大厂后台开发基本功修炼路线和经典资料

难走的路,从不拥挤

你好,这里是极客重生,我是阿荣,大家都叫我荣哥,从华为->外企->到互联网大厂,目前是大厂资深工程师,多次获得五星员工,多年职场经验,技术扎实,专业后端开发和后台架构设计,热爱底层技术,丰富的实战经验,分享技术的本质原理,希望帮助更多人蜕变重生,拿BAT大厂offer,培养高级工程师能力,成为技术专家,实现高薪梦想,期待你的关注!点击蓝字查看我的成长之路

校招/社招/简历/面试技巧/大厂技术栈分析/后端开发进阶/优秀开源项目/直播分享/技术视野/实战高手等, 极客星球希望成为最有技术价值星球,尽最大努力为星球的同学提供面试,跳槽,技术成长帮助!详情查看->极客星球

求点赞,在看,分享三连

一个高中生的编程自学经历相关推荐

  1. 3年Python编程自学经历,分享一些心得经验

    本人是一名纯小白,转行学习Python编程之前,干着一份运营工作,好像跟Python一点边都不搭吧,偶然的机会接触到python,于是开始利用下班空闲时间学起了python.自学了将近三年,有一些学习 ...

  2. 看看200万程序员怎么评论:编程自学和培训哪个靠谱?

    今天给大家分享一个话题:编程自学和培训哪个靠谱? 方法因人而异,没有说固定的哪个好.有的时候运气一样很 重要,比如你能否找到带你入门的"那串钥匙".如果感觉自己自学能力比较强,选择 ...

  3. 一个大学生的编程经历(转载)

    一个大学生的编程经历(转载) 新浪科技推出了"我的编程生涯"有奖征文,目的是让中国数千万的网民"聆听"中国软件人才的最真切的"声音".我们热 ...

  4. python编程自学能学会吗-小白看看!本人自学Python编程经验分享。

    这篇文章我将以我自学编程的经历.自己遇到的坑.如何解决问题等方面,给初学者朋友们分享自己的经验,希望对正在自学编程的你有帮助.如果哪里说的不对,也望得到您的批评指正! 1.为什么要学习编程? (1)因 ...

  5. 机械转行java自学经历,零基础学java,血泪总结的干货

    机械转行java自学经历,零基础学java,血泪总结的干货 1.我为什么转行 2.转行之路 3.面试之路 自学路上的网站 Java教程 实践项目一站式学习 bilibili 自学书籍 <Java ...

  6. 高中学历能学python_高中生学编程--Python学习.pdf

    目录 前言 高中生如何学习编程 一.Python语言的入门 二.计算机系统的简单介绍 三.计算机语言的介绍 四.Python语言简单介绍 五.Python的语言基础 六.Python的程序流程 七.P ...

  7. 个人Java自学经历(半年多,已找到工作)

    相信很多人都想自学java,但是很多人自学又没有从何开始.学到什么样算好这样的头绪,这些问题也深深地苦恼着我. 一般来说有自学和去培训机构2个选择,培训机构的好处就是能在短时间内系统地教授你大量知识, ...

  8. c语言程序设计自学跟谁好,双辽c语言编程学习,双辽学c语言编程哪个好,双辽学c语言编程自学好还是报班好...

    双辽c语言编程学习,双辽学c语言编程哪个好,双辽学c语言编程自学好还是报班好 首页 > 软件 > 双辽c语言编程学习 作者:镀金池   发布时间:2017-12-07 05:48 一个C语 ...

  9. SylixOS操作系统自学经历(一)

    SylixOS操作系统自学经历(一) 我现在的工作岗位是嵌入式软件工程师,在学习过程中感谢王翾先生,陈洪邦先生,李孝成先生以及其他同事的大力帮助. 在系统学习SylixOS操作系统前我先看了<S ...

最新文章

  1. 利用矩阵奇异值分解(SVD)进行降维
  2. android cpu绑核
  3. Web应用_Tomcat部署及优化
  4. oracle 查看任务数量,关于dbms_scheduler创建任务数量的疑问
  5. 943. Find the Shortest Superstring
  6. python28 excel读取模块xlrd
  7. mysql 绑定 cpu 节点_MySQL Cluster(MySQL集群)配置
  8. 关于特征筛选中的IV值
  9. c语言指针实验报告总结,指针(C语言实验报告).doc
  10. windows xp 64 位
  11. hdu3709——数位dp+枚举
  12. SiamRPN代码分析:test
  13. 安卓模拟器最优选择+抖音检测全绕过简述
  14. Java实现满天星动案例
  15. ESP32-NVS存储(非易失性存储库)
  16. sourcetree教程(去掉注册账号)
  17. 微信网页授权之取消授权
  18. java汉字转拼音和获取汉语拼音首字母
  19. CT和MR影像实现 定位线功能
  20. CSP CCF: 201903-1 小中大 (C++)

热门文章

  1. ORAN专题系列-11:5G O-RAN RIC的PaaS和SaaS是封闭与开放的融合
  2. android 发音乐通知到通知栏
  3. 2022年武汉市级产业化投资和技术改造专项以及工业智能化改造专项申报开始!13区申报条件、1千万补助
  4. 向NCBI上传16S rDNA数据的操作详解
  5. 转载:16种鲜鱼的做法
  6. 高清卫星影像DEM各个遥感卫星数据免费下载,3款软件4个网站推荐给你,从此不再为数据发愁
  7. pdf 改变页面大小 python_用Python开发PDF编辑器,实现PDF页面提取,页面合并与替换...
  8. 全球 26 个主流视频网站高清视频下载全搞定,包括 P 站!
  9. rook 排错记录 + Orphaned pod found kube-controller-manager的日志输出
  10. 21天挑战赛第三文——多线程threading