String Encryption
Every application - even if it's as simple as possible - always has string data. Those may be texts of shortcuts, buttons and other GUI components. Those may be texts of informational messages and error notifications. Those may be the exceptions' texts. That can be any kind of textual information, which is used by your application. Probably this sort of information can help the hacker more, than any code can. A simple search of the string in the code will in a jiff show the exact place, where it's used, - that means it will localize the necessary piece of code and, as a consequence, make it much easier for the hacker to understand the algorithm of your program. So, the string data encryption must be grasped not just as a subsidiary feature, but as an indispensable attribute of every high-quality obfuscator - just like Allatori.
The set of tricks which has Allatori for obfuscating data contains the following methods:
1. Encoding transformations.
After analyzing your class Allatori will choose all the string data and encode it. In this encoded way they will be kept in constant pool of your class. Also Allatori adds a little piece of code that decodes the strings at runtime. As a result the hacker, having decompiled the class obfuscated by Allatori, will get only the senseless chain of symbols instead of normal strings.
2. Changing the way of keeping the data.
In those cases where it's possible Allatori changes the access to some class fields and methods. A trick of this kind is used for adding extra chaos to the program's code and its further complication.
3. Performing finalization.
Allatori makes some special class fields and methods final, that means it protects them from being overridden in the subclasses. This trick increases the program's speed, and that's its main advantage.
A little example below displays rather clearly what you'll get if using Allatori.
Original source:
private void checkLicense() throws Exception {
if (!isLicenseValid())
throw new Exception("Invalid License.");
else
return;
}
Obfuscated with String Encryption then decompiled:
private void b() throws Exception {
if(!a())
throw new Exception(a.a("\\z`t}}v5Q}}pwg\177{"));
else
return;
}



















