2

一个高中生的编程自学经历

 1 year ago
source link: http://www.androidchina.net/12613.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一个高中生的编程自学经历 – Android开发中文站

最新消息:欢迎访问Android开发中文站!商务联系微信:loading_in
你的位置:Android开发中文站 > 热点资讯 > 一个高中生的编程自学经历

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

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

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

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

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

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

PIC_FID20220612231023246192.png

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

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

PIC_FID20220612231023369210.png

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

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

PIC_FID20220612231023450480.jpg

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

PIC_FID20220612231023542498.png

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

PIC_FID20220612231023664688.png
PIC_FID20220612231023744678.png

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

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

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

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK