《逆向工程权威指南 下》PDF下载

  • 购买积分:25 如何计算积分?
  • 作  者:(乌克兰)丹尼斯著;ARCHER,安天安全研究与应急处理中心译
  • 出 版 社:北京:人民邮电出版社
  • 出版年份:2017
  • ISBN:7115434456
  • 页数:954 页
图书介绍:

第47章 字符串剪切 485

47.1 x64下的MSVC 2013优化 486

47.2 x64下采用编辑器GCC 4.9.1进行非优化操作 487

47.3 x64下的GCC 4.9.1优化 488

47.4 ARM64:非优化的GCC(Linaro)4.9 489

47.5 ARM64:优化GCC(Linaro)4.9 490

47.6 ARM:Keil 6/2013优化(ARM模式) 491

47.7 ARM:Keil 6/2013(Thumb模式)优化 492

47.8 MIPS 493

第48章 toupper()函数 495

48.1 x64 495

48.1.1 两个比较操作 495

48.1.2 一个比较操作 496

48.2 ARM 497

48.2.1 ARM64下的GCC 497

48.3 总结 498

第49章 不正确的反汇编代码 499

49.1 x86环境下的从一开始错误的反汇编 499

49.2 随机噪音,怎么看起来像反汇编指令? 500

第50章 混淆技术 505

50.1 字符串变换 505

50.2 可执行代码 506

50.2.1 插入垃圾代码 506

50.2.2 用多个指令组合代替原来的一个指令 506

50.2.3 始终执行或者从来不会执行的代码 506

50.2.4 把指令序列搞乱 507

50.2.5 使用间接指针 507

50.3 虚拟机以及伪代码 507

50.4 一些其他的事情 507

50.5 练习题 508

50.5.1 练习1 508

第51章 C++ 509

51.1 类 509

51.1.1 一个简单的例子 509

51.1.2 类继承 515

51.1.3 封装 518

51.1.4 多重继承 520

51.1.5 虚拟方法 523

51.2 ostream输出流 526

51.3 引用 527

51.4 STL/标准模板库(Standard Template Library) 528

51.4.1 std::string(字符串) 528

51.4.2 std::list 535

51.4.3 std::vector标准向量 545

51.4.4 std::map()和std::set() 552

第52章 数组与负数索引 563

第53章 16位的Windows程序 566

53.1 例子#1 566

53.2 例子#2 566

53.3 例子#3 567

53.4 例子#4 568

53.5 例子#5 571

53.6 例子#6 574

53.6.1 全局变量 576

第四部分 Java 581

第54章 Java 581

54.1 简介 581

54.2 返回一个值 581

54.3 简单的计算函数 586

54.4 JVM的内存模型 588

54.5 简单的函数调用 588

54.6 调用函数beep()(蜂鸣器) 590

54.7 线性同余随机数产生器(PRNG) 591

54.8 条件转移 592

54.9 传递参数 594

54.10 位操作 595

54.11 循环 596

54.12 switch()语句 598

54.13 数组 599

54.13.1 简单的例子 599

54.13.2 数组元素求和 601

54.13.3 输入变量为数组的主函数main() 601

54.13.4 预设初始值的的数组 602

54.13.5 可变参数函数 604

54.13.6 二维数组 606

54.13.7 三维数组 606

54.13.8 小结 607

54.14 字符串 607

54.14.1 第一个例子 607

54.14.2 第二个例子 608

54.15 异常处理 609

54.16 类 612

54.17 简单的补丁 614

54.17.1 第一个例子 614

54.17.2 第二个例子 616

54.18 总结 618

第五部分 在代码中发现重要而有趣的内容 621

第55章 编译器产生的文件特征 621

55.1 Microsoft Visual C++ 621

55.1.1 命名规则 621

55.2 GCC编译器 621

55.2.1 命名规则 621

55.2.2 Cygwin 621

55.2.3 MinGW 621

55.3 Intel FORTRAN 621

55.4 Watcom以及OpenWatcom 622

55.4.1 命名规则 622

55.5 Borland编译器 622

55.5.1 Dephi编程语言 622

55.6 其他的已知DLL文件 623

第56章 Win32环境下与外部通信 624

