Elie
Elie

Reputation: 13843

Creating non-reverse-engineerable Java programs

Is there a way to deploy a Java program in a format that is not reverse-engineerable?

I know how to convert my application into an executable JAR file, but I want to make sure that the code cannot be reverse engineered, or at least, not easily.

Obfuscation of the source code doesn't count... it makes it harder to understand the code, but does not hide it.

A related question is How to lock compiled Java classes to prevent decompilation?


Once I've completed the program, I would still have access to the original source, so maintaining the application would not be the problem. If the application is distributed, I would not want any of the users to be able to decompile it. Obfuscation does not achieve this as the users would still be able to decompile it, and while they would have difficulty following the action flows, they would be able to see the code, and potentially take information out of it.

What I'm concerned about is if there is any information in the code relating to remote access. There is a host to which the application connects using a user-id and password provided by the user. Is there a way to hide the host's address from the user, if that address is located inside the source code?

Upvotes: 5

Views: 10006

Answers (14)

user116541
user116541

Reputation: 106

As someone said above, reverse engineering could always decompile your executable. The only way to protect your source code(or algorithm) is not to distribute your executable.

separate your application into a server code and a client app, hide the important part of your algorithm in your server code and run it in a cloud server, just distribute the client code which works only as a data getter and senter.

By this even your client code is decompiled. You are not losing anything.

But for sure this will decrease the performance and user convenience.

I think this may not be the answer you are looking for, but just to raise different idea of protecting source code.

Upvotes: 1

gizmo
gizmo

Reputation: 11909

The short answer is "No, it does not exist".

Reverse engineering is a process that does not imply to look at the code at all. It's basically trying to understand the underlying mechanisms and then mimic them. For example, that's how JScript appears from MS labs, by copying Netscape's JavaScript behavior, without having access to the code. The copy was so perfect that even the bugs were copied.

Upvotes: 16

yanchenko
yanchenko

Reputation: 57156

Having concerns about concealing the code, I'd run ProGuard anyway.

Upvotes: 0

Hamza Yerlikaya
Hamza Yerlikaya

Reputation:

It can not be done. This is not a Java problem. Any language that can be compiled can be decompiled for Java, it's just easier.

You are trying to show somebody a picture without actually showing them. It is not possible. You also can not hide your host even if you hide at the application level. Someone can still grap it via Wireshark or any other network sniffer.

Upvotes: 1

Niniki
Niniki

Reputation: 810

Don't use an interpreted language? What are you trying to protect anyway? If it's valuable enough, anything can be reverse engineered. The chances of someone caring enough to reverse engineer most projects is minimal. Obfuscation provides at least a minimal hurdle.

Ensure that your intellectual property (IP) is protected via other mechanisms. Particularly for security code, it's important that people be able to inspect implementations, so that the security is in the algorithm, not in the source.

Upvotes: 3

Tanktalus
Tanktalus

Reputation: 22254

You're writing in a language that has introspection as part of the core language. It generates .class files whose specifications are widely known (thus enabling other vendors to produce clean-room implementations of Java compilers and interpreters).

This means there are publicly-available decompilers. All it takes is a few Google searches, and you have some Java code that does the same thing as yours. Just without the comments, and some of the variable names (but the function names stay the same).

Really, obfuscation is about all you can get (though the decompiled code will already be slightly obfuscated) without going to C or some other fully-compiled language, anyway.

Upvotes: 7

albertein
albertein

Reputation: 27120

You could obfuscate your JAR file with YGuard. It doesn't obfuscate your source code, but the compiled classes, so there is no problem about maintaining the code later.

If you want to hide some string, you could encrypt it, making it harder to get it through looking at the source code (it is even better if you obfuscate the JAR file).

Upvotes: 12

Jörg W Mittag
Jörg W Mittag

Reputation: 369428

This is impossible. The CPU will have to execute your program, i.e. your program must be in a format that a CPU can understand. CPUs are much dumber than humans. Ergo, if a CPU can understand your program, a human can.

Upvotes: 0

Patrick
Patrick

Reputation:

With anything interpreted at some point it has to be processed "in the clear". The string would show up clear as day once the code is run through JAD. You could deploy an encryption key with your app or do a basic ceasar cipher to encrypt the host connect info and decrypt at runtime...

But at some point during processing the host connection information must be put in the clear in order for your app to connect to the host...

So you could statically hide it, but you can't hide it during runtime if they running a debugger

Upvotes: 0

Ken
Ken

Reputation: 2092

Make it into a web service. Then you are the only one that can see the source code.

Upvotes: 2

MattC
MattC

Reputation: 12327

Even if you compile the code into native machine language, there are all sorts of programs that let you essentially decompile it into assembly language and follow the process flow (OlyDbg, IDA Pro).

Upvotes: 1

Chris Cudmore
Chris Cudmore

Reputation: 30151

It can't be done.

Anything that can be compiled can be de-compiled. The very best you can do is obfuscate the hell out of it.

That being said, there is some interesting stuff happening in Quantum Cryptography. Essentially, any attempt to read the message changes it. I don't know if this could be applied to source code or not.

Upvotes: 1

Grant Wagner
Grant Wagner

Reputation: 25931

If you know which platforms you are targeting, get something that compiles your Java into native code, such as Excelsior JET or GCJ.

Short of that, you're never going to be able to hide the source code, since the user always has your bytecode and can Jad it.

Upvotes: 8

Walden Leverich
Walden Leverich

Reputation: 4546

I'm tempted to ask why you'd want to do this, but I'll leave that alone...

The problem I see is that the JVM, like the CLR, needs to be able to intrepert you code in order to JIT compile and run it. You can make it more "complex" but given that the spec for bytecode is rather well documented, and exists at a much higher level than something like the x86 assembler spec, it's unlikely you can "hide" the process-flow, since it's got to be there for the program to work in the first place.

Upvotes: 2

Related Questions