舉報

會員
x86匯編與逆向工程:軟件破解與防護的藝術
(美)斯蒂芬妮·多馬斯 (美)克里斯托弗·多馬斯 著
更新時間:2025-02-10 16:07:07
開會員,本書免費讀 >
最新章節:
封底
本書以軟件反匯編技術為中心,首先帶領讀者從x86的基礎知識開始,學習如何讀取、編寫和構建賦能全球大量計算機的匯編語言;然后介紹如何使用IDA、Ghidra、Olly等業界最受歡迎的工具對應用程序進行逆向工程;接著介紹如何利用補丁和密鑰生成等技術進行軟件破解,所有這些都利用了匯編和逆向工程的知識;最后從防御的角度向讀者介紹相關技術,使他們能夠更好地保護自己的軟件。本書將引領好奇的讀者深入軟件破解和計算機的核心,探索其運作機制。深入學習x86計算機的運行原理,不僅對逆向工程和軟件破解來說至關重要,還能幫助讀者在代碼優化、效率提高、調試、編譯器設置調整以及芯片選擇等方面成為更出色的開發者。
最新章節
書友吧品牌:機械工業出版社
譯者:ChaMd5安全團隊
上架時間:2025-02-10 15:42:40
出版社:機械工業出版社
本書數字版權由機械工業出版社提供,并由其授權上海閱文信息技術有限公司制作發行
- 封底 更新時間:2025-02-10 16:07:07
- 譯者簡介
- 推薦閱讀
- 結語
- 17.3 總結
- 17.2.5 混合使用C語言和匯編語言
- 17.2.4 標準參數
- 17.2.3 _start與main()
- 17.2.2 在C代碼中使用x86函數
- 17.2.1 在x86代碼中使用C函數
- 17.2 關聯C代碼與x86匯編代碼
- 17.1.2 棧溢出與棧保護
- 17.1.1 shellcode
- 17.1 棧溢出
- 第17章 附加話題
- 16.10 總結
- 16.9 符號分析
- 16.8 定理證明器
- 16.7 去混淆
- 16.6 可視化
- 16.5 自動化結構恢復
- 16.4 反編譯
- 16.3 中間表示
- 16.2 二進制插樁
- 16.1 時間旅行調試
- 第16章 高級技術
- 15.2 總結
- 15.1.7 合法性
- 15.1.6 DMCA研究免責
- 15.1.5 合理使用
- 15.1.4 重要法庭判例
- 15.1.3 《版權法》
- 15.1.2 《計算機欺詐和濫用法案》
- 15.1.1 《數字千年版權法》
- 15.1 影響逆向工程的美國法律
- 第15章 法律
- 14.8 總結
- 14.7.2 要點
- 14.7.1 技能
- 14.7 實驗:進程監控
- 14.6.2 這是強大的保護機制嗎
- 14.6.1 遠程認證示例
- 14.6 遠程認證
- 14.5 黑名單
- 14.4.2 這是強大的保護機制嗎
- 14.4.1 如何運行白名單
- 14.4 白名單
- 14.3.3 這是強大的保護機制嗎
- 14.3.2 RASP的風險
- 14.3.1 鉤子函數
- 14.3 RASP
- 14.2.5 這是強大的保護機制嗎
- 14.2.4 代碼簽名與循環冗余校驗
- 14.2.3 代碼簽名有效嗎
- 14.2.2 如何驗證已簽名的應用程序
- 14.2.1 如何進行代碼簽名
- 14.2 代碼簽名
- 14.1 循環冗余校驗
- 第14章 檢測與預防
- 13.6 總結
- 13.5.2 攻克加密器
- 13.5.1 這種保護機制有用嗎
- 13.5 加密器/解密器
- 13.4.5 破解虛擬化技術
- 13.4.4 這是強大的保護機制嗎
- 13.4.3 虛擬化存在的問題
- 13.4.2 分層虛擬化
- 13.4.1 代碼虛擬化是如何工作的
- 13.4 虛擬化技術
- 13.3.2 要點
- 13.3.1 技能
- 13.3 實驗:檢測和脫殼
- 13.2.4 PEiD
- 13.2.3 破解加殼技術
- 13.2.2 這是強大的保護機制嗎
- 13.2.1 加殼器是如何工作的
- 13.2 加殼技術
- 13.1.4 軟件守護
- 13.1.3 水印
- 13.1.2 簽名
- 13.1.1 哈希
- 13.1 防篡改技術
- 第13章 高級防御技術
- 12.5 總結
- 12.4.2 要點
- 12.4.1 技能
- 12.4 實驗:反調試
- 12.3.7 攻克反調試技術
- 12.3.6 攻擊性反調試
- 12.3.5 目錄掃描
- 12.3.4 無效CloseHandle()調用
- 12.3.3 讀時間戳計數器
- 12.3.2 調試寄存器
- 12.3.1 IsDebuggerPresent()
- 12.3 反調試
- 12.2.2 要點
- 12.2.1 技能
- 12.2 實驗:混淆技術
- 12.1.4 攻克混淆器
- 12.1.3 混淆器
- 12.1.2 自動化混淆
- 12.1.1 評估混淆技術
- 12.1 混淆技術
- 第12章 防御
- 11.10 總結
- 11.9.2 要點
- 11.9.1 技能
- 11.9 實驗:使用IDA進行破解
- 11.8 Ghidra
- 11.7.2 要點
- 11.7.1 技能
- 11.7 實驗:IDA邏輯流程
- 11.6 IDA補丁
- 11.5.5 IDA:路徑
- 11.5.4 IDA:注釋
- 11.5.3 IDA:函數和變量
- 11.5.2 IDA:基本塊
- 11.5.1 IDA:字符串
- 11.5 IDA
- 11.4.2 要點
- 11.4.1 技能
- 11.4 實驗:破解LaFarge
- 11.3.6 Cheat Engine:獲取地址
- 11.3.5 Cheat Engine:復制字節
- 11.3.4 Cheat Engine:重寫程序
- 11.3.3 Cheat Engine:字符串引用
- 11.3.2 Cheat Engine:查看內存
- 11.3.1 Cheat Engine:打開進程
- 11.3 Cheat Engine
- 11.2 CodeFusion補丁
- 11.1 在010編輯器中打補丁
- 第11章 打補丁和高級工具
- 10.10 總結
- 10.9.2 要點
- 10.9.1 技能
- 10.9 實驗:使用Immunity進行破解
- 10.8.6 Immunity:重寫程序
- 10.8.5 Immunity:異常
- 10.8.4 Immunity:運行程序
- 10.8.3 Immunity:字符串
- 10.8.2 Immunity:模塊
- 10.8.1 Immunity:匯編代碼
- 10.8 使用Immunity調試工具進行調試
- 10.7.4 WinDbg
- 10.7.3 x86dbg
- 10.7.2 Immunity
- 10.7.1 OllyDbg
- 10.7 其他調試器
- 10.6.3 nop指令
- 10.6.2 在哪里打補丁
- 10.6.1 打補丁與密鑰生成
- 10.6 打補丁
- 10.5.2 小實驗:Windows計算器
- 10.5.1 示例
- 10.5 Resource Hacker
- 10.4.2 怎樣用Procmon輔助逆向工程和破解
- 10.4.1 示例:Notepad.exe
- 10.4 Procmon
- 10.3.2 要點
- 10.3.1 技能
- 10.3 實驗:密鑰生成器
- 10.2.4 對抗密鑰生成器
- 10.2.3 破解各種類型的密鑰檢查
- 10.2.2 密鑰生成的原理
- 10.2.1 為什么要創建密鑰生成器
- 10.2 密鑰生成器
- 10.1.5 其他的建議
- 10.1.4 最佳方法
- 10.1.3 更好的方法
- 10.1.2 合理的方法
- 10.1.1 不好的方法
- 10.1 密鑰檢查器
- 第10章 破解:工具和策略
- 9.4 總結
- 9.3.2 迭代注釋代碼
- 9.3.1 尋找感興趣的區域
- 9.3 逆向工程的策略
- 9.2.4 Dependency Walker
- 9.2.3 strings
- 9.2.2 ltrace和strace
- 9.2.1 objdump
- 9.2 基礎偵察
- 9.1.2 要點
- 9.1.1 技能
- 9.1 實驗:RE Bingo
- 第9章 逆向工程:工具和策略
- 8.3 總結
- 8.2.3 鏈接
- 8.2.2 剝離
- 8.2.1 優化
- 8.2 編譯器
- 8.1 尋找目標代碼入口點
- 第8章 編譯器和優化器
- 7.5 總結
- 7.4.7 需要記住的事情
- 7.4.6 宏觀程序
- 7.4.5 棧幀
- 7.4.4 cdecl
- 7.4.3 調用約定
- 7.4.2 棧分析
- 7.4.1 x86中的函數
- 7.4 函數調用與棧幀
- 7.3.2 x86棧
- 7.3.1 棧是如何工作的
- 7.3 棧
- 7.2.10 ||
- 7.2.9 &&
- 7.2.8 break
- 7.2.7 continue
- 7.2.6 switch (...){...}
- 7.2.5 for (...;...;...){...}
- 7.2.4 while (...){...}
- 7.2.3 do{...}while (...);
- 7.2.2 if(...){...}else{...}
- 7.2.1 if(...){...}
- 7.2 x86中的邏輯結構
- 7.1.2 控制流指令
- 7.1.1 指令指針
- 7.1 控制流
- 第7章 函數和控制流
- 6.7 總結
- 6.6 消除噪聲
- 6.5.2 要點
- 6.5.1 技能
- 6.5 實驗:鯊魚模擬器3000
- 6.4 段錯誤
- 6.3 gdb
- 6.2.2 硬件斷點
- 6.2.1 軟件斷點
- 6.2 斷點
- 6.1.2 調試
- 6.1.1 靜態分析與動態分析
- 6.1 二進制分析
- 第6章 分析和調試匯編代碼
- 5.2 總結
- 5.1.2 影響狀態標志的操作
- 5.1.1 eflags
- 5.1 條件碼
- 第5章 理解條件碼
- 4.7 總結
- 4.6.2 ASCII操作技巧
- 4.6.1 識別ASCII字符串
- 4.6 ASCII
- 4.5.2 要點
- 4.5.1 技能
- 4.5 實驗:Hello World
- 4.4 objdump
- 4.3.2 編寫匯編程序
- 4.3.1 Linux中的匯編與鏈接
- 4.3 匯編和鏈接
- 4.2.3 輸出字符串
- 4.2.2 sys_exit
- 4.2.1 sys_write
- 4.2 系統調用
- 4.1.2 由操作系統處理與顯卡的交互
- 4.1.1 控制引腳
- 4.1 輸出
- 第4章 構建和運行匯編程序
- 3.5 總結
- 3.4 常見的x86指令錯誤
- 3.3 整合所有內容
- 3.2.11 lea
- 3.2.10 nop
- 3.2.9 sar、sal
- 3.2.8 shr、shl
- 3.2.7 not
- 3.2.6 and、or、xor
- 3.2.5 div
- 3.2.4 mul
- 3.2.3 add、sub
- 3.2.2 inc、dec
- 3.2.1 mov
- 3.2 x86指令
- 3.1 x86指令格式
- 第3章 x86匯編:指令
- 2.7 總結
- 2.6.5 基址-索引尋址
- 2.6.4 索引尋址
- 2.6.3 基址加偏移量尋址
- 2.6.2 間接尋址
- 2.6.1 絕對尋址
- 2.6 尋址模式
- 2.5 內存訪問
- 2.4.2 寄存器的使用
- 2.4.1 x86中的寄存器
- 2.4 寄存器
- 2.3.3 處理二進制數
- 2.3.2 位、字節和字
- 2.3.1 數字系統的基數
- 2.3 數據表示
- 2.2 匯編語法
- 2.1 x86簡介
- 第2章 x86匯編:數據、模式、寄存器和內存訪問
- 1.4 總結
- 1.3.2 匯編
- 1.3.1 計算機架構
- 1.3 架構
- 1.2.2 要點
- 1.2.1 技能
- 1.2 實驗:反編譯
- 1.1.3 保護JIT語言
- 1.1.2 反編譯JIT語言
- 1.1.1 反編譯何時有用
- 1.1 反編譯
- 第1章 反編譯和架構
- 關于技術編輯
- 關于技術撰稿人
- 關于作者
- 前言
- 譯者序
- 作者簡介
- 版權信息
- 封面
- 封面
- 版權信息
- 作者簡介
- 譯者序
- 前言
- 關于作者
- 關于技術撰稿人
- 關于技術編輯
- 第1章 反編譯和架構
- 1.1 反編譯
- 1.1.1 反編譯何時有用
- 1.1.2 反編譯JIT語言
- 1.1.3 保護JIT語言
- 1.2 實驗:反編譯
- 1.2.1 技能
- 1.2.2 要點
- 1.3 架構
- 1.3.1 計算機架構
- 1.3.2 匯編
- 1.4 總結
- 第2章 x86匯編:數據、模式、寄存器和內存訪問
- 2.1 x86簡介
- 2.2 匯編語法
- 2.3 數據表示
- 2.3.1 數字系統的基數
- 2.3.2 位、字節和字
- 2.3.3 處理二進制數
- 2.4 寄存器
- 2.4.1 x86中的寄存器
- 2.4.2 寄存器的使用
- 2.5 內存訪問
- 2.6 尋址模式
- 2.6.1 絕對尋址
- 2.6.2 間接尋址
- 2.6.3 基址加偏移量尋址
- 2.6.4 索引尋址
- 2.6.5 基址-索引尋址
- 2.7 總結
- 第3章 x86匯編:指令
- 3.1 x86指令格式
- 3.2 x86指令
- 3.2.1 mov
- 3.2.2 inc、dec
- 3.2.3 add、sub
- 3.2.4 mul
- 3.2.5 div
- 3.2.6 and、or、xor
- 3.2.7 not
- 3.2.8 shr、shl
- 3.2.9 sar、sal
- 3.2.10 nop
- 3.2.11 lea
- 3.3 整合所有內容
- 3.4 常見的x86指令錯誤
- 3.5 總結
- 第4章 構建和運行匯編程序
- 4.1 輸出
- 4.1.1 控制引腳
- 4.1.2 由操作系統處理與顯卡的交互
- 4.2 系統調用
- 4.2.1 sys_write
- 4.2.2 sys_exit
- 4.2.3 輸出字符串
- 4.3 匯編和鏈接
- 4.3.1 Linux中的匯編與鏈接
- 4.3.2 編寫匯編程序
- 4.4 objdump
- 4.5 實驗:Hello World
- 4.5.1 技能
- 4.5.2 要點
- 4.6 ASCII
- 4.6.1 識別ASCII字符串
- 4.6.2 ASCII操作技巧
- 4.7 總結
- 第5章 理解條件碼
- 5.1 條件碼
- 5.1.1 eflags
- 5.1.2 影響狀態標志的操作
- 5.2 總結
- 第6章 分析和調試匯編代碼
- 6.1 二進制分析
- 6.1.1 靜態分析與動態分析
- 6.1.2 調試
- 6.2 斷點
- 6.2.1 軟件斷點
- 6.2.2 硬件斷點
- 6.3 gdb
- 6.4 段錯誤
- 6.5 實驗:鯊魚模擬器3000
- 6.5.1 技能
- 6.5.2 要點
- 6.6 消除噪聲
- 6.7 總結
- 第7章 函數和控制流
- 7.1 控制流
- 7.1.1 指令指針
- 7.1.2 控制流指令
- 7.2 x86中的邏輯結構
- 7.2.1 if(...){...}
- 7.2.2 if(...){...}else{...}
- 7.2.3 do{...}while (...);
- 7.2.4 while (...){...}
- 7.2.5 for (...;...;...){...}
- 7.2.6 switch (...){...}
- 7.2.7 continue
- 7.2.8 break
- 7.2.9 &&
- 7.2.10 ||
- 7.3 棧
- 7.3.1 棧是如何工作的
- 7.3.2 x86棧
- 7.4 函數調用與棧幀
- 7.4.1 x86中的函數
- 7.4.2 棧分析
- 7.4.3 調用約定
- 7.4.4 cdecl
- 7.4.5 棧幀
- 7.4.6 宏觀程序
- 7.4.7 需要記住的事情
- 7.5 總結
- 第8章 編譯器和優化器
- 8.1 尋找目標代碼入口點
- 8.2 編譯器
- 8.2.1 優化
- 8.2.2 剝離
- 8.2.3 鏈接
- 8.3 總結
- 第9章 逆向工程:工具和策略
- 9.1 實驗:RE Bingo
- 9.1.1 技能
- 9.1.2 要點
- 9.2 基礎偵察
- 9.2.1 objdump
- 9.2.2 ltrace和strace
- 9.2.3 strings
- 9.2.4 Dependency Walker
- 9.3 逆向工程的策略
- 9.3.1 尋找感興趣的區域
- 9.3.2 迭代注釋代碼
- 9.4 總結
- 第10章 破解:工具和策略
- 10.1 密鑰檢查器
- 10.1.1 不好的方法
- 10.1.2 合理的方法
- 10.1.3 更好的方法
- 10.1.4 最佳方法
- 10.1.5 其他的建議
- 10.2 密鑰生成器
- 10.2.1 為什么要創建密鑰生成器
- 10.2.2 密鑰生成的原理
- 10.2.3 破解各種類型的密鑰檢查
- 10.2.4 對抗密鑰生成器
- 10.3 實驗:密鑰生成器
- 10.3.1 技能
- 10.3.2 要點
- 10.4 Procmon
- 10.4.1 示例:Notepad.exe
- 10.4.2 怎樣用Procmon輔助逆向工程和破解
- 10.5 Resource Hacker
- 10.5.1 示例
- 10.5.2 小實驗:Windows計算器
- 10.6 打補丁
- 10.6.1 打補丁與密鑰生成
- 10.6.2 在哪里打補丁
- 10.6.3 nop指令
- 10.7 其他調試器
- 10.7.1 OllyDbg
- 10.7.2 Immunity
- 10.7.3 x86dbg
- 10.7.4 WinDbg
- 10.8 使用Immunity調試工具進行調試
- 10.8.1 Immunity:匯編代碼
- 10.8.2 Immunity:模塊
- 10.8.3 Immunity:字符串
- 10.8.4 Immunity:運行程序
- 10.8.5 Immunity:異常
- 10.8.6 Immunity:重寫程序
- 10.9 實驗:使用Immunity進行破解
- 10.9.1 技能
- 10.9.2 要點
- 10.10 總結
- 第11章 打補丁和高級工具
- 11.1 在010編輯器中打補丁
- 11.2 CodeFusion補丁
- 11.3 Cheat Engine
- 11.3.1 Cheat Engine:打開進程
- 11.3.2 Cheat Engine:查看內存
- 11.3.3 Cheat Engine:字符串引用
- 11.3.4 Cheat Engine:重寫程序
- 11.3.5 Cheat Engine:復制字節
- 11.3.6 Cheat Engine:獲取地址
- 11.4 實驗:破解LaFarge
- 11.4.1 技能
- 11.4.2 要點
- 11.5 IDA
- 11.5.1 IDA:字符串
- 11.5.2 IDA:基本塊
- 11.5.3 IDA:函數和變量
- 11.5.4 IDA:注釋
- 11.5.5 IDA:路徑
- 11.6 IDA補丁
- 11.7 實驗:IDA邏輯流程
- 11.7.1 技能
- 11.7.2 要點
- 11.8 Ghidra
- 11.9 實驗:使用IDA進行破解
- 11.9.1 技能
- 11.9.2 要點
- 11.10 總結
- 第12章 防御
- 12.1 混淆技術
- 12.1.1 評估混淆技術
- 12.1.2 自動化混淆
- 12.1.3 混淆器
- 12.1.4 攻克混淆器
- 12.2 實驗:混淆技術
- 12.2.1 技能
- 12.2.2 要點
- 12.3 反調試
- 12.3.1 IsDebuggerPresent()
- 12.3.2 調試寄存器
- 12.3.3 讀時間戳計數器
- 12.3.4 無效CloseHandle()調用
- 12.3.5 目錄掃描
- 12.3.6 攻擊性反調試
- 12.3.7 攻克反調試技術
- 12.4 實驗:反調試
- 12.4.1 技能
- 12.4.2 要點
- 12.5 總結
- 第13章 高級防御技術
- 13.1 防篡改技術
- 13.1.1 哈希
- 13.1.2 簽名
- 13.1.3 水印
- 13.1.4 軟件守護
- 13.2 加殼技術
- 13.2.1 加殼器是如何工作的
- 13.2.2 這是強大的保護機制嗎
- 13.2.3 破解加殼技術
- 13.2.4 PEiD
- 13.3 實驗:檢測和脫殼
- 13.3.1 技能
- 13.3.2 要點
- 13.4 虛擬化技術
- 13.4.1 代碼虛擬化是如何工作的
- 13.4.2 分層虛擬化
- 13.4.3 虛擬化存在的問題
- 13.4.4 這是強大的保護機制嗎
- 13.4.5 破解虛擬化技術
- 13.5 加密器/解密器
- 13.5.1 這種保護機制有用嗎
- 13.5.2 攻克加密器
- 13.6 總結
- 第14章 檢測與預防
- 14.1 循環冗余校驗
- 14.2 代碼簽名
- 14.2.1 如何進行代碼簽名
- 14.2.2 如何驗證已簽名的應用程序
- 14.2.3 代碼簽名有效嗎
- 14.2.4 代碼簽名與循環冗余校驗
- 14.2.5 這是強大的保護機制嗎
- 14.3 RASP
- 14.3.1 鉤子函數
- 14.3.2 RASP的風險
- 14.3.3 這是強大的保護機制嗎
- 14.4 白名單
- 14.4.1 如何運行白名單
- 14.4.2 這是強大的保護機制嗎
- 14.5 黑名單
- 14.6 遠程認證
- 14.6.1 遠程認證示例
- 14.6.2 這是強大的保護機制嗎
- 14.7 實驗:進程監控
- 14.7.1 技能
- 14.7.2 要點
- 14.8 總結
- 第15章 法律
- 15.1 影響逆向工程的美國法律
- 15.1.1 《數字千年版權法》
- 15.1.2 《計算機欺詐和濫用法案》
- 15.1.3 《版權法》
- 15.1.4 重要法庭判例
- 15.1.5 合理使用
- 15.1.6 DMCA研究免責
- 15.1.7 合法性
- 15.2 總結
- 第16章 高級技術
- 16.1 時間旅行調試
- 16.2 二進制插樁
- 16.3 中間表示
- 16.4 反編譯
- 16.5 自動化結構恢復
- 16.6 可視化
- 16.7 去混淆
- 16.8 定理證明器
- 16.9 符號分析
- 16.10 總結
- 第17章 附加話題
- 17.1 棧溢出
- 17.1.1 shellcode
- 17.1.2 棧溢出與棧保護
- 17.2 關聯C代碼與x86匯編代碼
- 17.2.1 在x86代碼中使用C函數
- 17.2.2 在C代碼中使用x86函數
- 17.2.3 _start與main()
- 17.2.4 標準參數
- 17.2.5 混合使用C語言和匯編語言
- 17.3 總結
- 結語
- 推薦閱讀
- 譯者簡介
- 封底 更新時間:2025-02-10 16:07:07