关于编程语言:伤仲永看完能少走很多弯路一个高中生的自学编程经历

77次阅读

共计 4613 个字符,预计需要花费 12 分钟才能阅读完成。

我有很大的钻研技术的激情,往年 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 专辑》。

【本文配套书籍 PDF 电子高清版】

高二下学期的下半阶段,我曾经齐全投入到技术学习中去,上课偷偷地看,下课也看,在宿舍里也看,早晨 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 命令,截屏。
  • 采纳邮件系统通信(这样能够通过手机发送邮件来进行管制),不要求实时传输的效率。

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

如果暑假里还有足够的工夫,我还得钻研一下免杀。当前还打算本人做几个小游戏的外挂,次要是想进步一下本人的逆向剖析调试能力,然而做这些的根底还是正向的编程教训。

为了学习编程,问题降落,家长也因而而感到悲观,老师也常常找我谈话。发此帖的目标,还是要敌人们帮我顾问一下,我到底是应该持续学习编程,还是拚一年高三的生存来考一个好学校持续深造?有人说在大学里这些货色什么也学不到,然而我总感觉好大学里的学习气氛可能比拟好。我很怅惘,最近始终不能静下心来去学习校内课程。将来的路到底在哪呢?敌人们给点意见吧。

正文完
 0