-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
3/26 新書到! 3/19 新書到! 3/14 新書到! 12/12 新書到!
購書流程Q & A站務留言版客服信箱
3ds MaxMayaRhinoAfter EffectsSketchUpZBrushPainterUnity
PhotoShopAutoCadMasterCamSolidWorksCreoUGRevitNuke
C#CC++Java遊戲程式Linux嵌入式PLCFPGAMatlab
駭客資料庫搜索引擎影像處理FluentVR+ARANSYS深度學習
單晶片AVROpenGLArduinoRaspberry Pi電路設計CadenceProtel
HadoopPythonStm32CortexLabview手機程式AndroidiPhone
可查書名,作者,ISBN,3dwoo書號
詳細書籍分類

老碼識途:從機器碼到框架的系統觀逆向修煉之路

( 簡體 字)
作者:韓宏 李林類別:1. -> 程式設計 -> 綜合
譯者:
出版社:電子工業出版社老碼識途:從機器碼到框架的系統觀逆向修煉之路 3dWoo書號: 33579
詢問書籍請說出此書號!

缺書
NT售價: 280

出版日:8/1/2012
頁數:344
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 版 )
加入購物車 加到我的最愛
(請先登入會員)
ISBN:9787121173820
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證)
作者序:

譯者序:

前言:


——“碼”途有道何為徑