56.1 在WindowsAPI中最经常使用的函数 624

56.2 tracer:解析指定模块的所有函数 624

第57章 字符串 626

57.1 字符串 626

57.1.1 C/C++中的字符串 626

57.1.2 Borland Delphi 626

57.1.3 Unicode编码 626

57.1.4 Base64 628

57.2 错误/调试信息 629

57.3 可疑的魔数字符串 629

第58章 调用宏assert()(中文称为断言) 630

第59章 常数 631

59.1 魔数 631

59.1.1 动态主机配置协议(Dynamic Host Configuration Protocol,DHCP) 632

59.2 寻找常数 632

第60章 检索关键指令 633

第61章 可疑的代码模型 635

61.1 XOR异或指令 635

61.2 手写汇编代码 635

第62章 魔数与程序调试 637

第63章 其他的事情 638

63.1 总则 638

63.2 C++ 638

63.3 部分二进制文件的特征 638

63.4 内存“快照”对比 638

63.4.1 Windows注册表 639

63.4.2 瞬变比较器Blink-comparator 639

第六部分 操作系统相关 643

第64章 参数的传递方法(调用规范) 643

64.1 cdecl[C Declaration的缩写] 643

64.2 stdcall[Standard Call的缩写] 643

64.2.1 带有可变参数的函数 644

64.3 fastcall 644

64.3.1 GCC regparm 645

64.3.2 Watcom/OpenWatcom 645

64.4 thiscall 645

64.5 64位下的x86 646

64.5.1 Windows x64 646

64.5.2 64位下的Linux 648

64.6 单/双精度数型返回值 649

64.7 修改参数 649

64.8 指针型函数参数 649

第65章 线程本地存储TLS 652

65.1 线性同余发生器(改) 652

65.1.1 Win32系统 652

65.1.2 Linux系统 656

第66章 系统调用(syscall-s) 658

66.1 Linux 658

66.2 Windows 659

第67章 Linux 660

67.1 位置无关的代码 660

67.1.1 Windows 662

67.2 在Linux下的LD_PRELOAD 662

第68章 Windows NT 666

68.1 CRT(Win32) 666

68.2 Win32 PE文件 669

68.2.1 术语 670

68.2.2 基地址 670

68.2.3 子系统 670

68.2.4 操作系统版本 670

68.2.5 段 671

68.2.6 重定向段Relocations(relocs) 672

68.2.7 导出段和导入段 672

68.2.8 资源段 674

68.2.9 .NET 675

68.2.10 TLS段 675

68.2.11 工具 675

68.2.12 更进一步 675

68.3 Windows SEH 675

68.3.1 让我们暂时把MSVC放在一边 675

68.3.2 让我们重新回到MSVC 680

68.3.3 Windows x64 693

68.3.4 关于SEH的更多信息 697

68.4 Windows NT:临界区段 697

第七部分 常用工具 703

第69章 反汇编工具 703

69.1 IDA 703

第70章 调试工具 704

70.1 tracer 704

70 2 OllyDbg 704

70.3 GDB 704

第71章 系统调用的跟踪工具 705

71.1 strace/dtruss 705

第72章 反编译工具 706

第73章 其他工具 707

第八部分 更多范例 711

第74章 修改任务管理器(Vista) 711

74.1 使用LEA指令赋值 713

第75章 修改彩球游戏 715

第76章 扫雷(Windows XP) 717

76.1 练习题 721

第77章 人工反编译与Z3 SMT求解法 722

77.1 人工反编译 722

77.2 Z3 SMT求解法 725

第78章 加密狗 730

78.1 例1:PowerPC平台的MacOS Classic程序 730

78.2 例2:SCO OpenServer 737

解密错误信息 745

78.3 例3:MS-DOS 747

第79章 “QR9”:魔方态加密模型 753

第80章 SAP 782

80.1 关闭客户端的网络数据包压缩功能 782

80.2 SAP 6.0的密码验证函数 793

第81章 Oracle RDBMS 797

81.1 V$VERSION表 797

81.2 X$KSMLRU表 805

81.3 V$TIMER表 806

第82章 汇编指令与屏显字符 811

82.1 EICAR 811

