一個(gè)高中生的編程自學(xué)經(jīng)歷
周末愉快。
最近,在看雪上看到了一個(gè)高中生分享的自學(xué)經(jīng)歷,想起之前也有很多高中甚至初中肄業(yè)的朋友向我咨詢學(xué)習(xí)路線,分享給大家看一看。
以下是正文內(nèi)容:
我有很大的研究技術(shù)的熱情,今年18,從初中開(kāi)始,就已經(jīng)種下了自由控制電腦這種欲望的種子。
到了高一,我第一次從信息技術(shù)課本上看到編程二字,并且書(shū)上帶走一個(gè)vb寫(xiě)的畫(huà)二次函數(shù)圖像的小例子,但是家里沒(méi)有電腦,我也沒(méi)大重視。
從高一暑假開(kāi)始,我擁有了一臺(tái)電腦。我想學(xué)習(xí)編程,但是電腦沒(méi)聯(lián)網(wǎng),于是我經(jīng)常從別人家里下載資料軟件,回家研究。
每次都下載一堆的東西,包括網(wǎng)上的教程,別人的經(jīng)驗(yàn),大學(xué)的課件,還有pdf格式的電子書(shū)等等。那時(shí)在網(wǎng)上搜編程資料,最多的就是vc vb,看到人家都說(shuō)vb最簡(jiǎn)單,所以就選了vb,自己在家研究了一個(gè)月,由于沒(méi)有接觸過(guò)編程,一些高級(jí)術(shù)語(yǔ)都不懂,所以研究過(guò)程坎坎坷坷,最終還只是會(huì)一些最基本的語(yǔ)句,用一些基本的控件。
最令我驕傲也最令我感到可恥的是我用vb模仿推箱子這個(gè)小游戲:在窗體上拖上三個(gè)圖片框,一個(gè)作為目的地,一個(gè)作為游動(dòng)的箱子,一個(gè)作為被推的箱子。僅用if else 和賦值語(yǔ)句就基本完成了對(duì)推箱子這個(gè)游戲的模擬(讓我感到可恥的是當(dāng)時(shí)腦子里函數(shù)的概念,寫(xiě)了大量重復(fù)的代碼,關(guān)鍵是也不會(huì)用vb寫(xiě)一個(gè)函數(shù),學(xué)的很垃圾)。
我用vb始終不會(huì)調(diào)用api,雖然有一些網(wǎng)上的源代碼可以參考,但是都看不懂,對(duì)于我來(lái)說(shuō),不懂就意味著什么也不會(huì),什么也做不出來(lái)。離高二開(kāi)學(xué)還有十幾天的時(shí)候,我下載了譚浩強(qiáng)的c語(yǔ)言教程在家研究。

后來(lái)發(fā)現(xiàn),用c語(yǔ)言雖然做不出vb那樣的窗口 控件(因?yàn)橐婚_(kāi)始都是用控制臺(tái)的界面學(xué)習(xí)),但是我感覺(jué)很簡(jiǎn)潔,頭腦里能搞清程序的來(lái)龍去脈,不像vb那種面向?qū)ο蟮恼Z(yǔ)言,一個(gè)方法就搞定一切,自己都不知道為什么這樣。我對(duì)c語(yǔ)言一見(jiàn)鐘情,用了3天時(shí)間把譚浩強(qiáng)300多頁(yè)的ppt看完了(我是跳躍式學(xué)習(xí)的,大部分感覺(jué)都很好理解,少部分也沒(méi)大弄懂),隨后就是多看些例子代碼,以及寫(xiě)一些簡(jiǎn)單的小程序。
高二上學(xué)期我利用課余時(shí)間看完了吳文虎的《程序設(shè)計(jì)基礎(chǔ)》,這使我在算法和數(shù)據(jù)結(jié)構(gòu)上有了些提高(從那以后,我才真算是邁進(jìn)了編程的大門,知道了學(xué)習(xí)編程語(yǔ)言最基本的是了解它的變量定義方式,各種流程控制語(yǔ)句,自定義函數(shù),程序入口點(diǎn),賦值語(yǔ)句基本都一樣,還有基本的輸入輸出函數(shù)、庫(kù)函數(shù)等等)。