你主要能得到什么
如果你想成為高級程序員或架構師,什么才是技術上的核心競爭力?僅僅是知識?在這個隨時可求助于谷歌和百度的年代,知識似乎已變得非常廉價。而青春的流失并不能給我們留下技術財富,似乎只是將我們變成自嘲的“碼奴”。
核心競爭力究竟在哪里?本書認為,一個關鍵要素就是“系統觀”,這是高級軟件人才必備的素質。系統觀是美妙的,它能自我生長,自我完善,你有了它就擁有了一顆能成長的原核。系統觀是核心知識架構和對它們不斷運用所形成的思維方式的復合體。本書的首要任務就是幫助大家建立系統觀。
本書采用獨特的自底向上貫通的方式幫助讀者完成系統觀的構建,從反匯編、機器碼入手,以逆向分析貫穿,運用一點點增加的知識不斷探索出新知識并最終上升到框架。
本書采用生長式的學習方法,每個后續章節都是運用前面內容探索而出的,既讓你制造“磚頭”,又讓你用它建造“大廈”。讀完本書后,你不僅能掌握一個小而全的可自我發展的核心知識架構,更能掌握一種被筆者稱為“猜測—實證—構建”的系統觀的思維與學習方法。你將經歷一次暢快的知識探索發現之旅。
你還能得到什么
修煉完本書后,除了系統觀這一主要成果,你還能獲得一些有意思的能力,比如:
掌握被稱為“調構學習法”的第三方源代碼學習方法(成為架構師的重要能力)。
在C語言中模擬面向對象的繼承、封裝、虛函數覆蓋等。
用病毒常用的自定位代碼技術解決框架級軟件的優雅構造。
利用鉤子技術,在只有執行程序的條件下改變第三方軟件的行為。
運用鏈接原理自己動手鏈接OBJ文件,使其可執行。
……
對筆者而言,這是一本關于“探索知識、讓知識融入生命”的書;是一本關于能力與學習的書;是一本展示如何將看似瑣碎的知識碎片不斷打磨成珠玉,慢慢串成美麗珠寶的書;是一本展示編程手藝如何自我鍛造的書。最終,它不過是與大家分享碼途人生的飛絮囈語。
學什么?少即多:系統觀
學什么?記得在Internet還沒有成為主流的時代,有個學通信的碩士被一個IP路由器問題困擾了一個多禮拜。筆者最好的朋友,學空氣動力學的,他玩了10多年DOS系統,從沒實際接觸過網絡,只是“看”過一本資料,還不是IP網絡,僅花兩天就解決了這個問題。為什么有人學了很多技術和語言卻不如未學習該技術的人呢?該問題另一個問法就是“什么才是我們最需要掌握的?”
筆者的看法是:“少就是多,將這個少變成多”。下足工夫,將“少”做深、做厚、變多,就是將來應對千變萬化的舵。這個“少”就是計算機的系統觀。看看上面的例子,那個朋友對DOS的熟悉已經到了任何一段地址空間作用都了如指掌的地步,自己還實現過一個漢化的DOS。這無疑是建立起堅實系統觀。這個系統觀能指導他按照計算機的“邏輯”方式思考,而路由器不過是這種思維方式的一個例子罷了。有了系統觀,學習新東西時,用它去猜測、構想學習對象的可能做法并實證分析,是一種迅捷的辦法。筆者處理SaaS軟件中的hibernate將同一持久化對象存入不同庫的問題時就是這樣,雖然沒用過hibernate,但通過猜測和調試,用了約半天時間就解決了問題(搜索并非銀彈,該問題當時在網絡的中英文查詢中均未查到)。
到底什么是系統觀?有些東西只可意會難以言傳,且見仁見智。這時,糾結含義不如能夠運用。詩詞意境頗似系統觀,詩人自身可能都說不清其內涵,可他能運用這種意境,“運用為王”。其實,我們只要能建立系統觀就好了。
如何建立?一種方法是從無到有自己撰寫一個系統級軟件(哪怕是實驗性的),如嵌入式數據庫、小型操作系統或編譯器。這非常有效,那位朋友得益于撰寫漢化DOS的經歷,在沒有學過嵌入式的情況下,一個月時間就解密了一個單片機太陽能系統,并漢化。但這種方法需要較長一段時間完全投入,且難度不小。針對這些問題,本書給出了另一種方法。
本書內容:逆向入道,自底向上建立系統觀
在建立系統觀方面,本書沒選擇非常正規的站馬步的方式:構建一個操作系統或編譯器,而是提供了一種劍走偏鋒的方法:自底向上,以逆向反匯編入道,貫穿從機器碼至框架的學習。因為,逆向是一把匕首,小巧,卻能劈開黑箱直見根本,實乃實證利器。
本書涉及范圍既廣也窄。從“廣”來說,覆蓋了匯編、反匯編、逆向、調試、鏈接、線程、插件風格編程、設計模式、對象模型和機制、框架源代碼學習等內容。從“窄”來講,本書緊緊圍繞運用基礎知識這把瑞士軍刀,披荊斬棘,最終建立系統觀這一主旨。同時,本書不僅讓我們多了一種能力(書中各章節均給出一些調試技巧),更將OS、Compiler等相關知識從壓箱底處翻到臺面上,并通過逆向有效整合在一起。你會發現,這些原來似乎抽象的知識,完全滲透到我們破疑解惑的過程中了。
本書由7章構成,其中第6章(除6.5節)為李林著,其余為韓宏著。
第1章是最重要的基礎,以逆向反匯編角度建立了語言的物理模型,充分利用GUI調試環境,將所有知識點做到可“把玩”。例如,在分析mov指令機器碼時,通過斷點,并利用內存窗體修改機器碼,從而改變C語言賦值語句的效果,也展現了一種學習匯編的方法——基于分析RTL(runtime library)的學習方式。本章還充分展示了“猜測—實證—構建”的思想。
第2章展現基礎知識的底層力量,給出多個運用前章逆向知識解決問題的例子。其中有的例子應該是首次公開的。本章揭示出逆向分析的力量,不僅可運用于加密、解密,而且真的能指導我們解決平常的開發難題。部分內容覆蓋了鉤子、異常、注入等技術。
第3章呈現以構建為驅動的軟件開發學習方式,知識覆蓋鏈接器、測試驅動開發、數據結構、軟件重用、文件訪問等。內容有其特點,如以構建的角度學習了鏈接器相關知識,并創建了一個最小“Linker”演示。在后續動態鏈接庫運用中,以此為基礎解決了棘手問題。
第4章以創造面向對象語言方式,展示了對象模型、機制及其重要特點和使用模式,涉及構造、析構、基于棧構造技巧、虛函數機制等。這種創造的方式集中體現了猜測、實證的思想,在理解的基礎上深入探討了在C語言中如何運用面向對象思想,給出了相關宏;并分析了一些重要設計原則及其在C++中的利弊和不同語種的權衡。以逆向思維貫穿所有問題的解決是本章的特點。
第5章構建了一個跨平臺線程類,充分利用了第4章的知識,最終創建了跨平臺線程庫,并展示不同語言下虛函數機制導致的軟件設計不同以及bug的解決過程。從設計到debug的過程體現了系統觀和底層調試的重要。
第6章在第4章基礎上展示了一個實用插件框架的演化,在不修改已有代碼前提下,運行時為系統添加新功能。其中,DLL內存釋放bug的解決充分展示了調試和系統觀的力量。
第7章討論了如何閱讀優秀源代碼的方法與技巧。這不僅是程序員成長的重要手段,也是開源時代的重要能力(對一個框架,在資料匱乏之下,你必須快速擴展框架,加入自己需要的功能)。以分析VCL框架為例,并對比MFC,結合框架閱讀和創建,展現了被筆者稱為“調構學習法”的源代碼學習方法。調試、追蹤、分析了自定位機器碼解決this指針獲取的問題,并模仿這一機制創建了可重用的窗體控件框架。本章將猜測—實證—構建思想貫穿到了框架源代碼學習和構建中。
我的碼道:三步斬“碼”刀
修煉系統觀不是簡單知識積累,需要一種道。筆者的“道”就是:猜測—實證—構建。
“猜測”讓我們主動思考,發現問題。這樣學習不再是按部就班,而是“尋找式”,對癥下藥,有選擇地吸收,迅速且準確,直指癥結。如1.3.1節學習call指令時,不直接看其解釋,而是先分析機器碼,猜測哪部分可能包含轉跳地址,最后經多次猜測實證才搞清楚。這樣,將一般被動接受式學習變成了主動研究式的破疑。簡單地說,學習任何不懂的技術或框架前先不要急于看它怎么做,而想想自己怎么做,要想到可實證的細節,否則無意義。
“實證”體現為每個知識點都可觸摸:或調試、或編程、或使用,能驗證。許多人猜測后認為一些東西“很顯然”,而不驗證,此時“真知”就從指間溜走了。如2.9.3節猜測狀態保存時,細分了局部變量、參數,并考慮優化。實證與猜測相悖處即產生前進動力:我們常感嘆不善提問,而實證就是最好的發問者。實證時往往一個知識點牽扯了很多復雜因素,看來幾乎無法實證。此時關鍵就是“領悟精髓,刪繁就簡”。本書第3章展示了如何通過摸索理清鏈接關鍵邏輯,構建一個2~3天能完成的Linker核心小程序。
“構建”要求盡量將學到的知識通過編寫程序模仿出來。這非常有助于以系統觀思考問題。而構建中會出現意想不到的問題,它們又是進步的階梯。比如,多年前學習《Windows核心編程》中內存訪問API時,筆者拋開書上例子,用這些API編寫了游戲修改器。之后就發現了問題:遍歷整個線性地址空間尋找某個整數耗時太長,速度完全無法與真正的修改器比擬。最后基于最基本的對齊原理解決,就不用挨個字節搜索。基礎知識在一個個構建、意外及調試解決中被貫穿起來,終成系統觀。本書每章均有展現構建的威力。
其實“碼”途之道最重要的就是“快樂”。有了它,你就有了自己的“道”。在本書中,你能看到面對問題的興奮和努力探索的快樂。如第2章最后兩個例子,就是筆者大年初一連續幾天瘋狂逆向的結果。一個個失望和驚喜后,清亮的陽光穿過0/1 bit的迷霧曬到皮膚上,這是生命的味道。
如何使用本書
讀者有一定的C和C++基礎知識就可上路了,你不需要很懂匯編,我們會一點點探索。中途遇到什么概念不懂,可上網查閱學習。既然強調體驗式,你就將本書當成游戲攻略吧,你一定要在計算機上“玩”成這個“游戲”,而不是在床頭“看”它,要通關哦。隨書附帶了源代碼,但你不要直接用,請自己實現一次,將源碼當做答案吧。(所有源代碼并沒有采用附盤的形式提供給讀者,而是采取網站免費下載的方式,讀者可以登錄http://www.phei.com.cn或者http://www.hxedu.com.cn進行下載。)
本書以VS 2008為主要調試環境,還用到其他工具:Delphi、Ultraedit、PELord、PEView和IDA pro。
書中解決問題的體驗式過程只從文字看(特別糾纏了反匯編后)容易迷失,所以每章都挑選了一個較難的案例編寫了思維導圖(除第7章外),讀者可配合使用。通過導圖的符號 能索引正文;通過頁側的標記又可快速定位導圖中位置,以便來回參閱,理順思路。
結束前來一首打油詩以抒心意:
人被“碼”馴為碼奴,
何日馴“碼”騁康途。
老“碼”識途途何在,
三步斬“碼”刀自出。
我的斬“碼”刀就是“猜測—實證—構建”,你的呢?
最后感謝家人、朋友與學生(特別是陳松進行了細致的校對),他們在著書的過程中給予了筆者莫大支持并提供了寶貴意見。另致謝高輝老師,他就strlen的算法給出了證明。


韓 宏
二?一二年八月
內容簡介:

本書以逆向反匯編為線索,自底向上,從探索者的角度,原生態地刻畫了對系統機制的學習,以及相關問題的猜測、追蹤和解決過程,展現了系統級思維方式的淬煉方法。該思維方式是架構師應具備的一種重要素質。本書內容涉及反匯編、底層調試、鏈接、加載、鉤子、異常處理、測試驅動開發、對象模型和機制、線程類封裝、跨平臺技術、插件框架、設計模式、GUI框架設計等。書中包含不少工業級或非公開案例。讀者不僅能以底層觀和調試技巧解決各種實際問題;還可掌握一套學習方法,如“猜測—實證—構建”,調構學習法。

目錄:

第1章 欲向碼途問大道,鏘鏘bit是吾刀 1
1.1 全局變量引發的故事 2
1.1.1 剖析賦值語句機器碼 2
1.1.2 修改賦值語句機器碼 6
1.1.3 直接構建新的賦值語句 7
1.1.4 小結 10
1.2 理解指針和指針強制轉換 11
1.2.1 指針和它丟失的類型信息 11
1.2.2 指針強制轉換 13
1.3 函數調用和局部變量 15
1.3.1 計算指令中的跳轉地址 15
1.3.2 返回故鄉的準備 16
1.3.3 給函數傳遞參數 17
1.3.4 函數獲取參數 18
1.3.5 局部變量 20
1.3.6 返回故鄉 20
1.3.7 返回點什么 23
1.3.8 掃尾工作 28
1.3.9 調用慣例 30
1.3.10 函數指針 31
1.4 數組、結構體 34
1.4.1 數組 34
1.4.2 結構體 35
1.5 無法溝通——對齊的錯誤 37
1.5.1 結構體對齊 37
1.5.2 無法溝通 41
1.6 switch語句的思考 44
1.6.1 switch機制探索 45
1.6.2 switch語句一定比if-else語句快嗎 50
1.6.3 switch的再次優化 50
1.7 關于其他高級語言要素的反匯編學習 54
1.8 全局變量的疑問——重定位和程序結構 54
1.8.1 獨一無二的全局變量? 54
1.8.2 不變的地址和重定位 56
1.8.3 動態鏈接庫中的重定位 64
1.9 匯編的學習之路——閱讀RTL 68
1.10 程序設置說明 76
習題1 76

第2章 庖丁解“碼”:底層的力量與樂趣 79
2.1 解密之hello world 80
2.2 奇怪的死循環 83
2.3 我們都犯過的錯——指針的指針 85
2.4 互通的障礙(跨語種調用) 87
2.5 錯誤的目的地 90
2.6 網絡發送出錯了 91
2.7 為什么代碼運行完畢卻出錯 93
2.8 失效的管道 96
2.8.1 管道的力量 97
2.8.2 我要控制Telnet客戶端 101
2.8.3 不是所有管道都可抽象等價 101
2.8.4 一動不動的48小時 103
2.9 異常世界歷險記 112
2.9.1 學習基礎概念 112
2.9.2 如何返回 113
2.9.3 那些狀態保存到哪里了 117
2.9.4 意外的秘密 120
習題2 127

第3章 成長:與程序一起茁壯 131
3.1 初寫系統 132
3.1.1 代碼風格 132
3.1.2 常量 133
3.1.3 最簡單的電話簿(1):功能設計和相關庫函數學習 134
3.1.4 最簡單的電話簿(2):系統實現,分割函數 141
3.1.5 空字符結尾串的警覺 143
3.1.6 讓程序更有組織性 144
3.2 有序的世界:可測試與跟蹤的系統 146
3.2.1 電話簿擴展(1):硬盤結構體數組 146
3.2.2 指針的陷阱 148
3.2.3 動態數組 149
3.2.4 變化的壓力與出路:重構、單元測試和日志 151
3.2.5 電話簿擴展(2): 可測試的恩賜 155
3.3 優雅的積木 155
3.3.1 可復用硬盤數組 155
3.3.2 分享它(1):理解編譯鏈接過程 161
3.3.3 分享它(2):我的丑陋鏈接器 167
3.3.4 分享它(3):靜態鏈接庫 173
3.3.5 分享它(4):動態鏈接庫 175
3.3.6 積木的藝術 178
習 題 3 182

第4章 讓我們創造面向對象語言吧 185
4.1 “封裝”數據函數合一,陳倉暗度this傳遞 186
4.1.1 那些討厭的事 186
4.1.2 像芯片一樣工作(1):數據合一 187
4.1.3 像芯片一樣工作(2):行為與數據合一 188
4.1.4 不想讓你傳遞“自己” 189
4.1.5 創造吧,新的語言 190
4.1.6 是這樣嗎?我們需要證明 191
4.2 太麻煩了,需要更簡單的創造與銷毀 194
4.2.1 創造構造和析構函數 194
4.2.2 構造中分配資源,析構中釋放資源 197
4.3 對比C語言的“對象”和面向對象 199
4.4 體驗封裝的力量 201
4.4.1 生死原點,整體資源管理 201
4.4.2 文件流 203
4.5 整體資源管理的愛恨 204
4.5.1 擴展技巧:保證成對出現,巧妙的自動線程鎖 204
4.5.2 美麗的幻影:不可靠的自動析構 205
4.5.3 隱藏的敵人:不請而至的析構和拷貝構造 206
4.6 封裝之強化:內外之別,親疏之分 209
4.6.1 私有的誕生 209
4.6.2 私有?阻止不了我 210
4.6.3 理解繼承的機制(1):模型 211
4.6.4 理解繼承的機制(2):在C語言中“玩”繼承 214
4.6.5 保護的誕生 218
4.7 “變”的煩惱與出路:創造虛函數 218
4.7.1 “三變”之苦:格式化字符串 218
4.7.2 函數指針,請帶我走出不斷修改的泥潭 220
4.7.3 再進一步:做成對象 221
4.7.4 我們需要性能更好的版本 223
4.7.5 我們需要新語法,創造虛函數吧 225
4.7.6 驗證虛表機制(1):反匯編分析 226
4.7.7 驗證虛表機制(2):直接用虛表來調用虛函數 227
4.8 虛函數的那些事兒 227
4.8.1 理解“=” 227
4.8.2 純虛函數,從dll導入對象 230
4.8.3 C語言實現虛函數 231
4.8.4 魂歸何處:析構之“虛” 232
4.8.5 理解運行期類型判斷dynamic_cast 232
4.9 靜態覆蓋 235
4.10 靜態與非靜態成員函數的區別 235
4.11 遙遠的風景:管窺 .NET對象 235
習題4 236

第5章 底層與抽象的混沌:一個跨平臺線程類的封裝、錯誤與進化 239
5.1 先學習多線程編程吧 240
5.1.1 概念 240
5.1.2 Windows下的線程接口 240
5.1.3 第一個線程程序 242
5.1.4 那些復雜的參數和bug 243
5.2 簡單、重用,讓我們構造線程類吧 247
5.2.1 無賴的嘗試,原來是它——static 248
5.2.2 可愛的virtual和可恨的this 249
5.2.3 私有、保護、公有、只讀、純虛函數,一個都不能少 251
5.2.4 析構中釋放資源 252
5.2.5 我們發現了一個設計模式 252
5.2.6 我關心,你通知——我們的第二個設計模式 253
5.3 跨平臺的線程設計 255
5.3.1 討厭的Linux版本 255
5.3.2 源代碼跨平臺技術 256
5.3.3 跨平臺的版本 257
5.4 崩潰,哪里出錯了 262
5.4.1 尋找錯誤 262
5.4.2 C++下整體資源管理的反思 265
5.4.3 生生死死虛表誤,剝離策略世界殊——重生 267
習題5 268

第6章 插件養成記 271
6.1 一個修改已有功能的實例 272
6.2 一個可以動態添加功能的簡單實例 273
6.3 一個可以動態添加功能的復雜實例 276
6.4 從函數到插件對象 280
6.5 delete的災難:誰的書 283
6.5.1 釋放內存的崩潰 283
6.5.2 解決之道:新生活,各管各 288
習題6 291

第7章 天堂的階梯 293
7.1 遙望天堂,那些美麗與簡潔我向往 294
7.2 從最基礎開始吧,SDK編寫窗體程序 295
7.2.1 hello window和基本原理 295
7.2.2 來個復雜點的窗體程序 298
7.3 構建我的GUI組件(1):簡單組件 300
7.4 構建我的GUI組件(2):天堂的機器碼跳板 304
7.4.1 調試,我要看清你 304
7.4.2 我們的自定位代碼 313
7.4.3 自定位代碼版Button類 314
7.4.4 自定位代碼版Form類 315
7.4.5 為什么不錯呢 316
7.5 構建我的GUI組件(3):更多的組件 317
7.6 天堂階梯,玩賞框架那如花散落的繁復與如索串珠的簡潔之美 319
7.7 構建我的GUI組件(4):我的天堂 326
7.8 他們的天堂 330
習題7 332
序: