Welcome to Scribd, the world's digital library. Read, publish, and share books and documents. See more
Download
Standard view
Full view
of .
Save to My Library
Look up keyword
Like this
2Activity
0 of .
Results for:
No results containing your search query
P. 1
Software Protection Through Dynamic Code Mutation

Software Protection Through Dynamic Code Mutation

Ratings: (0)|Views: 949|Likes:
Published by Adarsh
Software Protection Through Dynamic Code Mutation
Software Protection Through Dynamic Code Mutation

More info:

Categories:Topics, Art & Design
Published by: Adarsh on Oct 06, 2009
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

07/11/2010

pdf

text

original

 
Software Protection through Dynamic CodeMutation
Matias Madou
, Bertrand Anckaert
, Patrick Moseley
, SaumyaDebray
, Bjorn De Sutter
and Koen De Bosschere
Department of Electronics and Information SystemsGhent UniversityB-9000 Ghent, Belgium
{
 mmadou, banckaer, brdsutte, kdb
}
@elis.UGent.be
Department of Computer ScienceUniversity of ArizonaTucson, AZ 85721, U.S.A.
{
 moseley,debray
}
@cs.arizona.edu
Abstract.
Reverse engineering of executable programs, by disassem-bling them and then using program analyses to recover high level se-mantic information, plays an important role in attacks against softwaresystems, and can facilitate software piracy. This paper introduces a noveltechnique to complicate reverse engineering. The idea is to change theprogram code repeatedly as it executes, thereby thwarting correct disas-sembly. The technique can be made as secure as the least secure compo-nent of opaque variables and pseudorandom number generators.
1 Introduction
To reverse-engineer software systems, i.e., to obtain an (at least partial)understanding of the higher-level structure of an executable program,a malicious attacker can subvert many recent advantages in programanalysis technology and software engineering tools. Thus, the existingtechnology can help an attacker to discover software vulnerabilities, tomake unauthorized modifications such as bypassing password protectionor identifying and deleting copyright notices or watermarks within theprogram, or to steal intellectual property.One way to address this problem is to maintain the software in en-crypted form and decrypt it is as needed during execution, using softwaredecryption [1], or specialized hardware [18]. Such approaches have thedisadvantages of high performance overhead or loss of flexibility, becausesoftware can no longer be run on stock hardware.To avoid these disadvantages, this paper instead focuses on an alter-native approach using code obfuscation techniques to enhance software
 
security. The goal is to deter attackers by making the cost of reverseengineering programs prohibitively high.The seminal paper on decompilation and reverse engineering [4] con-siders two major difficulties in the process of reverse engineering pro-grams. The first problem is that data and code are indistinguishable, ascode on a Von Neumann computer is nothing more than a specific type of (binary) data. The second problem relates to self-modifying code, whichdoes not follow the convention of static code that there is a one-to-onemapping between instructions and memory addresses.In this paper, we propose a novel technique to automatically aggravateand/or introduce these problems in existing programs. The basic idea is tomutate a program as it executes, so that a region of memory is occupied bymany different code sequences during the course of execution. We showhow this technique undermines assumptions made by existing analysesfor reverse engineering. Furthermore, we claim that our technique can bemade as secure as the least secure component of opaque variables [5] andpseudorandom number generators [24].The goal of this research is to deter “ordinary attackers” by making itsubstantially more difficult to reverse engineer the obfuscated code; it isconsistent with the prior work on code obfuscation, which aims primarilyto raise the bar against reverse engineering high enough so as to deter allbut the most determined of attackers.The remainder of this paper is structured as follows: Section 2 dis-cusses related work. Our technique is introduced in Section 3. The secu-rity of this technique is the topic of Section 4. An evaluation of the impacton the size and execution time of the program is discussed in Section 5.Finally, conclusions are drawn in Section 6.
2 Related Work
The only other paper we are aware of that proposes dynamic code mod-ifications for obfuscation purposes is that of Kanzaki
et al.
[16], whichdescribes a straightforward scheme for dynamically modifying executablecode. The central idea is to scramble a selected number of instructions inthe program at obfuscation time, and to restore the scrambled instruc-tions into the original instructions at run time. This restoration processis done through modifier instructions that are put along every possibleexecution path leading to the scrambled instructions. Once the restoredinstructions are executed, they are scrambled again. It is however not
 
clear how the modifier instructions pose problems for a static analysistargeted at restoring the original program.There is a considerable body of work on code obfuscation that focuseson making it harder for an attacker to decompile a program and extracthigh level semantic information from it [6,7,21,25]. Typically, these au-thors rely on the use of computationally difficult static analysis problems,e.g., involving complex Boolean expressions, pointers, or indirect controlflow, to make it harder to understand the statically disassembled pro-gram. Our work is complementary to these proposals: we aim to make aprogram harder to disassemble correctly to begin with, let alone recoverhigh level information. If a program has already been obfuscated usingany of these higher level obfuscation techniques, our techniques add anadditional layer of protection that makes it even harder to decipher theactual structure of the program.Researchers have looked into run-time code generation and modifi-cation, including high-level languages and APIs for specifying dynamiccode generation [3,12,13] and its application to run-time code specializa-tion and optimization [2,17,20]. Because that work focuses primarily onimproving or extending a program’s performance or functionality, ratherthan hindering reverse engineering, the developed transformations andtechniques are considerably different from those described in this paper.A run-time code generation techniques that to some extent resem-bles the technique proposed in this paper was proposed by Debray andEvans [11] for applying profile-guided code compression. To reduce thememory footprint of applications, infrequently executed code is stored incompressed format, and decompressed when it needs to be executed. Atany point, only a small fraction of the infrequently executed code is indecompressed form. Because of the large decompression overhead how-ever, the frequently executed code is always available in decompressed,i.e., the original, form. Hence this compression technique does not hidethe frequently executed portions of a program, which are generally alsolikely to contain the code one might wish to protect.
3 Dynamic Software Mutation
This section discusses the introduction of dynamic software mutation intoa program. We consider two types of mutation: one-pass mutation, wherea procedure is generated once just before its first execution, and cluster-based mutations, where the same region of memory is shared by a clusterof “similar” procedures, and where we will reconstruct procedures (and

You're Reading a Free Preview

Download
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->