高二上學(xué)期我還先后讀過(guò)《計(jì)算機(jī)組成原理》(大部分沒(méi)看懂)《操作系統(tǒng)》(大部分都看懂了) 以及Charles petzold的《Windows程序設(shè)計(jì)》(初步踏入Windows應(yīng)用程序編程的大門),高二寒假期間我用vc采用sdk(也只會(huì)sdk編程)編程方式寫(xiě)過(guò)一個(gè)聊天程序,界面結(jié)構(gòu)很簡(jiǎn)單,一個(gè)窗口,兩個(gè)編輯框,加上一個(gè)發(fā)送按鈕。寒假快要結(jié)束的時(shí)候,我又接觸了匯編語(yǔ)言。
高二下學(xué)期開(kāi)學(xué)前一天晚上,偶爾翻開(kāi)了王爽老師的匯編語(yǔ)言教程(為什么是偶爾呢?我平時(shí)都下載很多資料,這一份看不下去了,再去看另一份,就這樣在各種資料的跳躍互補(bǔ)之間,我構(gòu)建起了自己的知識(shí)網(wǎng)絡(luò)),本來(lái)沒(méi)想學(xué)習(xí)匯編的,不過(guò)看了一部分都看懂了,于是就對(duì)它產(chǎn)生了興趣,并且在淘寶上買了一本王爽的《匯編語(yǔ)言》,到學(xué)校去研究(當(dāng)時(shí)心里還不斷想著,要是我再學(xué)會(huì)了匯編語(yǔ)言,那我離高手就又進(jìn)一步了)。在學(xué)校里,我一有空就看王爽的《匯編語(yǔ)言》,越看越帶勁,心里深深地佩服王爽老師詳細(xì)透徹的知識(shí)屏蔽的講解方式,自己看完全能看懂。

紙上得來(lái)終覺(jué)淺,不真槍實(shí)彈的寫(xiě)點(diǎn)程序,是夯實(shí)不了基礎(chǔ)的。回家后,先按照書(shū)上的例子用記事本寫(xiě)好了匯編程序,然后用masm等工具編譯連接,自己用Windows自帶的debug進(jìn)行調(diào)試,雖然只是一個(gè)黑乎乎的運(yùn)行在保護(hù)模式下的一個(gè)dos窗口,什么輸出也沒(méi)有,不過(guò)能看到自己的數(shù)據(jù)在debug里面按照自己想的結(jié)果正確的運(yùn)行出來(lái)真的很開(kāi)心。(當(dāng)時(shí)還看些關(guān)于編程的小說(shuō),比如《瘋狂的程序員》《重生之王牌黑客》,后者里面的主人公竟然能直接用debug寫(xiě)應(yīng)用程序,從此我心里就偷偷地告訴自己,將來(lái)我也要達(dá)到這樣的目標(biāo)。現(xiàn)在看來(lái),這幾乎是不可能的了)

后來(lái)又用16位的匯編寫(xiě)了個(gè)直接讀取cmos來(lái)顯示當(dāng)前時(shí)間的程序,和底層硬件打交道的過(guò)程真的很爽,但是書(shū)上還有很多的東西我還都沒(méi)有實(shí)踐過(guò),比如直接讀寫(xiě)硬盤扇區(qū),開(kāi)機(jī)引導(dǎo)程序,安裝中斷程序等等,因?yàn)槲矣置陨狭藘杀緯?shū):一本是羅云彬的《Windows32位環(huán)境下的匯編語(yǔ)言程序設(shè)計(jì)》,另一本是我在網(wǎng)上搞到的電子書(shū)《黑客防線2009 黑客編程vc專輯》。


