Acknowledgments |
|
xiii | |
|
1 Dynamic Binary Modification: Overview |
|
|
1 | (6) |
|
|
2 | (1) |
|
|
3 | (1) |
|
|
4 | (1) |
|
|
5 | (2) |
|
2 Using a Dynamic Binary Modifier |
|
|
7 | (10) |
|
2.1 Heavyweight vs. Lightweight Control |
|
|
7 | (1) |
|
|
7 | (1) |
|
2.1.2 Probe-Mode Execution |
|
|
8 | (1) |
|
2.1.3 Persistent Binary Modification |
|
|
8 | (1) |
|
|
8 | (2) |
|
2.2.1 Complete Process Control |
|
|
9 | (1) |
|
2.2.2 Attaching to an Existing Process |
|
|
10 | (1) |
|
2.3 Programmable Instrumentation |
|
|
10 | (3) |
|
2.4 Platform-Specific Behaviors |
|
|
13 | (1) |
|
2.5 End-User Optimizations |
|
|
14 | (1) |
|
2.6 Debugging Your Plug-In Tool |
|
|
15 | (2) |
|
3 Program Analysis and Debugging |
|
|
17 | (8) |
|
3.1 Program Analysis Examples |
|
|
17 | (5) |
|
3.2 Parallel Program Analysis |
|
|
22 | (1) |
|
|
23 | (1) |
|
3.4 Customizable Debugging |
|
|
24 | (1) |
|
4 Active Program Modification |
|
|
25 | (6) |
|
4.1 Fine-Grained Instruction Modification |
|
|
25 | (1) |
|
|
26 | (1) |
|
|
27 | (2) |
|
4.4 Sandboxing and Security Enforcement |
|
|
29 | (2) |
|
5 Architectural Exploration |
|
|
31 | (8) |
|
|
31 | (4) |
|
|
32 | (1) |
|
5.1.2 Functional Cache Simulation |
|
|
33 | (1) |
|
5.1.3 Functional Branch Prediction Simulation |
|
|
34 | (1) |
|
|
34 | (1) |
|
|
35 | (2) |
|
5.2.1 Supporting New Instructions |
|
|
36 | (1) |
|
5.2.2 Masking Hardware Flaws |
|
|
36 | (1) |
|
|
37 | (1) |
|
5.4 Design-Space Exploration |
|
|
38 | (1) |
|
6 Advanced System Internals |
|
|
39 | (16) |
|
|
39 | (1) |
|
6.1.1 Modified Copy on Demand |
|
|
39 | (1) |
|
6.1.2 Modification in Place |
|
|
39 | (1) |
|
6.2 A Shared Address Space |
|
|
40 | (1) |
|
|
41 | (1) |
|
6.4 Maintaining Control: JIT Compilation |
|
|
42 | (1) |
|
6.5 Storing Modified Code: The Code Cache |
|
|
42 | (6) |
|
6.5.1 Forming Traces of Modified Code |
|
|
43 | (2) |
|
6.5.2 Code Cache Eviction and Replacement |
|
|
45 | (1) |
|
6.5.3 Code Cache Introspection |
|
|
46 | (1) |
|
6.5.4 Handling Self-Modifying Code |
|
|
47 | (1) |
|
|
48 | (1) |
|
6.7 Multithreaded Program Support |
|
|
49 | (2) |
|
6.7.1 Thread-Shared Code Caches |
|
|
49 | (1) |
|
6.7.2 Generational Cache Replacement |
|
|
50 | (1) |
|
6.8 Windows Execution Support |
|
|
51 | (1) |
|
6.9 Masking Overhead with Parallelism |
|
|
52 | (1) |
|
6.10 Remaining Challenges |
|
|
53 | (2) |
|
7 Historical Perspectives |
|
|
55 | (2) |
|
8 Summary and Observations |
|
|
57 | (2) |
Bibliography |
|
59 | (8) |
Author's Biography |
|
67 | |