第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