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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

CHAPTER 8. CONCLUSIONS AND FURTHER WORK 137<br />

• When defining some operations (such as insert and delete) we are free to<br />

choose how the operation acts on the junk. This means that we can have<br />

a set <strong>of</strong> definitions that act in different ways on the junk. Hence we can<br />

choose randomly which definition we want to execute.<br />

• In Section 7.3.1, we have shown more general abstraction functions in<br />

which we can supply a partitioning function p which has type: α → [0..n).<br />

If we fix the value <strong>of</strong> n then we can define our tree operations to contain<br />

occurrences <strong>of</strong> the test for the value <strong>of</strong> p. Thus we can supply the actual<br />

definition for p separately and so choose a partitioning function at random.<br />

Thus on each execution, we can have different junk, different definitions and<br />

different abstraction functions — all <strong>of</strong> which can be chosen randomly.<br />

In Chapter 4 we have seen how to create random splits for lists. Further<br />

work is needed to see how to extend these random splits (and other random<br />

obfuscations) to other data-types.<br />

8.1.5 Contributions<br />

We have seen that our approach has met the objectives stated on Page 7 — these<br />

objectives can be hard to achieve in an object-oriented setting. In addition, we<br />

have proposed a new definition <strong>of</strong> obfuscation, we have some promising results<br />

on the complexity <strong>of</strong> our obfuscations and we have the ability to create random<br />

obfuscations. Thus considering data-types has made a valuable contribution to<br />

the study <strong>of</strong> obfuscation.<br />

Can our techniques be applied to help to obfuscate imperative programs?<br />

In Section 3.1.2 we imposed some restrictions on how we used Haskell as a<br />

modelling language. In particular, we specified finite, well-defined data-types<br />

and we did not exploit laziness. We demanded these restrictions so that we<br />

can implement our obfuscations imperatively. In [21] and on Page 8, we have<br />

given examples <strong>of</strong> how to apply our tree obfuscation from Chapter 7 to obfuscate<br />

some imperative methods. These obfuscations were achieved by manually<br />

adapting the original imperative methods — further work is needed to automate<br />

this conversion. Using imperative programs provides different opportunities for<br />

obfuscation. For instance, trees can be implemented using pointers and the<br />

difficulty in performing pointer analysis could be exploited to construct obfuscations.<br />

Binary trees could be changed into ternary trees and in the junk, bogus<br />

pointers that point back up the tree could be added. As well as implementing<br />

lists using arrays, linked lists could be used. So in addition to splitting the lists,<br />

bogus pointers into the list can be added.<br />

Less satisfactory aspects <strong>of</strong> our approach are that there are some problems<br />

with our definition <strong>of</strong> obfuscation (discussed in Section 3.4.4) and our abstraction<br />

functions act as deobfuscation functions.<br />

8.2 Further Work<br />

We briefly consider some possible areas for further study.

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

Saved successfully!

Ooh no, something went wrong!