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

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

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

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

后來又用16位的匯編寫了個直接讀取cmos來顯示當前時間的程序,和底層硬件打交道的過程真的很爽,但是書上還有很多的東西我還都沒有實踐過,比如直接讀寫硬盤扇區(qū),開機引導程序,安裝中斷程序等等,因為我又迷上了兩本書:一本是羅云彬的《Windows32位環(huán)境下的匯編語言程序設(shè)計》,另一本是我在網(wǎng)上搞到的電子書《黑客防線2009 黑客編程vc專輯》。


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