第二天,學校食堂。
sam三人組又聚在了一起共同進餐。
亞瑟和馬修兩人臉上的傷痕如果不注意看的話已經看不出來,浮腫也完全消失,他們都稱讚林鴻的“雲南白藥”非常神奇。
在他們的桌子上,擺放著三個ti-82型計算器,他們一邊吃飯,一邊不時地看看桌上的計算器,有時候還互相對視而笑,臉上雖然疲倦,但眉目之間卻露出非常〖興〗奮和自豪的神色。
這三個計算器,正是已經被成功破解了的計算器!
迅速吃完之後,馬修馬上拿起了自己的那個計算器,在上麵按了幾下,調出一個目錄,然後運行其中的程序,整個計算器液晶屏頓時一刷新,隻見一個右邊一個小小的黑色長條開始慢慢從右至左開始移動,馬修將計算器側了過來,開始津津有味地玩了起來。
昨天,竟然有直接在bbs上就將ti-82計算器的電路圖紙直接發布在上麵,所以,德州儀器郵寄的資料,實際上已經意義不大了。那個人就是德州儀器公司的工程師,他在上麵回答了許多用戶提出的問題,並且說歡迎大家提出改進建議,他會向公司提交反饋內容。
由於提前拿到了圖紙,破解的事情立刻提上了日常,〖興〗奮之下的三人根本沒有心思睡覺,他們做了一個重要決定,那就是一定要趕在返校舞會到來之前,將計算器破解出來。
他們分工合作,馬修和亞瑟負責設計出一個有意思的軟件或者遊戲,而林鴻則負責計算器的破解。等破解出來之後。就移植到計算器上麵,給大家來一個巨大的驚喜。
由於有了bbs上那些帖子的基礎,林鴻已經對破解計算器有了非常大的把握,他最終讓亞瑟拿出工具箱,將計算器給拆了開來,對照電路圖仔細研究了計算器的硬件結構。
最終林鴻確定,並不需要對計算器進行硬件方麵的修改,就完全可以突破德州儀器公司在固件上設置的限製枷鎖。
這是因為在其中一個帖子中。有一個用戶描述了他發現的一個現象,按照他給出的幾個按鍵順序和方式,就可以讓計算器進入一個特殊的模式——“debug-n”。不過那個用戶的這個回複貼很快就被緊接而來的其他回複給淹沒了,隻有很少人才注意到了他的這個回複。
因為林鴻需要對計算器進行破解,所以他對立麵的所有回複都比較關注。這個用戶的回帖他非常重視,專門用自己的計算器按照對方描述的順序,完整地操作了一番,然後再將計算器連接到計算機上麵進行了一係列測試,結果驚喜地發現,這個模式似乎是德州儀器公司的工程師在開發過程中用來調試用的。在這個模式下,用戶對計算器的操作擁有很大的權限。
這絕對是個好消息,原本林鴻還以為需要對硬件進行改動,現在有了進入這個模式的方式。他完全可以直接不通過硬件,僅從軟件上的漏洞就可以直接對這個計算器進行破解。
經過一個晚上的奮戰,林鴻最終成功了。
他找到了一個計算器裏麵的棧緩衝區溢出,從而成功地往裏麵寫入了自己的代碼,突破了固件係統對用戶操作空間權限的限製。
程序在運行過程中,為了臨時存取數據的需要。一般都要分配一些內存空間,通常稱這些空間為緩衝區。
這個區域一般是可以進行數據存儲和刪除操作的,保護級別並不嚴格。而在緩衝區之外,在存在著其他一些係統內核數據區域,存放的數據都是係統中非常重要的數據,一旦那些數據被修改,整個係統就可能發生崩潰。當然,也有可能出現其他意想不到的結果。
所以這些係統內核數據區域是被嚴格限製和保護的,用戶不能對其進行操作。
棧是一種特殊的數據結構,特點是先入後出。就像一條死胡同,大家排隊進去,滿了之後停止進入,然後再一個一個排著隊出來,先進去的那個人,最後才出來。這種數據結構生活中也有不少例子,例如交試卷,先交的人一般要到最後才會被老師看到,還有就是以前ktv裏麵點歌係統,先點歌的人,反而排在最後麵唱。
按理說,德州儀器的工程師在編寫程序的時候,是需要對壓入棧裏麵的數據長度進行檢查的,一旦這個棧已經滿了,就必須停止對其再進行壓入,否則就會產生溢出。
而林鴻找到的這個棧緩衝區,正是那些工程師編寫代碼的時候不嚴謹,忘記對這個棧進行長度檢查,於是林鴻一直往其中壓入數據,等它滿了也不管,繼續壓入,於是便發生了棧內存溢出。
溢出便意味著棧緩衝區之外的單元會被改寫,而假如這些數據單元裏麵存儲的數據是有用數據的話,就會產生意想不到的後果,最常見的後果就是程序崩潰,通常情況下,這隻能算是程序的一個bug,但是當向這些棧中壓入經過進行設計的數據,就不僅僅是bug了,而是成為了可供黑客利用的漏洞。
林鴻正是精心設計好了一個小程序,然後將其編譯成機器碼,先是向他找到的那個棧中壓入一些無效的數據,精確計算這些數據的長度,等達到一定長度之後,再將他設計好的數據給壓入進去,讓其發生溢出,覆蓋緩衝區之外的區域,這樣當固件係統運行到這裏的時候,就會成功地調用執行他的這個程序……
於是,這個嚴密的堡壘便被林鴻給成功攻克了。
這個過程,說起來看似簡單,實際上卻是經過林鴻無數次測試才找到的,為了精確計算棧的長度。他至少反反複複重複了五十遍以上的數據壓入過程。而為了能夠讓自己的這個程序能夠順利接管固件的運行流程,其中所huā費的時間和精力,也是無法三言兩語描述得清楚的。
林鴻將其成功破解之後,〖興〗奮之下,忘記了別人不像自己根本不用睡覺,當時就立刻敲響了亞瑟的房門,幸好他們剛剛睡下不久,聽到他這麽快就將計算器給破擊出來了。原本已經瞌睡得睜不開眼睛的兩人頓時精神一振,將睡意拋到了九霄雲外。
立刻想要看一下破解之後的成果,可是接下來難題又來了——沒有合適的可以運行在上麵的軟件。
之前他們兩個討論了很久,始終無法確定第一個軟件該編寫什麽功能。亞瑟比較傾向於做一個實用性的軟件,例如可以輔助學生在學校的學習,而馬修則傾向於編寫一個有意思的遊戲。
兩個人的意見不能統一,時間就在他們不斷地爭辯中流逝,結果什麽東西都沒做出來。
現在機器已經出來了,卻沒有合適的軟件,真是夠鬱悶的。
這個時候。馬修提出,先編寫一個相對比較簡單的遊戲跑起來再說,得到了林鴻和亞瑟的一致認可。
三人商量了一下,最終決定將俄羅斯方塊這個遊戲移植到計算器中。
俄羅斯方塊是蘇聯科學家阿列克謝*帕基特諾夫一個經典遊戲。它看似簡單但卻變化無窮,令人上癮。1988年在美國上市之後,立刻獲得了巨大的商業成功,受到了男女老少所有人的歡迎,成為一款極為經典的大眾遊戲,沒有任何一款遊戲能夠與其媲美。
亞瑟之前在學習編程的時候。曾經**開發過這個遊戲,有現成的源代碼,移植起來的難度並不大。
於是,他們又將陣地轉移到了林鴻房間,因為他這台機器可以模擬z80cpu的運行環境,將亞瑟之前編寫的那個源程序進行簡單的修改和優化之後,就將其編譯成為了一個可在計算器裏麵執行的文件。然後通過數據線傳輸到了計算器存儲空間中。
剛開始的幾次運行都出了點問題,但是這是很正常的情況,移植到另外一個平台,如果能一次性就成功,那就太誇張了,就算是再牛逼的程序員,有時候也是會犯一些低級錯誤的,例如變量名稱寫錯,忘記寫分號之類的,這是很正常的情況。隻要根據調試信息,有針對性地進行修改就行了。
編寫程序就是這樣,調試、運行、再調試……
不斷地和各種錯誤和bug做這鬥爭,直到最終順利通過的那一刻!
在進行過十幾次不斷地來回調試和傳輸程序的過程之後,亞瑟的俄羅斯遊戲終於順利地在ti-82上運行了!
馬修第一時間將計算器搶了過來,然後開始玩了起來。
玩俄羅斯方塊遊戲,隻需要至多五個按鍵就可以,三個方向鍵,一個鍵用來變換,另外一個鍵則用來加速。而計算器上有幾十個按鍵,足夠了。
馬修在玩了一會兒就發現,由於計算器顯示屏高度太低,很容易就會被撐到頂,最終掛掉。
於是,他提出了改進意見,將顯示方式向順時針方向旋轉90度,這樣方塊下落的路程就可以大大加長,可以降低難度。
於是,亞瑟又開始對遊戲的源程序進行修改……
在整個過程中,林後都沒再插手,他隻是在旁邊觀看著亞瑟編寫程序。
亞瑟的這個俄羅斯方塊程序是用c語言進行編寫的,林鴻來美國之後才開始接觸這門編程語言,用得還不是很熟,今天看到亞瑟不斷修改調試,也學到了不少東西。
他發現,亞瑟編寫程序的時候,有一些細小的編程習慣值得借鑒和學習,例如在關鍵的地方給點注釋、給代碼語句多分行縮進,提高代碼的可讀性……等等。
在將近淩晨五點的時候,他們終於將最終版的俄羅斯方塊遊戲給確定下來。
此刻,除了林鴻,亞瑟和馬修都疲憊不堪,直接倒在**呼呼大睡。
這天早晨的晨練,亞瑟和馬修都沒能去,隻有林鴻一人。
sam三人組又聚在了一起共同進餐。
亞瑟和馬修兩人臉上的傷痕如果不注意看的話已經看不出來,浮腫也完全消失,他們都稱讚林鴻的“雲南白藥”非常神奇。
在他們的桌子上,擺放著三個ti-82型計算器,他們一邊吃飯,一邊不時地看看桌上的計算器,有時候還互相對視而笑,臉上雖然疲倦,但眉目之間卻露出非常〖興〗奮和自豪的神色。
這三個計算器,正是已經被成功破解了的計算器!
迅速吃完之後,馬修馬上拿起了自己的那個計算器,在上麵按了幾下,調出一個目錄,然後運行其中的程序,整個計算器液晶屏頓時一刷新,隻見一個右邊一個小小的黑色長條開始慢慢從右至左開始移動,馬修將計算器側了過來,開始津津有味地玩了起來。
昨天,竟然有直接在bbs上就將ti-82計算器的電路圖紙直接發布在上麵,所以,德州儀器郵寄的資料,實際上已經意義不大了。那個人就是德州儀器公司的工程師,他在上麵回答了許多用戶提出的問題,並且說歡迎大家提出改進建議,他會向公司提交反饋內容。
由於提前拿到了圖紙,破解的事情立刻提上了日常,〖興〗奮之下的三人根本沒有心思睡覺,他們做了一個重要決定,那就是一定要趕在返校舞會到來之前,將計算器破解出來。
他們分工合作,馬修和亞瑟負責設計出一個有意思的軟件或者遊戲,而林鴻則負責計算器的破解。等破解出來之後。就移植到計算器上麵,給大家來一個巨大的驚喜。
由於有了bbs上那些帖子的基礎,林鴻已經對破解計算器有了非常大的把握,他最終讓亞瑟拿出工具箱,將計算器給拆了開來,對照電路圖仔細研究了計算器的硬件結構。
最終林鴻確定,並不需要對計算器進行硬件方麵的修改,就完全可以突破德州儀器公司在固件上設置的限製枷鎖。
這是因為在其中一個帖子中。有一個用戶描述了他發現的一個現象,按照他給出的幾個按鍵順序和方式,就可以讓計算器進入一個特殊的模式——“debug-n”。不過那個用戶的這個回複貼很快就被緊接而來的其他回複給淹沒了,隻有很少人才注意到了他的這個回複。
因為林鴻需要對計算器進行破解,所以他對立麵的所有回複都比較關注。這個用戶的回帖他非常重視,專門用自己的計算器按照對方描述的順序,完整地操作了一番,然後再將計算器連接到計算機上麵進行了一係列測試,結果驚喜地發現,這個模式似乎是德州儀器公司的工程師在開發過程中用來調試用的。在這個模式下,用戶對計算器的操作擁有很大的權限。
這絕對是個好消息,原本林鴻還以為需要對硬件進行改動,現在有了進入這個模式的方式。他完全可以直接不通過硬件,僅從軟件上的漏洞就可以直接對這個計算器進行破解。
經過一個晚上的奮戰,林鴻最終成功了。
他找到了一個計算器裏麵的棧緩衝區溢出,從而成功地往裏麵寫入了自己的代碼,突破了固件係統對用戶操作空間權限的限製。
程序在運行過程中,為了臨時存取數據的需要。一般都要分配一些內存空間,通常稱這些空間為緩衝區。
這個區域一般是可以進行數據存儲和刪除操作的,保護級別並不嚴格。而在緩衝區之外,在存在著其他一些係統內核數據區域,存放的數據都是係統中非常重要的數據,一旦那些數據被修改,整個係統就可能發生崩潰。當然,也有可能出現其他意想不到的結果。
所以這些係統內核數據區域是被嚴格限製和保護的,用戶不能對其進行操作。
棧是一種特殊的數據結構,特點是先入後出。就像一條死胡同,大家排隊進去,滿了之後停止進入,然後再一個一個排著隊出來,先進去的那個人,最後才出來。這種數據結構生活中也有不少例子,例如交試卷,先交的人一般要到最後才會被老師看到,還有就是以前ktv裏麵點歌係統,先點歌的人,反而排在最後麵唱。
按理說,德州儀器的工程師在編寫程序的時候,是需要對壓入棧裏麵的數據長度進行檢查的,一旦這個棧已經滿了,就必須停止對其再進行壓入,否則就會產生溢出。
而林鴻找到的這個棧緩衝區,正是那些工程師編寫代碼的時候不嚴謹,忘記對這個棧進行長度檢查,於是林鴻一直往其中壓入數據,等它滿了也不管,繼續壓入,於是便發生了棧內存溢出。
溢出便意味著棧緩衝區之外的單元會被改寫,而假如這些數據單元裏麵存儲的數據是有用數據的話,就會產生意想不到的後果,最常見的後果就是程序崩潰,通常情況下,這隻能算是程序的一個bug,但是當向這些棧中壓入經過進行設計的數據,就不僅僅是bug了,而是成為了可供黑客利用的漏洞。
林鴻正是精心設計好了一個小程序,然後將其編譯成機器碼,先是向他找到的那個棧中壓入一些無效的數據,精確計算這些數據的長度,等達到一定長度之後,再將他設計好的數據給壓入進去,讓其發生溢出,覆蓋緩衝區之外的區域,這樣當固件係統運行到這裏的時候,就會成功地調用執行他的這個程序……
於是,這個嚴密的堡壘便被林鴻給成功攻克了。
這個過程,說起來看似簡單,實際上卻是經過林鴻無數次測試才找到的,為了精確計算棧的長度。他至少反反複複重複了五十遍以上的數據壓入過程。而為了能夠讓自己的這個程序能夠順利接管固件的運行流程,其中所huā費的時間和精力,也是無法三言兩語描述得清楚的。
林鴻將其成功破解之後,〖興〗奮之下,忘記了別人不像自己根本不用睡覺,當時就立刻敲響了亞瑟的房門,幸好他們剛剛睡下不久,聽到他這麽快就將計算器給破擊出來了。原本已經瞌睡得睜不開眼睛的兩人頓時精神一振,將睡意拋到了九霄雲外。
立刻想要看一下破解之後的成果,可是接下來難題又來了——沒有合適的可以運行在上麵的軟件。
之前他們兩個討論了很久,始終無法確定第一個軟件該編寫什麽功能。亞瑟比較傾向於做一個實用性的軟件,例如可以輔助學生在學校的學習,而馬修則傾向於編寫一個有意思的遊戲。
兩個人的意見不能統一,時間就在他們不斷地爭辯中流逝,結果什麽東西都沒做出來。
現在機器已經出來了,卻沒有合適的軟件,真是夠鬱悶的。
這個時候。馬修提出,先編寫一個相對比較簡單的遊戲跑起來再說,得到了林鴻和亞瑟的一致認可。
三人商量了一下,最終決定將俄羅斯方塊這個遊戲移植到計算器中。
俄羅斯方塊是蘇聯科學家阿列克謝*帕基特諾夫一個經典遊戲。它看似簡單但卻變化無窮,令人上癮。1988年在美國上市之後,立刻獲得了巨大的商業成功,受到了男女老少所有人的歡迎,成為一款極為經典的大眾遊戲,沒有任何一款遊戲能夠與其媲美。
亞瑟之前在學習編程的時候。曾經**開發過這個遊戲,有現成的源代碼,移植起來的難度並不大。
於是,他們又將陣地轉移到了林鴻房間,因為他這台機器可以模擬z80cpu的運行環境,將亞瑟之前編寫的那個源程序進行簡單的修改和優化之後,就將其編譯成為了一個可在計算器裏麵執行的文件。然後通過數據線傳輸到了計算器存儲空間中。
剛開始的幾次運行都出了點問題,但是這是很正常的情況,移植到另外一個平台,如果能一次性就成功,那就太誇張了,就算是再牛逼的程序員,有時候也是會犯一些低級錯誤的,例如變量名稱寫錯,忘記寫分號之類的,這是很正常的情況。隻要根據調試信息,有針對性地進行修改就行了。
編寫程序就是這樣,調試、運行、再調試……
不斷地和各種錯誤和bug做這鬥爭,直到最終順利通過的那一刻!
在進行過十幾次不斷地來回調試和傳輸程序的過程之後,亞瑟的俄羅斯遊戲終於順利地在ti-82上運行了!
馬修第一時間將計算器搶了過來,然後開始玩了起來。
玩俄羅斯方塊遊戲,隻需要至多五個按鍵就可以,三個方向鍵,一個鍵用來變換,另外一個鍵則用來加速。而計算器上有幾十個按鍵,足夠了。
馬修在玩了一會兒就發現,由於計算器顯示屏高度太低,很容易就會被撐到頂,最終掛掉。
於是,他提出了改進意見,將顯示方式向順時針方向旋轉90度,這樣方塊下落的路程就可以大大加長,可以降低難度。
於是,亞瑟又開始對遊戲的源程序進行修改……
在整個過程中,林後都沒再插手,他隻是在旁邊觀看著亞瑟編寫程序。
亞瑟的這個俄羅斯方塊程序是用c語言進行編寫的,林鴻來美國之後才開始接觸這門編程語言,用得還不是很熟,今天看到亞瑟不斷修改調試,也學到了不少東西。
他發現,亞瑟編寫程序的時候,有一些細小的編程習慣值得借鑒和學習,例如在關鍵的地方給點注釋、給代碼語句多分行縮進,提高代碼的可讀性……等等。
在將近淩晨五點的時候,他們終於將最終版的俄羅斯方塊遊戲給確定下來。
此刻,除了林鴻,亞瑟和馬修都疲憊不堪,直接倒在**呼呼大睡。
這天早晨的晨練,亞瑟和馬修都沒能去,隻有林鴻一人。