23.11.2013 Views

Obfuscation of Abstract Data-Types - Rowan

Obfuscation of Abstract Data-Types - Rowan

Obfuscation of Abstract Data-Types - Rowan

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

CHAPTER 3. TECHNIQUES FOR OBFUSCATION 45<br />

which helps to confuse an attacker further. Random obfuscations appear to<br />

have received little attention to date.<br />

The current view <strong>of</strong> obfuscation [10] (and Chapters 1 and 2) concentrates<br />

on concrete data structures such as variables and arrays. All <strong>of</strong> the data-types<br />

that we will use could be implemented concretely using arrays — for example,<br />

we can use the standard “double, double plus one” conversion [13, Chapter<br />

6] to represent a binary tree as an array. Why, therefore, do we obfuscate<br />

the abstract data-type rather than its concrete implementation? Apart from<br />

providing a simple way <strong>of</strong> proving correctness, using data-types gives us an<br />

extra “level” in which to add obfuscations. Going immediately to arrays forces<br />

us to think in array terms and we would have only array obfuscations at our<br />

disposal. For instance, in Chapter 7, we consider a data-type for trees and<br />

so the usual tree transformations (such as swapping two subtrees) are naturally<br />

available; they would be more difficult to conceive using arrays. Also, converting<br />

a data-type to an array <strong>of</strong>ten loses information about the data-type (such as<br />

the structure) and so it would be difficult to perform operations that use or<br />

rely on knowledge <strong>of</strong> that structure. Some matrix operations rely on the 2-<br />

dimensional structure <strong>of</strong> matrices and so we would have difficulties defining such<br />

operations for matrices that have flattened to arrays — Section 6.3.5 gives an<br />

example considering the transposition operation. We may also gain new array<br />

obfuscations by obfuscating a data-type and then converting the data-type to<br />

an array. Thus, we have two opportunities for obfuscation; the first using our<br />

new data-type approach and the second using the standard imperative methods.<br />

When we define a data-type, we will insist that the operations are total<br />

and deterministic. This restriction ensures that we can use equality in our<br />

correctness pro<strong>of</strong>s. As the aim <strong>of</strong> obfuscation is to obscure the meaning <strong>of</strong> an<br />

operation we should give an indication <strong>of</strong> what an operation should do so that<br />

we can assess whether an obfuscation is suitable. Therefore when defining a<br />

data-type we require that we give assertions for the operations that we declare<br />

in our data-type. But we do not insist that we give a full axiomatisation <strong>of</strong><br />

the data-type — we can just consider assertions that we are interested in. This<br />

requirement will aid us in producing our own definition <strong>of</strong> obfuscation. We<br />

could give an axiomatic definition <strong>of</strong> a data-type [36, Chapter 4] which provides<br />

axioms (i.e. laws involving the operations) but we choose to give a combination<br />

<strong>of</strong> both definitions and axioms.<br />

One aim <strong>of</strong> our approach is to make the process <strong>of</strong> creating obfuscations<br />

more accessible and applicable. The techniques that we will use (such as datatypes,<br />

refinement and functional programming) are well established in the programming<br />

research community and so they will be familiar to many computer<br />

scientists. Although the techniques <strong>of</strong> formal methods are well-known, the application<br />

<strong>of</strong> obfuscation using these techniques is not.<br />

3.1.1 Notation<br />

When defining a data-type, we want to specify the following things:<br />

• a name for the data-type<br />

• a declaration <strong>of</strong> the types and constructors (which can be given as a<br />

schema)

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!