第83章 实例演示 813

83.1 10PRINT CHR$(205.5 +RND(1));:GOTO 10 813

83.1.1 Trixter的42字节程序 813

83.1.2 笔者对Trixter算法的改进:27字节 814

83.1.3 从随机地址读取随机数 814

83.1.4 其他 815

83.2 曼德博集合 815

83.2.1 理论 816

83.2.2 demo程序 820

83.2.3 笔者的改进版 822

第九部分 文件分析 827

第84章 基于XOR的文件加密 827

84.1 Norton Guide:单字节XOR加密实例 827

信息熵 828

84.2 4字节XOR加密实例 828

84.3 练习题 830

第85章 Millenium游戏的存档文件 831

第86章 Oracle的.SYM文件 835

第87章 Oracle的.MSDB文件 842

总结 845

第十部分 其他 849

第88章 npad 849

第89章 修改可执行文件 851

89.1 文本字符串 851

89.2 x86指令 851

第90章 编译器内部函数 852

第91章 编译器的智能短板 853

第92章 OpenMP 854

92.1 MSVC 856

92.2 GCC 858

第93章 安腾指令 860

第94章 8086的寻址方式 863

第95章 基本块重排 864

95.1 PGO的优化方式 864

第十一部分 推荐阅读 869

第96章 参考书籍 869

96.1 Windows 869

96.2 C/C++ 869

96.3 x86/x86-64 869

96.4 ARM 869

96.5 加密学 869

第97章 博客 870

97.1 Windows平台 870

第98章 其他内容 871

第十二部分 练习题 875

第99章 初等难度练习题 875

99.1 练习题1.4 875

第100章 中等难度练习题 876

100.1 练习题2.1 876

100.1.1 Optimizing MSVC 2010 x86 876

100.1.2 Optimizing MSVC 2012 x64 877

100.2 练习题2.4 877

100.2.1 Optimizing MSVC 2010 877

100.2.2 GCC 4.4.1 878

100.2.3 Optimizing Keil(ARM mode) 879

100.2.4 Optimizing Keil(Thumb mode) 880

100.2.5 Optimizing GCC 4.9.1(ARM64) 880

100.2.6 Optimizing GCC 4.4.5(MIPS) 881

100.3 练习题2.6 882

100.3.1 Optimizing MSVC 2010 882

100.3.2 Optimizing Keil(ARM mode) 883

100.3.3 Optimizing Keil(Thumb mode) 884

100.3.4 Optimizing GCC 4.9.1(ARM64) 884

100.3.5 Optimizing GCC 4.4.5(MIPS) 885

100.4 练习题2.1 3 885

100.4.1 Optimizing MSVC 2012 886

100.4.2 Keil(ARM mode) 886

100.4.3 Keil(Thumb mode) 886

100.4.4 Optimizing GCC 4.9.1(ARM64) 886

100.4.5 Optimizing GCC 4.4.5(MIPS) 887

100.5 练习题2.1 4 887

100.5.1 MSVC 2012 887

100.5.2 Keil(ARM mode) 888

100.5.3 GCC 4.6.3 for Raspberry Pi(ARM mode) 888

100.5.4 Optimizing GCC 4.9.1(ARM64) 889

100.5.5 Optimizing GCC 4.4.5(MIPS) 890

100.6 练习题2.1 5 891

100.6.1 Optimizing MSVC 2012 x64 892

100.6.2 Optimizing GCC 4.4.6x64 894

100.6.3 Optimizing GCC 4.8.1 x86 895

100.6.4 Keil(ARM模式):面向Cortex-R4F CPU的代码 896

100.6.5 Optimizing GCC 4.9.1(ARM64) 897

100.6.6 Optimizing GCC 4.4.5(MIPS) 898

100.7 练习题2.1 6 899

100.7.1 Optimizing MSVC 2012x64 899

100.7.2 Optimizing Keil(ARM mode) 899

100.7.3 Optimizing Keil(Thumb mode) 900

100.7.4 Non-optimizing GCC 4.9.1(ARM64) 900

100.7.5 Optimizing GCC 4.9.1(ARM64) 901

100.7.6 Non-optimizing GCC 4.4.5(MIPS) 904

