Obfuscation of Abstract Data-Types - Rowan
Obfuscation of Abstract Data-Types - Rowan
Obfuscation of Abstract Data-Types - Rowan
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Preliminaries<br />
Homer: “All right brain, you don’t like me and I don’t like you.<br />
But let’s just do this and I can get back to killing you<br />
with beer.”<br />
The Simpsons — The Front (1993)<br />
In this thesis, we consider the obfuscation <strong>of</strong> programs. “To Obfuscate”<br />
means “To cast into darkness or shadow; to cloud, obscure”. From a Computer<br />
Science perspective, an obfuscation is a behaviour-preserving program transformation<br />
whose aim is to make a program “harder to understand”. <strong>Obfuscation</strong>s<br />
are applied to a program to make reverse engineering <strong>of</strong> the program more difficult.<br />
Two concerns about an obfuscation are whether it preserves behaviour<br />
(i.e. it is correct) and the degree to which it maintains efficiency.<br />
Example<br />
As an example <strong>of</strong> obfuscation, consider the program in Figure 1. The method<br />
start takes an integer value array as input and the array is returned from the<br />
method. But what does this method do to the elements <strong>of</strong> the array? The<br />
obfuscation was achieved by using some <strong>of</strong> the methods outlined in this thesis.<br />
Aims <strong>of</strong> the thesis<br />
The current view <strong>of</strong> obfuscation (in particular, the paper by Collberg et al. [10])<br />
concentrates on object-oriented programs. In [10], obfuscations for constructs<br />
such as loops, arrays and methods are stated informally: without pro<strong>of</strong>s <strong>of</strong><br />
correctness. Constructing pro<strong>of</strong>s <strong>of</strong> correctness for imperative obfuscations is a<br />
challenging task.<br />
We <strong>of</strong>fer an alternative approach based on data refinement and functional<br />
programming. We want our approach to have the following objectives:<br />
• to yield pro<strong>of</strong>s <strong>of</strong> correctness (or even yield derivations) <strong>of</strong> all our obfuscations<br />
• to use simple, established refinement techniques, leaving the ingenuity for<br />
obfuscation<br />
• to generalise obfuscations to make obfuscations more applicable.<br />
7