電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>C語言|源代碼>黑客與C語言的關系

黑客與C語言的關系

2017-09-28 | rar | 0.3 MB | 次下載 | 1積分

資料介紹

  “黑客”這個詞想必我們已經(jīng)如雷貫耳了。我們一聽到黑客通常在大腦中的印象就是一群穿著黑衣,躲在小屋里偷偷用著數(shù)臺電腦針對某組計算機,神不知鬼不覺地進行攻擊。他們通常會攻入一些網(wǎng)絡或系統(tǒng),潛伏在一些大型網(wǎng)站,窺探甚至竊取用戶隱私,比如竊取你的QQ號、微信號、你的郵箱,諸如此類的事情。他們通常擁有高超的技術,于無形中做很多我們或驚嘆或驚嚇的事。他們就像《海盜船》的Jack船長一樣分明是“惡勢力”,卻又詭異、神秘,有超強的能力,而好萊塢中各類電影和電視劇對黑客的渲染更是使我們對他們的世界充滿了探究的意愿。

  其實黑客有時候也是統(tǒng)稱,也有灰客、白客。然而,以上這只是狹義上的黑客,其實在現(xiàn)在的英語中用Cracker來描述這種專門搞計算機系統(tǒng)以及網(wǎng)絡系統(tǒng)破壞的人。而廣義上講,黑客(Hacker)對于程序員而言其實是指精通于計算機以及計算機網(wǎng)絡的人。所以這么一來我們就能理解為何許多偉大的系統(tǒng)締造者、編程語言締造者能被稱為黑客了,盡管他們并不是以破壞系統(tǒng)而聞名。

  1. Unix系統(tǒng)創(chuàng)始人Dennis Ritchie

  這里首先介紹的就是大名鼎鼎的Dennis Ritchie,于2011年12月逝世。他是偉大的Unix系統(tǒng)的創(chuàng)始人,同時也是著名經(jīng)典的C編程語言的締造者。曾在1983年從ACM獲得圖靈獎。在早些時候,Unix系統(tǒng)其實是用匯編語言開發(fā)的,那個時候Dennis Ritchie與另一個偉大的黑客Ken Thompson(現(xiàn)就職于Google,并打造了Go語言)在貝爾實驗室一起實現(xiàn)了在DEC生產(chǎn)的PDP-7計算機上的Unix系統(tǒng)。那時,他倆準備將此操作系統(tǒng)移植到PDP-11上。剛開始,PDP-11上的Unix系統(tǒng)仍然是用匯編語言開發(fā)的,但是因為PDP-11與PDP-7的變化還是有不少的,所以那時候開發(fā)者打算用B語言來重寫該系統(tǒng)。B語言是由Ken Thompson從BCPL編程語言簡化而來的。然而,B語言無法很好利用PDP-11上的某些特性,比如字節(jié)尋址,這就使得Dennis Ritchie與Ken Thompson一起打造了更靈活、更強大的C編程語言。而C語言一開始也就是針對PDP-11計算機上的Unix系統(tǒng)而打造的。在1972年,Unix中的大部分代碼都用C語言重寫。到1973年,引入了結構體類型 struct 之后,C語言就基本成型了,因為它足夠強大,所以足以擔當Unix系統(tǒng)內(nèi)核大部分功能的實現(xiàn)。而此時的C語言也被稱作為“K&R C”。

  當然,Dennis Ritchie也有他調皮的一面。在早期開發(fā)的Unix系統(tǒng)中,他特意留了一些后門。其他開發(fā)者用自己賬號登錄系統(tǒng)之后,他們發(fā)現(xiàn)自己的文件或某些資料被改動過,一直很納悶。他們后來通過排查,發(fā)現(xiàn)了當時Unix系統(tǒng)的一個漏洞,把它堵上后,但沒過多久自己的賬號又被侵入了。后來才知道,原來是Dennis Ritchie在C語言編譯器上埋下了后門,所以只要他們用編譯器編一次程序,那么漏洞就會自動生成,哈哈……這個也讓筆者聯(lián)想起前兩年很多iOS開發(fā)者通過百度網(wǎng)盤下載帶有后門的Xcode,使得很多App受到木馬侵襲,而且該木馬能躲過Apple的代碼審核機制。盡管該漏洞破壞性不大,因為iOS系統(tǒng)以及iOS設備處理器的本身運行安全機制很厲害,不過這也說明了來自編譯器的后門是防不勝防的。

  2. Linux系統(tǒng)內(nèi)核締造者Linus Torvalds

  下面說的這位黑客應該大家非常熟悉了,就是大名鼎鼎的Linus Torvalds,Linux系統(tǒng)內(nèi)核的締造者,Git版本管理工具的締造者。Linus Torvalds從1988到1996年在自己祖國芬蘭的赫爾辛基大學修完了碩士學位。在此期間,他看了Andrew Tanenbaum的一本書《Operating Systems: Design and Implementation》,在此書中Andrew描述的是MINIX系統(tǒng),該系統(tǒng)是Unix剝離下來的一個用于教學的版本。此時,由于在芬蘭很難獲得軟件,所以這也促成了Linus Torvalds喜歡自己動手的習慣,他購買了一套Sinclair QL,然后自己為它寫了一套匯編器以及編輯器,然后自己獨立編寫了一個類似吃豆人(Pac-Man)的小游戲,稱為Cool Man。在1991年,他購買了基于Intel 80386的IBM PC,同時在此之前也收到了MINIX的一個拷貝,從而他就開始了在Intel 80386上的Linux內(nèi)核開發(fā)。Linux的第一個版本正式版本1.0在1994年3月14號發(fā)布。在2005年,Linus創(chuàng)建了Git這一版本控制系統(tǒng)(VCS)的開源項目,基于GPLv2許可證?,F(xiàn)在我們看到很多項目、工具以及網(wǎng)站都會默認使用Git工具進行版本控制,包括Xcode,GitHub等等。

  當然,Linus Torvalds跟不少程序員一樣,也有偏執(zhí)、狂傲的一面。比如在開發(fā)Git項目過程中,有位開發(fā)者表示Git項目用的都是純C語言而不是C++表示不可理解,而且也直言不諱:“別拿可移植性說事,那是屁話”。并且還指出,蠻力地直接操作文本,既啰嗦又易錯,而且很難跟上高層代碼邏輯。當時Linus Torvalds對此發(fā)出了強烈的不滿!他一上來也爆粗口——“YOU * are full of bull shit”,緊接著他開始炮轟C++了,哈哈。大致意思如下:

  C++是一種可怕的語言。而且因為有大量不夠標準的程序員在使用而使情況更糟,以至于極容易產(chǎn)生徹頭徹尾的垃圾(total and utter crap)。老實說,選擇C就是為了把C++程序員踢出去?!矣羞@樣的結論,任何喜歡用C++而不是C開發(fā)項目的程序員可能都是我希望踢出去的人,免得他們來搞亂我參與的項目。C++會導致非常非常糟糕的設計選擇。你們這些C++程序員總是一上來就用語言的那些’漂亮的’庫特性比如STL、Boost和其他徹頭徹尾的垃圾,這可能對你們的程序有所‘幫助’,但是卻會導致:

 ?。?)當庫無法工作時無窮無盡的折磨(別跟我說什么STL尤其是Boost很穩(wěn)定而且可移植性很好,那全是屁話,而且一點都不可笑)

  (2)低效的抽象編程模型,可能在兩年之后你會注意到有些抽象效果不怎么樣,但是所有代碼已經(jīng)依賴于圍繞它設計的‘漂亮’對象模型了,如果不重寫應用程序,就無法改正。

  呵呵,其實Linus說得也確實沒錯。對于一些系統(tǒng)級項目,使用C++甚至更高級的編程語言可能反而會使整個項目難以維護,因為當代碼量上升的時候,很多設計需要圍繞原有的設計模型進行。這就好比洗衣機的滾筒,洗衣的次數(shù)多了,滾筒上就會慢慢沾滿各種碎衣料,然后越滾越多。C語言的設計理念就是專注于功能模塊,而不是以某個特定的設計模型為中心展開堆碼,這也是C語言的靈活性所在。

  以上我們談到的是Hacker這個詞,他是一個名詞,用于表示某類人。而我們?nèi)粘Kf的黑客還能做動詞使用,其實也就是對應英語中Hack這個單詞。Hack本意是劈、砍、亂踢這類意思,因而當它用于計算機系統(tǒng)時就是指對系統(tǒng)進行猛烈攻擊,從而找到其漏洞。現(xiàn)在由于Hack的使用范圍又廣了,它還能用于編程語言。像Apple在2014年推出Swift編程語言時就稱它為Hackable programming language。這里的Hackable就是說該編程語言是可用來做各種另類玩法的,在現(xiàn)有語法體系中能玩出令人意想不到的效果,寫出驚世駭俗的代碼來。而C語言也是Hackable的。因為它靈活、強大,不死板,所以我們很多時候可以用C語言的語法糖實現(xiàn)各種相當不錯的API封裝以及功能實現(xiàn)。我這里舉兩個簡單的例子。

  像我們用C語言在開發(fā)一套程序時,有時為了調試方便會自己定義一個用于打印輸出日志的接口,在調試模式將它開啟,在發(fā)布模式將它屏蔽。對于遵循C99的編譯器,我們通常會這么定義:

  #ifdef DEBUG

  #define DEBUG_LOG(。。.) (void)printf(__VA_ARGS__)

  #else

  #define DEBUG_LOG(。。.) (void)0

  #endif

  而對于不遵循C99標準的C語言編譯器,并且不能使用不定參數(shù)個數(shù)的宏定義時我們?nèi)绾味x呢?我們初步能想到的是以下這種方式:

  #ifdef DEBUG

  #define DEBUG_LOG (void)printf

  #else

  #define DEBUG_LOG (void)

  #endif

  這種定義方式基本沒什么問題。不過當我們碰到以下這種代碼時,這種定義方式在發(fā)布模式下的行為會與前面C99模式的有所不同。

  int a = 10;

  DEBUG_LOG(“a = %dn”, ++a);

  我們請注意看,這里在DEBUG_LOG中對所要打印的變量a進行了遞增操作,從而使得變量a在調用DEBUG_LOG之前產(chǎn)生了副作用。依照C99那種定義方式,在發(fā)布模式下,由于整個DEBUG_LOG(…)這個宏被定義為了 (void)0,所以這里面的表達式都不會被擴展出來,因此++a這個表達式是不存在于源代碼中的。而在上面C90模式下的實現(xiàn)方式由于沒有屏蔽++a這個表達式,從而會使它產(chǎn)生副作用。那如果我們想在發(fā)布模式下與C99那種形式一樣屏蔽掉DEBUG_LOG宏中所有表達式的副作用該如何實現(xiàn)呢?其實非常簡單!在C90中就已經(jīng)有了編譯時行為的操作符——sizeof!sizeof操作符內(nèi)的表達式在C90中是不會產(chǎn)生任何副作用的。同時,由于對于打印函數(shù)來說,必定存在一個表示字符串的表達式,因此我們也無需擔心傳入的表達式是否可能為void表達式。所以我們可以在發(fā)布模式下這么定義DENUG_LOG:

  #define DEBUG_LOG (void)sizeof

  非常神奇吧~正因為C語言有各種形式的類型、操作符、預處理器的存在,所以我們可以用它實現(xiàn)多種功能,從而達到自己期望的效果。

  我們再舉一個例子,是關于聯(lián)合體的。聯(lián)合體是個好東東!它一般用于抽象數(shù)據(jù)類型,從而可使得該數(shù)據(jù)類型在某一特定場合是一種類型,再另一種特定場合又是另一種類型,但是所占的存儲空間是其中最大的成員那個。所以它既能做到類型抽象的作用,同時也能縮減存儲空間,對于一些系統(tǒng)開發(fā)而言很有幫助。我們下面想定義一個聯(lián)合體類型的常量數(shù)組,但是該常量數(shù)組中每個元素的數(shù)據(jù)類型可能是不同的。在遵循C99標準的代碼中我們可能會這么寫:

  static const union MyData

  {

  int i;

  float f;

  }sc_list[] = {

  {.i = 10},

  {.f = 0.5f},

  {.i = 20}

  };

  如果是在不遵循C99標準的C語言中該如何表示呢?我們這里能看到,第二個元素是直接對f單精度浮點類型的成員進行初始化,所以如果我們直接寫0.5f那由于其實元素是int類型,編譯器仍然會將它轉為int類型,從而變?yōu)檎麛?shù)0。其實如果我們知道在當前C語言環(huán)境中倘若單精度浮點用的是遵循IEEE754規(guī)格化浮點數(shù)表示的話,那么我們可以直接用IEEE754對二進制浮點數(shù)的表示來做替換。這里,0.5在IEEE754標準中32位單精度浮點的表示為0x3F000000,所以我們可以用以下代碼進行替代:

  static const union MyData

  {

  int i;

  float f;

  }sc_list[] = {

  10,

  0x3F000000,

  20

  };

  這就是一種Hack方法。感謝各位能看完此貼,本貼主要討論了關于黑客的一些科普介紹,并且沒有針對計算機與網(wǎng)絡系統(tǒng)攻擊做詳細介紹。因為此類文章其實也已經(jīng)有不少了,這里提供一篇比較不錯的關于緩存溢出攻擊的文章,講得比較詳細:http://www.cnblogs.com/fanzhidongyzby/archive/2013/08/10/3250405.html

  此外,如果大家想了解Linus Torvalds“炮轟”C++更詳細的信息,可見此貼:http://os.51cto.com/art/200709/55562.htm。

  C語言最為一門更接近硬件底層的高級編程語言具有非常良好的抽象力、表達力和靈活性。此外,它具有非常高效的運行時性能。所以C語言從1970年直到現(xiàn)在都作為系統(tǒng)級編程的首要編程語言。C語言博大精深,其思想也奠定了后續(xù)眾多語言的設計基礎,Linux/Unix、Windows、PHP、Redis、Android內(nèi)核等你耳熟能詳?shù)南到y(tǒng)、語言或者軟件都是基于C,可以說“無C語言,不編程”。

  如果對Hack C語言感興趣的,并想了解最新C11標準以及GNU11標準,掌握現(xiàn)代化C語言編程方法的朋友可以看看我最近剛出版的《C語言編程魔法書:基于C11標準》。京東鏈接為:https://item.jd.com/12737899067.html。

  作者介紹:zenny_chen,C語言與匯編語言重度用戶與擁躉者,現(xiàn)任上海證大喜馬拉雅高級工程師,曾任安沃傳媒移動客戶端及HTML5技術研發(fā)總監(jiān)兼首席科學家。多年高性能計算、嵌入式系統(tǒng)與移動互聯(lián)網(wǎng)實踐經(jīng)驗,深諳實時操作系統(tǒng)內(nèi)核、設備驅動研發(fā),對各種處理器架構、多媒體高性能計算編程以及移動端開發(fā)如數(shù)家珍,同時精通計算機底層基礎技術與各種編程語言,尤其精通C/C++,Java、Objective-C以及Swift!現(xiàn)任CocoaChina社區(qū)的Swift編程語言討論區(qū)以及代碼例子區(qū)的版主;App Store以及Mac App Store中CPU Dasher的作者。著有《C語言編程魔法書:基于C11標準》《OpenCL異構并行計算:原理、機制與優(yōu)化實踐》。

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1電子電路原理第七版PDF電子教材免費下載
  2. 0.00 MB  |  1490次下載  |  免費
  3. 2單片機典型實例介紹
  4. 18.19 MB  |  92次下載  |  1 積分
  5. 3S7-200PLC編程實例詳細資料
  6. 1.17 MB  |  27次下載  |  1 積分
  7. 4筆記本電腦主板的元件識別和講解說明
  8. 4.28 MB  |  18次下載  |  4 積分
  9. 5開關電源原理及各功能電路詳解
  10. 0.38 MB  |  10次下載  |  免費
  11. 6基于AT89C2051/4051單片機編程器的實驗
  12. 0.11 MB  |  4次下載  |  免費
  13. 7藍牙設備在嵌入式領域的廣泛應用
  14. 0.63 MB  |  3次下載  |  免費
  15. 89天練會電子電路識圖
  16. 5.91 MB  |  3次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234313次下載  |  免費
  3. 2PADS 9.0 2009最新版 -下載
  4. 0.00 MB  |  66304次下載  |  免費
  5. 3protel99下載protel99軟件下載(中文版)
  6. 0.00 MB  |  51209次下載  |  免費
  7. 4LabView 8.0 專業(yè)版下載 (3CD完整版)
  8. 0.00 MB  |  51043次下載  |  免費
  9. 5555集成電路應用800例(新編版)
  10. 0.00 MB  |  33562次下載  |  免費
  11. 6接口電路圖大全
  12. 未知  |  30320次下載  |  免費
  13. 7Multisim 10下載Multisim 10 中文版
  14. 0.00 MB  |  28588次下載  |  免費
  15. 8開關電源設計實例指南
  16. 未知  |  21539次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935053次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537791次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420026次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234313次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233045次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191183次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183277次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138039次下載  |  免費