成功加入购物车
已消毒,正版现货,单本实拍,二次塑封发货,内页干净无写划
Dennis 、Yurichev、 丹尼斯 著;Archer、安天安全研究与应急处理中心 译 / 人民邮电出版社 / 2017-03 / 平装
售价 ¥ 182.00
品相 九品
延迟发货说明
上书时间2026-05-27
卖家超过10天未登录
逆向工程权威指南
逆向工程是一种分析目标系统的过程,旨在于识别系统的各组件以及组件间关系,以便于通过其它形式、或在较高的抽象层次上,重建系统的表征。
本书专注于软件的逆向工程,是写给初学者的一本经典指南。全书共分为12个部分,共102章,涉及X86/X64、ARM/ARM-64、MIPS、Java/JVM等重要话题,详细解析了Oracle RDBMS、Itanium、软件狗、LD_PRELOAD、栈溢出、ELF、Win32 PE文件格式、x86-64(第、critical sections、syscalls、线程本地存储TLS、地址无关代码(PIC)、以配置文件为导向的优化、C++ STL、OpenMP、SHE等众多技术话题,堪称是逆向工程技术百科全书。除了详细讲解,本书来给出了很多习题来帮助读者巩固所学的知识,附录部分给出了习题的解答。
本书适合对逆向工程技术、操作系统底层技术、程序分析技术感兴趣的读者阅读,也适合专业的程序开发人员参考。
Dennis Yurichev,乌克兰程序员,安全技术专家。读者可以
通过https://yurichev.com/联系他,并获取和本书相关的更多
学习资料。
第一部分 编码模式第1章 CPU简介 31.1 指令集的作用 3第2章 最简函数 52.1 x86 52.2 ARM 52.3 MIPS 52.3.1 MIPS指令集与寄存器名称 6第3章 Hello,world! 73.1 x86 73.1.1 MSVC 73.1.2 GCC 93.1.3 GCC:AT&T语体 93.2 x86-64 113.2.1 MSVC-x86-64 113.2.2 GCC-x86-64 123.3 GCC的其他特性 123.4 ARM 133.4.1 Keil 6/2013——未启用优化功能的ARM模式 143.4.2 Thumb模式下、未开启优化选项的Keil 153.4.3 ARM模式下、开启优化选项的Xcode 153.4.4 Thumb-2模式下、开启优化选项的Xcode(LLVM) 163.4.5 ARM64 183.5 MIPS 193.5.1 全局指针Global pointer 193.5.2 Optimizing GCC 193.5.3 Non-optimizing GCC 213.5.4 栈帧 233.5.5 Optimizing GCC: GDB的分析方法 233.6 总结 243.7 练习 243.7.1 题目1 243.7.2 题目2 24第4章 函数序言和函数尾声 254.1 递归调用 25第5章 栈 265.1 为什么栈会逆增长? 265.2 栈的用途 275.2.1 保存函数结束时的返回地址 275.2.2 参数传递 285.2.3 存储局部变量 295.2.4 x86:alloca()函数 295.2.5 (Windows)SEH结构化异常处理 315.2.6 缓冲区溢出保护 315.3 典型的栈的内存存储格式 315.4 栈的噪音 315.5 练习题 345.5.1 题目1 345.5.2 题目2 34第6章 printf()函数与参数调用 366.1 x86 366.1.1 x86:传递3个参数 366.1.2 x64:传递9个参数 416.2 ARM 446.2.1 ARM模式下传递3个参数 446.2.2 ARM模式下传递8个参数 466.3 MIPS 506.3.1 传递3个参数 506.3.2 传递9个参数 526.4 总结 566.5 其他 57第7章 scanf() 587.1 演示案例 587.1.1 指针简介 587.1.2 x86 587.1.3 MSVC+OllyDbg 607.1.4 x64 627.1.5 ARM 637.1.6 MIPS 647.2 全局变量 657.2.1 MSVC:x86 667.2.2 MSVC:x86+OllyDbg 677.2.3 GCC:x86 687.2.4 MSVC:x64 687.2.5 ARM: Optimizing Keil 6/2013(Thumb模式) 697.2.6 ARM64 707.2.7 MIPS 707.3 scanf()函数的状态监测 747.3.1 MSVC:x86 747.3.2 MSVC:x86:IDA 757.3.3 MSVC:x86+OllyDbg 777.3.4 MSVC:x86+Hiew 787.3.5 MSVC:x64 797.3.6 ARM 807.3.7 MIPS 817.3.8 练习题 82第8章 参数获取 838.1 x86 838.1.1 MSVC 838.1.2 MSVC+OllyDbg 848.1.3 GCC 848.2 x64 858.2.1 MSVC 858.2.2 GCC 868.2.3 GCC: uint64_t型参数 878.3 ARM 888.3.1 Non-optimizing Keil 6/2013(ARM mode) 888.3.2 Optimizing Keil 6/2013(ARM mode) 898.3.3 Optimizing Keil 6/2013(Thumb mode) 898.3.4 ARM64 898.4 MIPS 91第9章 返回值 939.1 void型函数的返回值 939.2 函数返回值不被调用的情况 949.3 返回值为结构体型数据 94第10章 指针 9610.1 全局变量 9610.2 局部变量 9810.3 总结 100第11章 GOTO语句 10111.1 无用代码Dead Code 10211.2 练习题 102第12章 条件转移指令 10312.1 数值比较 10312.1.1 x86 10312.1.2 ARM 10912.1.3 MIPS 11212.2 计算绝对值 11512.2.1 Optimizing MSVC 11512.2.2 Optimizing Keil 6/2013: Thumbmode 11612.2.3 Optimizing Keil 6/2013: ARMmode 11612.2.4 Non-optimizng GCC 4.9(ARM64) 11612.2.5 MIPS 11712.2.6 不使用转移指令 11712.3 条件运算符 11712.3.1 x86 11712.3.2 ARM 11812.3.3 ARM64 11912.3.4 MIPS 11912.3.5 使用if/else替代条件运算符 12012.3.6 总结 12012.3.7 练习题 12012.4 比较最大值和最小值 12012.4.1 32位 12012.4.2 64位 12312.4.3 MIPS 12512.5 总结 12512.5.1 x86 12512.5.2 ARM 12512.5.3 MIPS 12612.5.4 不使用转移指令 126第13章 switch()/case/default 12813.1 case陈述式较少的情况 12813.1.1 x86 12813.1.2 ARM: Optimizing Keil 6/2013(ARM mode) 13313.1.3 ARM: Optimizing Keil 6/2013(Thumb mode) 13313.1.4 ARM64: Non-optimizing GCC(Linaro) 4.9 13413.1.5 ARM64: Optimizing GCC(Linaro) 4.9 13413.1.6 MIPS 13513.1.7 总结 13613.2 多个case从句 13613.2.1 x86 13613.2.2 ARM: Optimizing Keil 6/2013(ARM mode) 14013.2.3 ARM: Optimizing Keil 6/2013(Thumb mode) 14113.2.4 MIPS 14313.2.5 总结 14413.3 case从句多对一的情况 14513.3.1 MSVC 14513.3.2 GCC 14713.3.3 ARM64: OptimizingGCC 4.9.1 14713.4 Fall-through 14913.4.1 MSVC x86 14913.4.2 ARM64 15013.5 练习题 15113.5.1 题目1 151第14章 循环 15214.1 举例说明 15214.1.1 x86 15214.1.2 x86:OllyDbg 15514.1.3 x86:跟踪调试工具tracer 15614.1.4 ARM 15714.1.5 MIPS 16014.1.6 其他 16114.2 内存块复制 16114.2.1 编译结果 16114.2.2 编译为ARM模式的程序 16214.2.3 MIPS 16314.2.4 矢量化技术 16414.3 总结 16414.4 练习题 16514.4.1 题目1 16514.4.2 题目2 16514.4.3 题目3 16614.4.4 题目4 167第15章 C语言字符串的函数 17015.1 strlen() 17015.1.1 x86 17015.1.2 ARM 17415.1.3 MIPS 17715.2 练习题 17815.2.1 练习题1 178第16章 数学计算指令的替换 18116.1 乘法 18116.1.1 替换为加法运算 18116.1.2 替换为位移运算 18116.1.3 替换为位移、加减法的混合运算 18216.2 除法运算 18616.2.1 替换为位移运算 18616.3 练习题 18616.3.1 题目2 186第17章 FPU 18817.1 IEEE 754 18817.2 x86 18817.3 ARM、MIPD、x86/x64 SIMD 18817.4 C/C++ 18817.5 举例说明 18917.5.1 x86 18917.5.2 ARM: Optimizing Xcode4.6.3 (LLVM) (ARM mode) 19317.5.3 ARM: Optimizing Keil 6/2013(Thumb mode) 19317.5.4 ARM64: Optimizing GCC(Linaro) 4.9 19417.5.5 ARM64: Non-optimizing GCC(Linaro) 4.9 19517.5.6 MIPS 19517.6 利用参数传递浮点型数据 19617.6.1 x86 19617.6.2 ARM + Non-optimizingXcode 4.6.3 (LLVM)(Thumb-2 mode) 19717.6.3 ARM + Non-optimizing Keil6/2013 (ARM mode) 19817.6.4 ARM64 + Optimizing GCC(Linaro) 4.9 19817.6.5 MIPS 19917.7 比较说明 20017.7.1 x86 20017.7.2 ARM 21617.7.3 ARM64 219Optimizing GCC (Linaro) 4.9—float 22017.7.4 MIPS 22017.8 栈、计算器及逆波兰表示法 22117.9 x64 22117.10 练习题 22117.10.1 题目1 22117.10.2 题目2 221第18章 数组 22318.1 简介 22318.1.1 x86 22318.1.2 ARM 22518.1.3 MIPS 22818.2 缓冲区溢出 22918.2.1 读取数组边界以外的内容 22918.2.2 向数组边界之外的地址赋值 23118.3 缓冲区溢出的保护方法 23418.3.1 Optimizing Xcode 4.6.3 (LLVM)(Thumb-2 mode) 23618.4 其他 23818.5 字符串指针 23818.5.1 x64 23918.5.2 32位ARM 24018.5.3 ARM64 24118.5.4 MIPS 24218.5.5 数组溢出 24218.6 多维数组 24518.6.1 二维数组举例 24618.6.2 以一维数组的方式访问二维数组 24718.6.3 三维数组 24818.6.4 更多案例 25118.7 二维字符串数组的封装格式 25118.7.1 32位ARM 25318.7.2 ARM64 25418.7.3 MIPS 25418.7.4 总结 25518.8 本章小结 25518.9 练习题 25518.9.1 题目1 25518.9.2 题目2 25818.9.3 题目3 26318.9.4 题目4 26418.9.5 题目5 265第19章 位操作 27019.1 特定位 27019.1.1 x86 27019.1.2 ARM 27219.2 设置/清除特定位 27419.2.1 x86 27419.2.2 ARM + Optimizing Keil 6/2013(ARM mode) 27719.2.3 ARM + Optimizing Keil 6/2013(Thumb mode) 27819.2.4 ARM + Optimizing Xcode (LLVM)+ ARM mode 27819.2.5 ARM:BIC指令详解 27819.2.6 ARM64: Optimizing GCC(Linaro)4.9 27819.2.7 ARM64: Non-optimizing GCC (Linaro) 4.9 27919.2.8 MIPS 27919.3 位移 27919.4 在FPU上设置特定位 27919.4.1 XOR操作详解 28019.4.2 x86 28019.4.3 MIPS 28219.4.4 ARM 28219.5 位校验 28419.5.1 x86 28619.5.2 x64 28919.5.3 ARM + Optimizing Xcode 4.6.3(LLVM) + ARM mode 29119.5.4 ARM + Optimizing Xcode 4.6.3(LLVM)+ Thumb-2 mode 29219.5.5 ARM64 + Optimizing GCC 4.9 29219.5.6 ARM64 + Non-optimizingGCC 4.9 29219.5.7 MIPS 29319.6 本章小结 29519.6.1 检测特定位(编译阶段) 29519.6.2 检测特定位(runtime阶段) 29519.6.3 设置特定位(编译阶段) 29619.6.4 设置特定位(runtime阶段) 29619.6.5 清除特定位(编译阶段) 29619.6.6 清除特定位(runtime阶段) 29719.7 练习题 29719.7.1 题目1 29719.7.2 题目2 29819.7.3 题目3 30119.7.4 题目4 301第20章 线性同馀法与伪随机函数 30420.1 x86 30420.2 x64 30520.3 32位ARM 30620.4 MIPS 30620.4.1 MIPS的重新定位 30720.5 本例的线程安全改进版 309第21章 结 构 体 31021.1 MSVC: systemtime 31021.1.1 OllyDbg 31121.1.2 以数组替代结构体 31221.2 用malloc()分配结构体的空间 31321.3 UNIX: struct tm 31521.3.1 Linux 31521.3.2 ARM 31721.3.3 MIPS 31921.3.4 数组替代法 32021.3.5 替换为32位words 32221.3.6 替换为字节型数组 32321.4 结构体的字段封装 32521.4.1 x86 32521.4.2 ARM 32921.4.3 MIPS 33021.4.4 其他 33121.5 结构体的嵌套 33121.5.1 OllyDbg 33221.6 结构体中的位操作 33321.6.1 CPUID 33321.6.2 用结构体构建浮点数 33721.7 练习题 33921.7.1 题目1 33921.7.2 题目2 340第22章 共用体(union)类型 34522.1 伪随机数生成程序 34522.1.1 x86 34622.1.2 MIPS 34722.1.3 ARM (ARM mode) 34822.2 计算机器精度 34922.2.1 x86 35022.2.2 ARM64 35022.2.3 MIPS 35122.2.4 本章小结 351第二部分 硬件基础第23章 函数指针 35223.1 MSVC 35323.1.1 MSVC+OllyDbg 35423.1.2 MSVC+tracer 35523.1.3 MSVC + tracer (code coverage) 35623.2 GCC 35723.2.1 GCC + GDB(有源代码的情况) 35823.2.2 GCC+GDB(没有源代码的情况) 359第24章 32位系统处理64位数据 36224.1 64位返回值 36224.1.1 x86 36224.1.2 ARM 36224.1.3 MIPS 36224.2 参数传递及加减运算 36324.2.1 x86 36324.2.2 ARM 36524.2.3 MIPS 36524.3 乘法和除法运算 36624.3.1 x86 36724.3.2 ARM 36824.3.3 MIPS 36924.4 右移 37024.4.1 x86 37024.4.2 ARM 37124.4.3 MIPS 37124.5 32位数据转换为64位数据 37124.5.1 x86 37224.5.2 ARM 37224.5.3 MIPS 372第25章 SIMD 37325.1 并行矢量化 37325.1.1 用于加法计算 37425.1.2 用于内存复制 37925.2 SIMD实现strlen() 383第26章 64位平台 38726.1 x86-64 38726.2 ARM 39426.3 浮点数 394第27章 SIMD与浮点数的并行运算 39527.1 样板程序 39527.1.1 x64 39527.1.2 x86 39627.2 传递浮点型参数 39927.3 浮点数之间的比较 40027.3.1 x64 40027.3.2 x86 40127.4 计算机器精确度 40227.5 伪随机数生成程序(续) 40227.6 总结 403第28章 ARM指令详解 40428.1 立即数标识(#) 40428.2 变址寻址 40428.3 常量赋值 40528.3.1 32位ARM 40528.3.2 ARM64 40528.4 重定位 406第29章 MIPS的特点 40929.1 加载常量 40929.2 阅读推荐 409第30章 有符号数的表示方法 413第31章 字节序 41431.1 大端字节序 41431.2 小端字节序 41431.3 举例说明 41431.4 双模二元数据格式 41531.5 转换字节序 415第32章 内存布局 416第33章 CPU 41733.1 分支预测 41733.2 数据相关性 417第34章 哈希函数 41834.1 单向函数与不可逆算法 418第三部分 一些高级的例子第35章 温度转换 42135.1 整数值 42135.1.1 x86构架下MSVC 2012优化 42135.1.2 x64构架下的MSVC 2012优化 42335.2 浮点数运算 423第36章 Fibonacci数列(斐波拉契数列) 42636.1 例子1 42636.2 例子2 42836.3 总结 431第37章 CRC32计算的例子 432第38章 网络地址计算实例 43538.1 计算网络地址函数calc_network_address() 43638.2 函数form_IP() 43738.3 函数print_as_IP() 43838.4 form_netmask()函数和set_bit()函数 44038.5 总结 440第39章 循环:几个迭代 44139.1 三个迭代 44139.2 两个迭代 44239.3 Intel C++ 2011实例 443第40章 Duff的装置 446第41章 除以9 44941.1 x86 44941.2 ARM 45041.2.1 ARM模式下,采用Xcode 4.6.3(LLVM)优化 45041.2.2 Thumb-2模式下的Xcode 4.6.3优化(LLVM) 45141.2.3 非优化的Xcode 4.6.3(LLVM)以及Keil 6/2013 45141.3 MIPS 45141.4 它是如何工作的 45241.4.1 更多的理论 45341.5 除法运算 45341.5.1 变量#1 45341.5.2 变量#2 45441.6 练习题 455第42章 字符串转换成数字,函数atoi() 45642.1 一个简单的例子 45642.1.1 64位下的MSVC 2013优化 45642.1.2 64位下的GCC 4.9.1优化 45742.1.3 ARM模式下Keil 6/2013优化 45742.1.4 Thumb模式下Keil 6/2013优化 45842.1.5 ARM64下的GCC 4.9.1优化 45842.2 一个略微高级的例子 45942.2.1 64位下的GCC 4.9.1优化 46042.2.2 ARM模式下的Keil6/2013优化 46142.3 练习 462第43章 Inline函数(联机函数) 46343.1 字符串和内存操作函数 46443.1.1 字符串比较函数strcmp() 46443.1.2 字符串长度函数strlen() 46643.1.3 字符串复制函数strcpy() 46643.1.4 内存设置函数memset() 46743.1.5 内存复制函数memcpy() 46843.1.6 内存对比函数 memcmp() 47043.1.7 IDA脚本 471第44章 C99限制 472第45章 无分支函数abs() 47545.1 x64下的GCC 4.9.1优化 47545.2 ARM64下的GCC 4.9优化 475第46章 参数个数可变函数 47746.1 计算算术平均值 47746.1.1 cdecl调用规范 47746.1.2 基于寄存器的调用规范 47846.2 vprintf()函数例子 480目 录第47章 字符串剪切 48247.1 x64下的MSVC 2013优化 48347.2 x64下采用编辑器GCC 4.9.1进行非优化操作 48447.3 x64下的GCC 4.9.1优化 48547.4 ARM64:非优化的GCC(Linaro)4.9 48647.5 ARM64:优化GCC(Linaro)4.9 48747.6 ARM: Keil 6/2013优化(ARM模式) 48847.7 ARM:Keil 6/2013(Thumb模式)优化 48947.8 MIPS 489第48章 toupper()函数 49148.1 x64 49148.1.1 两个比较操作 49148.1.2 一个比较操作 49248.2 ARM 49348.2.1 ARM64下的GCC 49348.3 总结 494第49章 不正确的反汇编代码 49549.1 x86环境下的,从一开始错误的反汇编 49549.2 一些随机数,怎么看起来像反汇编指令? 496第50章 混淆 50150.1 字符串 50150.2 可执行代码 50150.2.1 插入垃圾代码 50150.2.2 用多个指令组合代替原来的一个指令 50250.2.3 始终执行或者从来不会执行的代码 50250.2.4 把指令序列搞乱 50250.2.5 使用间接指针 50350.3 虚拟机以及伪代码 50350.4 一些其他的事情 50350.5 练习 50350.5.1 练习1 503第51章 C++ 50451.1 类 50451.1.1 一个简单的例子 50451.1.2 类继承 51051.1.3 封装 51351.1.4 多重继承 51551.1.5 虚拟方法 51851.2 ostream流 52151.3 引用 52251.4 STL(standard language file system)标准语言文件系统 52251.4.1 std::string(字符串) 52351.4.2 std::list函数 52951.4.3 std::vector标准向量 53951.4.4 std::map()和std::set() 547第52章 数组的负数偏移 558第53章 16位的Windows程序 56153.1 例子#1 56153.2 例子#2 56153.3 例子#3 56253.4 例子#4 56353.5 例子#5 56653.6 例子#6 56953.6.1 全局变量 571第四部分 Java第54章 JAVA 57554.1 简介 57554.2 返回一个值 57554.3 简单的计算函数 57954.4 JVM的内存模型 58254.5 简单的函数调用 58254.6 调用函数beep()(蜂鸣器) 58454.7 线性同余随机数产生器(PRNG) 58454.8 条件跳转 58654.9 传递参数 58854.10 位操作 58954.11 循环 59054.12 开关函数switch() 59254.13 数组 59354.13.1 简单的例子 59354.13.2 数组元素求和 59454.13.3 单一变量的主函数main()依然是一个数组 59554.13.4 预设初始值的的数组 59654.13.5 可变参数函数 59754.13.6 二维数组 59954.13.7 三维数组 60054.13.8 小结 60154.14 字符串 60154.14.1 第一个例子 60154.14.2 第二个例子 60254.15 例外 60354.16 类 60654.17 简单的补丁 60854.17.1 第一个例子 60854.17.2 第二个例子 61054.18 总结 612第五部分 在代码中发现重要而有趣的内容第55章 可执行文件的识别 61555.1 Microsoft Visual C++ 61555.1.1 命名规则 61555.2 GCC编译器 61555.2.1 命名规则 61555.2.2 Cygwin 61555.2.3 MinGW 61555.3 Intel FORTRAN 61555.4 Watcom以及OpenWatcom 61655.4.1 命名规则 61655.5 Borland编译器 61655.5.1 Dephi编程语言 61655.6 其他的已知DLL文件 617第56章 Win32环境下与外部通信 61856.1 在Windows API中最经常使用的函数 61856.2 tracer:解析指定模块的所有函数 618第57章 字符串 62057.1 字符串 62057.1.1 C/C++中的字符串 62057.1.2 Borland Delphi 62057.1.3 Unicode编码 62057.1.4 Base64 62357.2 错误/调试信息 62357.3 可疑的魔数字符串 623第58章 调用宏assert()(中文称为断言) 624第59章 常数 62559.1 魔数 62559.1.1 动态主机配置协议(Dynamic Host Configuration Protocol,DHCP) 62659.2 寻找常数 626第60章 发现正确的指令 627第61章 可疑的代码模型 62961.1 XOR异或指令 62961.2 手写汇编代码 629第62章 在跟踪程序的过程中使用魔数 631第63章 其他的事情 63263.1 一般的观点 63263.2 C++ 63263.3 一些二进制文件模型 63263.4 内存“快照”对比 63363.4.1 Windows注册表 63363.4.2 瞬变比较器Blink-comparator 633第六部分 操作系统相关第64章 参数的传递方法(调用规范) 63764.1 cdecl [C Declaration的缩写] 63764.2 stdcall [Standard Call的缩写] 63764.2.1 有可变参数个数的函数 63864.3 fastcall 63864.3.1 GCC regparm 63964.3.2 Watcom/OpenWatcom 63964.4 thiscall 63964.5 64位下的x86 63964.5.1 Windows x64 63964.5.2 64位下的Linux 64264.6 浮点数float和双精度数double两种类型的返回值 64264.7 修改参数 64364.8 将指针作为一个函数的参数 643第65章 线程本地存储TLS 64665.1 重新审视线性同余发生器 64665.1.1 Win32系统 64665.1.2 Linux系统 650第66章 系统调用(syscall-s) 65266.1 Linux 65266.2 Windows 653第67章 Linux 65467.1 与位置无关的代码 65467.1.1 Windows 65667.2 在Linux下的LD_PRELOAD 656第68章 Windows NT 66068.1 CRT (Win32) 66068.2 Win32 PE文件 66368.2.1 术语 66468.2.2 基地址 66468.2.3 子系统 66468.2.4 操作系统版本 66568.2.5 段 66568.2.6 再分配Relocations(relocs) 66668.2.7 输出和输入 66668.2.8 资源 66968.2.9 .NET 66968.2.10 线程本地存储(Thread LocalStorage,TLS) 66968.2.11 工具 66968.2.12 更进一步 66968.3 Windows SEH 66968.3.1 让我们暂时把MSVC放在一边 66968.3.2 让我们重新回到MSVC 67468.3.3 Windows x64 68768.3.4 关于SEH的更多信息 69168.4 Windows NT:关键段 691第七部分 常用工具第69章 反汇编工具 69769.1 IDA 697第70章 调试工具 69870.1 tracer 69870.2 OllyDbg 69870.3 GDB 698第71章 系统调用的跟踪工具 69971.1 strace/dtruss 699第72章 反编译工具 700第73章 其他工具 701第八部分 更多范例第74章 修改任务管理器(Vista) 70574.1 使用LEA指令赋值 707第75章 修改彩球游戏 709第76章 扫雷(Windows XP) 71176.1 练习题 715第77章 人工反编译与Z3 SMT求解法 71677.1 人工反编译 71677.2 Z3 SMT求解法 719第78章 加密狗 72478.1 例1:PowerPC平台的MacOS Classic程序 72478.2 例2: SCO OpenServer 73178.2.1 解密错误信息 73978.3 例3: MS-DOS 741第79章 “QR9”:魔方态加密模型 747第80章 SAP 77680.1 关闭客户端的网络数据包压缩功能 77680.2 SAP 6.0的密码验证函数 787第81章 Oracle RDBMS 79181.1 V$VERSION表 79181.2 X$KSMLRU表 79981.3 V$TIMER表 800第82章 汇编指令与屏显字符 80582.1 EICAR 805第83章 实例演示 80783.110 PRINT CHR$(205.5+RND(1));:GOTO 10 80783.1.1 Trixter的42字节程序 80783.1.2 笔者对Trixter算法的改进:27字节 80883.1.3 从随机地址读取随机数 80883.1.4 其他 80983.2 曼德博集合 80983.2.1 理论 81083.2.2 demo程序 81483.2.3 笔者的改进版 816第九部分 文件分析第84章 基于XOR的文件加密 82184.1 Norton Guide:单字节XOR加密实例 82184.1.1 信息熵 82284.2 4字节XOR加密实例 82284.2.1 练习题 824第85章 Millenium游戏的存档文件 825第86章 Oracle的.SYM文件 829第87章 Oracle的.MSDB文件 83687.1 本章总结 839第十部分 其他第88章 npad 843第89章 修改可执行文件 84589.1 文本字符串 84589.2 x86指令 845第90章 编译器内部函数 846第91章 编译器的智能短板 847第92章 OpenMP 84892.1 MSVC 85092.2 GCC 852第93章 安腾指令 854第94章 8086的寻址方式 857第95章 基本块重排 85895.1 PGO的优化方式 858第十一部分 推荐阅读第96章 参考书籍 86396.1 Windows 86396.2 C/C++ 86396.3 x86/x86-64 86396.4 ARM 86396.5 加密学 863第97章 博客 86497.1 Windows平台 864第98章 其他内容 865第十二部分 练习题第99章 初等难度练习 86999.1 练习题1.4 869第100章 中等难度练习 870100.1 练习题2.1 870100.1.1 Optimizing MSVC 2010 x86 870100.1.2 Optimizing MSVC 2012 x64 871100.2 练习题2.4 871100.2.1 Optimizing MSVC 2010 871100.2.2 GCC 4.4.1 872100.2.3 Optimizing Keil(ARM mode) 873100.2.4 Optimizing Keil(Thumb mode) 874100.2.5 Optimizing GCC 4.9.1(ARM64) 874100.2.6 Optimizing GCC 4.4.5(MIPS) 875100.3 练习题2.6 876100.3.1 Optimizing MSVC 2010 876100.3.2 Optimizing Keil(ARM mode) 877100.3.3 Optimizing Keil(Thumb mode) 878100.3.4 Optimizing GCC 4.9.1(ARM64) 878100.3.5 Optimizing GCC 4.4.5 (MIPS) 879100.4 练习题2.13 879100.4.1 Optimizing MSVC 2012 880100.4.2 Keil(ARM mode) 880100.4.3 Keil(Thumb mode) 880100.4.4 Optimizing GCC 4.9.1(ARM64) 880100.4.5 Optimizing GCC 4.4.5(MIPS) 881100.5 练习题2.14 881100.5.1 MSVC 2012 881100.5.2 Keil(ARM mode) 882100.5.3 GCC 4.6.3 for Raspberry Pi(ARM mode) 882100.5.4 Optimizing GCC 4.9.1(ARM64) 883100.5.5 Optimizing GCC 4.4.5(MIPS) 884100.6 练习题2.15 885100.6.1 Optimizing MSVC 2012 x64 886100.6.2 Optimizing GCC 4.4.6 x64 888100.6.3 Optimizing GCC 4.8.1 x86 889100.6.4 Keil(ARM模式):面向Cortex-R4F CPU的代码 890100.6.5 Optimizing GCC 4.9.1(ARM64) 891100.6.6 Optimizing GCC 4.4.5(MIPS) 892100.7 练习题2.16 893100.7.1 Optimizing MSVC 2012 x64 893100.7.2 Optimizing Keil(ARM mode) 893100.7.3 Optimizing Keil(Thumb mode) 894100.7.4 Non-optimizing GCC 4.9.1(ARM64) 894100.7.5 Optimizing GCC 4.9.1(ARM64) 895100.7.6 Non-optimizing GCC4.4.5(MIPS) 898100.8 练习题2.17 899100.9 练习题2.18 899100.10 练习题2.19 899100.11 练习题2.20 899第101章 高难度练习 900101.1 练习题3.2 900101.2 练习题3.3 900101.3 练习题3.4 900101.4 练习题3.5 900101.5 练习题3.6 901101.6 练习题3.8 901第102章 Crackme/Keygenme 902附录A x86 903A.1 数据类型 903A.2 通用寄存器 903A.2.1 RAX/EAX/AX/AL 903A.2.2 RBX/EBX/BX/BL 904A.2.3 RCX/ECX/CX/CL 904A.2.4 RDX/EDX/DX/DL 904A.2.5 RSI/ESI/SI/SIL 904A.2.6 RDI/EDI/DI/DIL 904A.2.7 R8/R8D/R8W/R8L 905A.2.8 R9/R9D/R9W/R9L 905A.2.9 R10/R10D/R10W/R10L 905A.2.10 R11/R11D/R11W/R11L 905A.2.11 R12/R12D/R12W/R12L 905A.2.12 R13/R13D/R13W/R13L 905A.2.13 R14/R14D/R14W/R14L 906A.2.14 R15/R15D/R15W/R15L 906A.2.15 RSP/ESP/SP/SPL 906A.2.16 RBP/EBP/BP/BPL 906A.2.17 RIP/EIP/IP 906A.2.18 段地址寄存器CS/DS/ES/SS/FS/GS 907A.2.19 标识寄存器 907A.3 FPU寄存器 907A.3.1 控制字寄存器(16位) 908A.3.2 状态字寄存器(16位) 908A.3.3 标记字寄存器(16位) 909A.4 SIMD寄存器 909A.4.1 MMX寄存器 909A.4.2 SSE与AVX寄存器 909A.5 FPU调试寄存器 909A.5.1 DR6规格 910A.5.2 DR7规格 910A.6 指令 911A.6.1 指令前缀 911A.6.2 常见指令 911A.6.3 不常用的汇编指令 916A.6.4 FPU指令 921A.6.5 可屏显的汇编指令(32位) 922附录B ARM 925B.1 术语 925B.2 版本差异 925B.3 32位ARM(AArch32) 925B.3.1 通用寄存器 925B.3.2 程序状态寄存器/CPSR 925B.3.3 VFP(浮点)和NEON寄存器 926B.4 64位ARM(AArch64) 926B.4.1 通用寄存器 926B.5 指令 927B.5.1 Conditional codes速查表 927附录C MIPS 928C.1 寄存器 928C.1.1 通用寄存器GPR 928C.1.2 浮点寄存器FPR 928C.2 指令 928C.2.1 转移指令 929附录D 部分GCC库函数 930附录E 部分MSVC库函数 931附录E 部分MSVC库函数 931附录G 练习题答案 935G.1 各章练习 935G.1.1 “栈” 935G.1.2 “switch()/case/default”语句 935G.1.3 练习题#1 935G.1.4 “Loop”语句 935G.1.5 练习题#3 935G.1.6 练习题#4 935G.1.7 C语言字符串处理练习题 936G.1.8 算术指令替代 936G.1.9 FPU练习题 936G.1.10 数组练习题 936G.1.11 位操作练习题 937G.1.12 结构体练习题 939G.1.13 混淆技术练习题 940G.1.14 除9练习题 940G.2 初级练习题 940G.2.1 练习题1.1 940G.2.2 练习题1.4 940G.3 中级练习题 941G.3.1 练习题2.1 941G.3.2 练习题2.4 941G.3.3 练习题2.6 942G.3.4 练习题2.13 942G.3.5 练习题2.14 943G.3.6 练习题2.15 943G.3.7 练习题2.16 943G.3.8 练习题2.17 943G.3.9 练习题2.18 943G.3.10 练习题2.19 943G.3.11 练习题2.20 943G.4 高难度练习题 943G.4.1 练习题3.2 943G.4.2 练习题3.3 943G.4.3 练习题3.4 944G.4.4 练习题3.5 944G.4.5 练习题3.6 944G.4.6 练习题3.8 944G.5 其他练习题 944G.5.1 “扫雷(Windows XP)” 944参考文献 947
展开全部
图2
图3
配送说明
...
相似商品
为你推荐
开播时间:09月02日 10:30