100.8 练习题2.17 905

100.9 练习题2.18 905

100.10 练习题2.19 905

100.11 练习题2.20 905

第101章 高难度练习题 906

101.1 练习题3.2 906

101.2 练习题3.3 906

101.3 练习题3.4 906

101.4 练习题3.5 906

101.5 练习题3.6 907

101.6 练习题3.8 907

第102章 Crackme/Keygenme 908

附录A x86 909

A.1 数据类型 909

A.2 通用寄存器 909

A.2.1 RAX/EAX/AX/AL 909

A.2.2 RBX/EBX/BX/BL 910

A.2.3 RCX/ECX/CX/CL 910

A.2.4 RDX/EDX/DX/DL 910

A.2.5 RSI/ESI/SI/SIL 910

A.2.6 RDI/EDI/DI/DIL 910

A.2.7 R8/R8D/R8W/R8L 911

A.2.8 R9/R9D/R9W/R9L 911

A.2.9 R10/R10D/R10W/R10L 911

A.2.10 R11/R11D/R11W/R11L 911

A.2.11 R12/R12D/R12W/R12L 911

A.2.12 R13/R13D/R13W/R13L 911

A.2.13 R14/R14D/R14W/R14L 912

A.2.14 R15/R15D/R15W/R15L 912

A.2.15 RSP/ESP/SP/SPL 912

A.2.16 RBP/EBP/BP/BPL 912

A.2.17 RIP/EIP/IP 912

A.2.18 段地址寄存器CS/DS/ES/SS/FS/GS 913

A.2.19 标识寄存器 913

A.3 FPU寄存器 913

A.3.1 控制字寄存器(16位) 914

A.3.2 状态字寄存器(16位) 914

A.3.3 标记字寄存器(16位) 915

A.4 SIMD寄存器 915

A.4.1 MMX寄存器 915

A.4.2 SSE与AVX寄存器 915

A.5 FPU调试寄存器 915

A.5.1 DR6规格 916

A.5.2 DR7规格 916

A.6 指令 917

A.6.1 指令前缀 917

A.6.2 常见指令 917

A.6.3 不常用的汇编指令 922

A.6.4 FPU指令 927

A.6.5 可屏显的汇编指令(32位) 928

附录B ARM 931

B.1 术语 931

B.2 版本差异 931

B.3 32位ARM(AArch32) 931

B.3.1 通用寄存器 931

B.3.2 程序状态寄存器/CPSR 931

B.3.3 VFP(浮点)和NEON寄存器 932

B.4 64位ARM(AArch64) 932

通用寄存器 932

B.5 指令 933

Conditional codes速查表 933

附录C MIPS 934

C.1 寄存器 934

C.1.1 通用寄存器GPR 934

C.1.2 浮点寄存器FPR 934

C.2 指令 934

转移指令 935

附录D 部分GCC库函数 936

附录E 部分MSVC库函数 937

附录F 速查表 938

F.1 IDA 938

F.2 OllyDbg 939

F.3 MSVC选项 939

F.4 GCC 939

F.5 GDB 940

附录G 练习题答案 941

G.1 各章练习 941

第3章 941

第5章 941

第7章 941

第13章 942

第14章 942

第15章 942

第16章 942

第17章 943

第18章 943

第19章 944

第21章 945

第41章 946

第50章 946

G.2 初级练习题 947

G2.1 练习题1.1 947

G2.2 练习题1.4 947

G.3 中级练习题 947

G3.1 练习题2.1 947

G3.2 练习题2.4 948

G3.3 练习题2.6 949

G3.4 练习题2.13 949

G3.5 练习题2.14 949

G3.6 练习题2.15 949

G3.7 练习题2.16 950

G3.8 练习题2.17 950

G3.9 练习题2.18 950

G3.10 练习题2.19 950

G3.11 练习题2.20 950

G.4 高难度练习题 950

G4.1 练习题3.2 950

G4.2 练习题3.3 950

G4.3 练习题3.4 950

G4.4 练习题3.5 950

G4.5 练习题3.6 951

G4.6 练习题3.8 951

G.5 其他练习题 951

G5.1 “扫雷(Windows XP)” 951

参考文献 952