從匯編語言到Windows內(nèi)核編程
2006年,我工作時(shí)的座位坐在wowocock旁邊。wowocock寫代碼的時(shí)候代碼風(fēng)格一團(tuán)糟。滿篇都是混亂型的命名、超級跨全工程的全局變量,詭異的跳轉(zhuǎn)。而且屢教不改。但是調(diào)程序卻很牛,開著WinDbg,基本上不用看源碼,也知道發(fā)生了什么。
因?yàn)椴挥每丛创a,所以看Windows內(nèi)核原有的代碼和看自己的代碼基本沒有太大的區(qū)別,只要?jiǎng)e跟太遠(yuǎn)。這樣就獲得了遠(yuǎn)遠(yuǎn)超出一般只能看懂C語言的程序員的能力。許多問題沒有前人的指點(diǎn)也可以自己解決。而且能做出很多別人做不出來的事來。
有時(shí)候碰到一些問題,比如說在WindowsXP有,但是Windows2000下沒有的調(diào)用。一般人也就直接放棄了。但是他卻會(huì)自己去跟蹤了XP下調(diào)用的實(shí)現(xiàn),然后在2000下寫一個(gè)替代品出來。其實(shí)在安全軟件領(lǐng)域,反匯編、自己patch、和crack早已經(jīng)大行其道。無論你站在邪惡破壞的一方,還是站在正義安全的一方,都不得不這樣做。因?yàn)閼?yīng)用層病毒的時(shí)代早就過去了,rootkit的時(shí)代到來了。
這里涉及的到其實(shí)是一個(gè)理解調(diào)試器里的匯編語言的能力的問題。你可以覺得那些rootkit牛人的技術(shù)有多強(qiáng),他們知道很多對你來說聞所未聞的東西。但是實(shí)際上他們也可以對你說這其實(shí)很簡單。因?yàn)榇鸢妇驮谡{(diào)試器窗口里的那堆匯編里。
雖然我大學(xué)畢業(yè)的時(shí)候已經(jīng)是2002年,但是大學(xué)里的匯編語言教材卻還停留在8086階段。無法理喻這種落后性。從實(shí)模式編程到保護(hù)模式編程是一個(gè)飛躍,這個(gè)過程在從DOS進(jìn)化到Windows9X的時(shí)候就已經(jīng)發(fā)生。然而我在大學(xué)期間里卻只學(xué)到了實(shí)模式的編程,以簡單的觀念看待X86的CPU,甚至不知道Ring0和Ring3的切換,本質(zhì)也就是不知道應(yīng)用與內(nèi)核的區(qū)別。
實(shí)際上大部分程序員都是如此。很可能一生都不會(huì)再次去接觸那一堆匯編語言。當(dāng)程序崩潰調(diào)試器崩出來一堆非C語言的東西,那些只是天書而已。當(dāng)場關(guān)閉然后回頭去猜測問題可能出現(xiàn)在哪里。如果猜不出來,那么就可以放棄了。其實(shí)原因并不是因?yàn)槲覀儜卸?,而是因?yàn)槲覀兯鶎W(xué)的東西沒有實(shí)際用途。一件好東西如果沒有用,就像是屠龍寶刀,如果沒有龍可以屠,那就只是廢鐵一塊。顯然很少有人再去寫實(shí)模式下的程序了(更何況是匯編)。而我們急需要做的事情,又不是我們所學(xué)能解決得了的。
很多朋友很想學(xué)習(xí)內(nèi)核編程。因?yàn)檫@聽起來更酷。是真的。這很有趣,而且又可以好好的復(fù)習(xí)一下匯編語言,讓廢鐵重新變成寶刀,那何樂而不為呢。內(nèi)核編程和應(yīng)用編程的區(qū)別在于,內(nèi)核總是運(yùn)行在復(fù)雜的條件下。一個(gè)應(yīng)用程序只要在自己的進(jìn)程空間內(nèi)放心大膽的跑就行了。就算出一點(diǎn)問題,程序崩潰了,問題當(dāng)然是在這個(gè)進(jìn)程之中了。讓我們甕中捉鱉吧。內(nèi)核則不同。內(nèi)核的代碼可能運(yùn)行在系統(tǒng)中所有的進(jìn)程和線程環(huán)境下。而且是同時(shí)的。內(nèi)核模塊之間互相調(diào)用,和硬件交互。等待中斷,發(fā)出指令讓CPU進(jìn)行種種“熱身”。當(dāng)問題發(fā)生,操作系統(tǒng)將會(huì)崩潰。WinDbg將會(huì)向您展示真正的天書,記載著Windows在最后崩潰瞬間的狀況。OK,我們不是MS的程序員,不可能看到秒鐘在停止前指向某一行C語言代碼。唯一值得慶幸的是:它們曾今是C語言代碼,只是經(jīng)過編譯了。
學(xué)習(xí)了wowowock多年的調(diào)試經(jīng)驗(yàn),我和他合寫了那本在網(wǎng)上流傳的《天書夜讀》。我個(gè)人感覺匯編在應(yīng)用程序的編程中作用不大。因?yàn)閼?yīng)用編程環(huán)境相對簡單,而且代碼規(guī)模宏大得多。而內(nèi)核往往是小巧而精致的。期望只懂C語言就搞定自己編寫的內(nèi)核模塊中的BUG顯得不太現(xiàn)實(shí)。當(dāng)然我不排除有這樣的可能。但是當(dāng)我們寶刀在手,Windows內(nèi)核的天書直接向我們放開閱讀時(shí),還有什么能難得住我們的呢?我非常感謝博文視點(diǎn)的朋友,最終將《天書夜讀:從匯編語言到Windows內(nèi)核編程》正式出版。相信更多的程序員同行和愛好者,會(huì)因此打開全新視野的大門。
上述文字由《天書夜讀:從匯編語言到Windows內(nèi)核編程》作者譚文提供