目录 1
第1章 入门指南 1
1.1 技术综述——使用各种方法的时间和目的 1
1.2 利用文件管理器提高程序开发效率 3
1.2.1 FAR和Total Commander 4
1.2.2 Java IDE 6
1.3 示例应用程序的功能和结构 7
1.4 快速测试 9
1.5 小结 9
第2章 反编译类 11
2.1 确定何时进行反编译 11
2.2 了解最佳的反编译器 12
2.3 反编译类 14
2.4 反编译可行的要素 20
2.5 反编译代码的潜在问题 21
2.6 快速测试 24
2.7 小结 24
第3章 混淆类 25
3.1 保护代码背后的构思 26
3.2 混淆——一种知识产权的保护措施 27
3.3 由混淆程序执行的变换 27
3.3.1 去除调试信息 28
3.3.2 名称的处理 28
3.3.3 编码Java字符串 29
3.3.4 改变控制流 30
3.3.5 插入讹用的代码 31
3.3.6 删除未使用的代码(压缩) 32
3.3.7 优化字节码 32
3.4 了解最佳的混淆程序 32
3.5 潜在问题和通用解决方案 33
3.5.1 动态类加载 33
3.5.2 反射 34
3.5.3 串行化 34
3.5.4 违反命名惯例 35
3.5.5 维护的难题 35
3.6 运用Zelix KlassMaster混淆一个Chat应用程序 36
3.7 破解混淆的代码 40
3.9 小结 41
3.8 快速测试 41
第4章 破译类的非公共方法和变量 43
4.1 封装的问题 43
4.2 访问包和保护类成员 44
4.3 访问私有类成员 47
4.4 快速测试 49
4.5 小结 49
第5章 替换和修补应用类 51
5.1 当进行各种尝试都失败后应该做什么 52
5.2 找到必须修补的类 53
5.2.1 常用的方法 53
5.2.2 搜寻文本串 54
5.3 一个需要修补的示例 55
5.2.3 已混淆的代码的处理 55
5.3.2 搜寻文本串 57
5.3.1 使用类名称 57
5.3.3 运用调用堆栈搜寻程序逻辑 59
5.4 修补类以提供新逻辑 60
5.5 重构应用程序来加载和使用修补的类 60
5.6 修补封装的包 62
5.7 快速测试 63
5.8 小结 63
第6章 使用有效的跟踪技术 65
6.1 跟踪技术简介 65
6.2 跟踪技术是了解软件的有效方法 67
6.4.1 有效使用跟踪技术的准则 68
6.3 跟踪技术与日志工具和API 68
6.4 跟踪技术的使用准则 68
6.4.2 不要滥用跟踪技术的准则 69
6.5 快速测试 70
6.6 小结 70
第7章 管理Java安全 71
7.1 Java安全概述 71
7.2 绕过安全核查 73
7.2.1 未安装安全管理器 74
7.2.2 安装默认政策的安全管理器 74
7.2.3 安装定制政策的安全管理器 75
7.4 小结 76
7.3 快速测试 76
第8章 窥探运行时环境 77
8.1 了解运行时环境的价值 77
8.2 系统属性 78
8.3 系统信息 79
8.4 内存信息 80
8.5 网络信息 81
8.6 访问环境变量 82
8.7 快速测试 82
8.8 小结 83
第9章 用非正式调试程序破译编码 85
9.1 了解未知应用程序的内幕 85
9.2 传统调试程序及其局限性 86
9.3 运用Omniscient调试程序破译 87
9.3.1 记录Chat的执行 87
9.3.2 浏览信息处理代码 89
9.3.3 运用ODB破译混淆的Chat程序版本 91
9.4 快速测试 92
9.5 小结 92
第10章 运用性能分析工具分析应用程序的运行时 93
10.1 使用性能分析技术的时机和目的 94
10.2 Java的最佳性能分析工具 94
10.3 研究堆的使用和垃圾回收频率以提高性能 95
10.4 浏览对象分配和引用以发现和修复内存泄漏 97
10.5 研究线程的分配和同步 101
10.6 识别开销大的方法以提高性能 105
10.7 使用线程转储研究运行时的应用程序 106
10.8 快速测试 107
10.9 小结 108
第11章 运用负载测试定位和修正可伸缩性问题 109
11.1 负载测试的重要性 109
11.2 用JUnit负载测试基于RMI的服务程序 111
11.3 用JMeter负载测试 115
11.3.1 JMeter概述 116
11.3.2 WebCream概述 117
11.3.3 创建一个Web测试方案 118
11.4 快速测试 125
11.5 小结 125
12.1 用户界面元素和资源 127
第12章 逆向工程的应用 127
12.2 破译文本 128
12.3 破译图片 129
12.4 破译配置文件 131
12.5 快速测试 131
12.6 小结 132
第13章 窃听技术 133
13.1 窃听的定义 133
13.2 在HTTP上窃听 134
13.2.1 用Tunnel捕捉HTTP信息交换 135
13.2.2 用网络嗅探器捕捉HTTP信息交换 136
13.2.3 保护Web应用程序不被窃听 138
13.3.1 RMI传输协议 139
13.3 在RMI协议上窃听 139
13.3.2 用网络嗅探器截取RMI消息 140
13.3.3 保护RMI应用程序不被窃听 141
13.4 在JDBC驱动程序和SQL语句上窃听 142
13.5 快速测试 144
13.6 小结 144
第14章 控制类的加载 147
14.1 从类加载的角度观察JVM的内部结构 147
14.2 编写定制类加载程序 151
14.3 快速测试 156
14.4 小结 156
15.1 为什么麻烦 157
第15章 替代和修补核心Java类 157
15.2 用启动类路径修补核心Java类 158
15.3 修补java.lang.Integer的例子 159
15.4 快速测试 161
15.5 小结 162
第16章 截取控制流 163
16.1 控制流的定义 164
16.2 截取系统出错信息 164
16.3 截取系统流 165
16.4 截取对System.exit的调用 167
16.5 用hook对JVM的关闭作出反应 169
16.6 用动态代理截取方法 169
16.7 Java虚拟机性能测量工具接口 172
16.9 小结 173
16.8 快速测试 173
第17章 理解和调整字节码 175
17.1 字节码基础 175
17.2 用jClassLib字节码查看器查看类文件 176
17.3 JVM指令集 177
17.4 类文件格式 178
17.4.1 字段和方法描述符 179
17.4.2 类文件结构 180
17.4.3 属性 183
17.4.4 字节码的验证 183
17.5 操纵和生成字节码 184
17.5.1 BCEL概述 184
17.5.2 操纵方法 185
17.5.3 生成类 189
17.5.4 ASM库 191
17.6 字节码调整与AOP和动态代理的比较 192
17.7 快速测试 193
17.8 小结 193
第18章 运用本机代码修补法进行总控制 195
18.1 何时以及为何要修补本机代码 196
18.2 本机代码在Java虚拟机中的用法 197
18.2.1 JNI概述 197
18.2.2 JNI实现的示例 198
18.3 修补本机方法的常用方法 200
18.3.3 修补本机代码 201
18.3.2 替换本机库文件 201
18.3.1 修补Java方法的声明 201
18.4 在Windows平台上修补本机代码 202
18.4.1 可移植执行体格式 202
18.4.2 用函数替代程序修补本机函数 205
18.4.3 使用Microsoft Detour库手动修补 207
18.5 在Unix平台上修补本机代码 209
18.6 快速测试 210
18.7 小结 211
第19章 保护商用程序免于被破解 213
19.1 为应用程序保护设定目标 213
19.2 用Java密码体系保护数据 215
19.2.1 Java密码体系概述 216
19.2.2 用JCA保护Chat的消息 217
19.3 保护发布的应用程序不被破译 220
19.3.1 保护字节码不被反编译 221
19.3.2 保护字节码不被破译 221
19.3.3 保护应用程序内容不被破译 224
19.4 通过许可证控制软件可用功能 229
1 9.4.1 现代软件许可模式 229
19.4.2 通过许可证控制商用功能 230
19.4.3 Web激活和许可注册 237
19.5 快速测试 238
19.6 小结 238
附录A 商用软件许可 241
附录B 资源 247
附录C 测试问题解答 255