*Description: multi_guards_X (where X is the number of guards, i.e. NUM_CHECKSUMS) demonstrates multiple interdependent checksum guards. =========================================================== *Usage: multi_guards_X.exe *Output: The MD5 value of Abraham Lincoln's Gettysburg Address. =========================================================== *Note: The MD5 code was produced from http://people.csail.mit.edu/rivest/Md5.c. =========================================================== *multi_guards algorithm: First start_addr and end_addr -- the start and end offsets of the code that needs to be protected -- are determined using Start and End. Then X random ranges between start_addr and end_addr are created; these ranges determine the areas of code that each checksum routine will compute. The random ranges, as well as their computed checksums, are determined at compile time. These computed checksums are stored statically in the code so the application can validate them at run-time. =========================================================== *Related work: H. Chang and M. J. Atallah. Protecting software code by guards. In Security and privacy in digital rights management, pages 160–175. Springer, 2002. B. Horne, L. Matheson, C. Sheehan, and R. E. Tarjan. Dynamic self-checking techniques for improved tamper resistance. In Security and privacy in digital rights management, pages 141–159. Springer, 2002.