高二下學(xué)期的下半階段,我已經(jīng)完全投入到技術(shù)學(xué)習(xí)中去,上課偷偷地看,下課也看,在宿舍里也看,晚上12點(diǎn)之前一般不睡覺(jué),常常因睡眠不足而感到難受,達(dá)到了一種走火入魔的境界。看了這兩本書(shū),我才意識(shí)到,之前所做的東西雖然是在Windows上做的,但是和系統(tǒng)一點(diǎn)關(guān)系都沒(méi)有。也正是從那時(shí)起,我才感到自己步入了Windows的殿堂。
也正是因?yàn)檫@,我的成績(jī)從高二一入學(xué)的班級(jí)第10名掉到了30多名。(搞技術(shù)的,成績(jī)不提也罷) 非常感謝那兩本書(shū),讓我對(duì)神秘的Windows有了一個(gè)初步的了解,給了我一些實(shí)際的編程例子參考。
在讀這兩本書(shū)的過(guò)程中,我對(duì)c語(yǔ)言和匯編語(yǔ)言的關(guān)系了解的更加透徹,這讓我以后在寫(xiě)c代碼的過(guò)程中還能想象出編譯后的匯編代碼,用od查看,確實(shí)是那么回事。
第一次學(xué)習(xí)hook API時(shí),在網(wǎng)上下了一個(gè)例子代碼,是靠修改輸入表來(lái)hook的,二話不說(shuō),先編譯一下看看,果然一次通過(guò)(是一個(gè)dll的代碼)。然后用羅云彬介紹的方法寫(xiě)了個(gè)注入dll的程序,拿到虛擬機(jī)上一試,果然阻止了任務(wù)管理器結(jié)束程序(hook的TerminateProcess函數(shù))。
但是在物理機(jī)上就不行了,初步懷疑是系統(tǒng)的問(wèn)題(虛擬機(jī)上是xp,物理機(jī)上是win7)。后來(lái)用od掛上了win7的任務(wù)管理器,發(fā)現(xiàn)它的輸入表里根本沒(méi)有TerminateProcess這一項(xiàng),我想它應(yīng)該不會(huì)不調(diào)用這一個(gè)函數(shù)吧,于是下斷TerminateProcess,沒(méi)斷著。在繼續(xù)跟蹤調(diào)試的過(guò)程中發(fā)現(xiàn)它原來(lái)是直接調(diào)用了ntdll里的ZwTerminateProcess函數(shù)。
既然知道了原理,那就想對(duì)策。后來(lái)才知道,我的方法叫做inline hook。修改機(jī)器碼來(lái)hook函數(shù)是我自己想到的,只不過(guò)我還不知道他在這個(gè)世界已經(jīng)存在而已。
高二的暑假終于到來(lái)了,自從步入Windows的殿堂后,我的興趣就多了起來(lái),比如說(shuō)加殼脫殼,游戲外掛,內(nèi)核驅(qū)動(dòng)等等。我看郁金香的教程,看《加密與解密》,曾經(jīng)用od手動(dòng)脫過(guò)UPX,ASPack等一些簡(jiǎn)單的殼,用IDA分析過(guò)論壇里的幾個(gè)小程序的加密算法,寫(xiě)過(guò)QQ對(duì)對(duì)碰的游戲外掛,還有零散的寫(xiě)過(guò)幾個(gè)win32匯編小程序,都是些搬不上臺(tái)面的東西。
總之就是什么也玩過(guò)了,但是什么也研究的不深,始終停留在初學(xué)者的水平。玩過(guò)內(nèi)核,下載的那些介紹內(nèi)核編程的書(shū)也沒(méi)大看下去,最終也還就是寫(xiě)個(gè)hello world之類的內(nèi)核程序。眼看還有半月就開(kāi)學(xué)了,怎么感覺(jué)什么東西也沒(méi)學(xué)到。所以我決定得做點(diǎn)什么。那就寫(xiě)一個(gè)遠(yuǎn)控吧,用c語(yǔ)言,純sdk編程。
這個(gè)東西,我也沒(méi)怎么好好的架構(gòu)一下,蒙著頭就開(kāi)始了。首先寫(xiě)的是圖像傳輸?shù)模夹g(shù)含量不高,也就是截取屏幕像素?cái)?shù)據(jù),壓縮,傳送。后來(lái)又確定了用一個(gè)大的對(duì)話框作為軟件的主界面,增添了文件管理,文件傳輸,CMDShell以及文字對(duì)話的功能。因?yàn)闆](méi)有架構(gòu)好,所以每寫(xiě)一個(gè)功能,我都要追蹤出好多bug,然后依次消滅,其實(shí)編碼的時(shí)間并不多,關(guān)鍵是調(diào)試改進(jìn)上花了很多時(shí)間。
高三開(kāi)學(xué)前兩天,各個(gè)功能如期完成,我把控制端拷到u盤上(純sdk編程,才大約100k!),到鄰居家里去測(cè)試。(因?yàn)榧夹g(shù)含量不夠,所以不能穿透內(nèi)網(wǎng)。而且我家里用的廣電的CableModem,不能做端口映射,所以只能作為受控端測(cè)試了)。經(jīng)過(guò)測(cè)試,除了圖像傳輸有點(diǎn)蹩腳外,其他的功能都可用,因?yàn)橹霸谔摂M機(jī)上都測(cè)試過(guò)了。
因?yàn)槭羌僺dk編程,界面也很難看,看上去很不討人喜歡。不管怎么說(shuō),這次實(shí)際的開(kāi)發(fā)讓我體驗(yàn)到了做工程師的感覺(jué),也算是夯實(shí)了一次c語(yǔ)言,也為以后的開(kāi)發(fā)增長(zhǎng)了經(jīng)驗(yàn)。
高三開(kāi)學(xué)了,在家長(zhǎng)的壓力下,我決定好好學(xué)一學(xué)校內(nèi)的課程,考一所好點(diǎn)的大學(xué)。開(kāi)學(xué)后的一個(gè)星期里還可以,后來(lái)我總是為我那殘缺的技術(shù)感到惶恐。所以以生病的理由請(qǐng)了假,回家拿手機(jī)。
從此,我決定利用高三的業(yè)余時(shí)間好好的研究?jī)?nèi)核編程。一開(kāi)始我看的是《Windows內(nèi)核安全編程從入門到實(shí)踐》,這本書(shū)介紹的范圍很廣,但是都不詳細(xì),不過(guò)我不大理解的地方大部分都從張帆的《Windows驅(qū)動(dòng)開(kāi)發(fā)詳解》以及網(wǎng)絡(luò)上找到了答案。還有一本比較好的書(shū)《寒江獨(dú)釣...》,里面的過(guò)濾驅(qū)動(dòng)例子講解的也都很詳細(xì)。當(dāng)然,我也不可能總是看內(nèi)核的東西,我需要思維的切換。以前總是用c語(yǔ)言寫(xiě)程序,也沒(méi)正兒八經(jīng)的看看c++。
于是先正兒八經(jīng)的看了看c++,后來(lái)在家里又學(xué)了一會(huì)的BCB,能夠簡(jiǎn)單的用一些基本的控件,學(xué)這個(gè)的目的主要是快速的處理界面。后來(lái)感覺(jué)到用c++找不到想象出匯編代碼的感覺(jué),而且在論壇里看到了《c++逆向與反匯編揭秘》這本書(shū),于是就在網(wǎng)上下了一本pdf格式的電子書(shū)在手機(jī)上看。
認(rèn)真的看了一段時(shí)間后,總算對(duì)c++的反匯編有了基本的了解。看到網(wǎng)上都用mfc編程,于是我也搞到一本《深入淺出mfc》,粗略看了一段時(shí)間,對(duì)mfc的機(jī)制也有了些粗淺的認(rèn)識(shí)。
后來(lái)到了家里,在百度文庫(kù)里找了一份 vs2010 mfc教程 ?比書(shū)上的容易理解多了。看了一會(huì)就寫(xiě)出了一個(gè)基于對(duì)話框的加法計(jì)算器程序,而且界面也比以前用sdk編程的好看多了。
目前,我正在寫(xiě)一個(gè)攔截窗口創(chuàng)建的程序。內(nèi)核層hook ShadowSSDT里的NtCreateWindowEx函數(shù),應(yīng)用層用mfc設(shè)計(jì)一個(gè)基于對(duì)話框的界面,能夠自定義攔截規(guī)則(根據(jù)窗口名,類名,以及窗口大小)。
寫(xiě)這個(gè)程序的初衷是阻止迅雷酷狗等軟件的廣告窗口,目的還是為了實(shí)踐一下學(xué)到的東西。我覺(jué)得只有做出實(shí)用的程序來(lái)才算掌握了那些知識(shí)。返校時(shí)我已經(jīng)把內(nèi)核層的代碼和應(yīng)用層的代碼都分別寫(xiě)好了,并做了簡(jiǎn)單的測(cè)試,還剩下內(nèi)核層與應(yīng)用層的通信代碼沒(méi)寫(xiě)好,下次回家先做完它。(下次回家也就放寒假了,我們這高三一般都是一個(gè)月回家一次。不過(guò)為了學(xué)習(xí)編程,我也經(jīng)常請(qǐng)假回家。)
這次寒假我也要做一個(gè)軟件來(lái)實(shí)踐我從書(shū)上學(xué)到的東西,想來(lái)想去,還是要做一個(gè)遠(yuǎn)控(除了這東西,我好像也不知道要做什么了),不過(guò)這次要運(yùn)用大量的內(nèi)核編程。(給大家簡(jiǎn)單的介紹一下這個(gè)遠(yuǎn)控:
用mfc做一個(gè)基于對(duì)話框的界面,用skin皮膚庫(kù)美化界面(之前沒(méi)用過(guò),現(xiàn)學(xué)現(xiàn)用吧)。 在內(nèi)核層要做的有隱藏進(jìn)程,繞過(guò)殺軟的函數(shù)鉤子,清理回調(diào)鉤子,還有鍵盤記錄。 主要的功能有文件管理,文件傳輸,執(zhí)行cmd命令,截屏。 采用郵件系統(tǒng)通信(這樣可以通過(guò)手機(jī)發(fā)送郵件來(lái)進(jìn)行控制),不要求實(shí)時(shí)傳輸?shù)男省?/section>
還有,這只是一個(gè)初步的設(shè)想,用郵件系統(tǒng)通信我還沒(méi)試過(guò)。)
如果寒假里還有足夠的時(shí)間,我還得研究一下免殺。以后還打算自己做幾個(gè)小游戲的外掛,主要是想提高一下自己的逆向分析調(diào)試能力,然而做這些的基礎(chǔ)還是正向的編程經(jīng)驗(yàn)。
為了學(xué)習(xí)編程,成績(jī)下降,家長(zhǎng)也因此而感到失望,老師也經(jīng)常找我談話。發(fā)此帖的目的,還是要朋友們幫我參謀一下,我到底是應(yīng)該繼續(xù)學(xué)習(xí)編程,還是拚一年高三的生活來(lái)考一個(gè)好學(xué)校繼續(xù)進(jìn)修?有人說(shuō)在大學(xué)里這些東西什么也學(xué)不到,但是我總覺(jué)得好大學(xué)里的學(xué)習(xí)氣氛可能比較好。
我很迷惘,最近一直不能靜下心來(lái)去學(xué)習(xí)校內(nèi)課程。未來(lái)的路到底在哪呢?朋友們給點(diǎn)意見(jiàn)吧。
原文鏈接:https://bbs.pediy.com/thread-183512.htm
