FAQs/Known Issues

Products page
Revision history
User guide
Installation guide
Obfuscation notes
Directives file
Incremental obfuscation
Buildtool integration
Watermarking
License and download
Purchase
Faqs/Known issues
Email
FAQ List

What are the requirements for installing and using Smokescreen?
Installing and running Smokescreen requires that the Java platform (including the Swing package) be installed on your computer.

What does bytecode obfuscation mean?
The code within a method is made up of bytecode instructions which are executed within the JVM. Bytecode obfuscation is used to rearrange or change the bytecode in ways that make it more difficult to decompile. This means that the control flow is obscured making it more difficult for the decompiler output valid java source code.

What's a good way to see the effects of control flow obfuscation
Use Smokescreen to obfuscate the class files for your application (for a realistic test it is best to use a real application or applet, instead of a small test program). Now decompile several of the obfuscated classes using your favourite decompiler. Compare the source generated by the decompiler to your original source, or source that has been recreated by the decompiler from unobfuscated classes.

Can I exclude specific symbolic names from the renaming process?
Yes, any class, method or field name can be preserved during renaming. This is done when using a directives file, the exclusions are specified using name exclusion directives for classes, methods or fields.

Does Smokescreen work with jar and zip files?
Yes the source classes may be in jar or zip files or in directories. The obfuscated classes will be created in corresponding jars, zips or directories.

Can I install Smokescreen from the command line without using the GUI?
Smokescreen can only be installed using the GUI installer. This means that the "Swing" classes have to be available for running the installer.

Can I run Smokescreen from the command line without the GUI?
Yes, once installed Smokescreen can be launched without the GUI. In this case the directives file is used to specify obfuscation options.

When I run the obfuscated code, I get a "java.lang.NoSuchMethodError".
This is most likely because some code is referring to the original name of a method that has now been renamed due to the obfuscation. Any class that refers to other classes which are being obfuscated must themselves be obfuscated, otherwise they will still be referring to the the original unobfuscated names. For example, if class A has references to class B, you will have to obfuscate both classes. If you were to only obfuscate class B without including class A in the obfuscation, then obviously the code in class A would not be able to match up the references for class B. The alternative is to determine which names in class B are being referenced by class A, and then exclude them from the renaming process.

Smokescreen reports that it cannot find a superclass, how do I fix this?
All of the classes in your application that need to be obfuscated will have inherited from some superclass (such as the "Object" class). Smokescreen needs to scan these classes in order to obtain method and field information so that renaming can be done correctly. There are two ways in which Smokescreen can look for these classes.
The first and simpler way is to use the classloader. If you are using a directives file or otherwise specifying directives for obfuscation, then the "use_class_loader_for_superclasses" directives should be included. If obfuscation is being done using the GUI and without a directives file then the "Use Class Loader" checkbox in the "Superclass path selection" should be checked. This panel is accessed through the "Superclass path" selection of the "File" menu.
The second way is to actually specify exact locations for finding the classes. If your classes extend from standard JDK classes then you will need to specify a path to the jar file that contains these classes. In the j2sdk1.4.0 these classes are located in the "rt.jar" file, so you would specify a path to this file. If you have any other "non-standard" superclasses then a path to those must also be specified. If you are using a directives file or otherwise specifying directives for obfuscation, then the path to each file should be specified through a "superclass_path" directive. If obfuscation is being done using the GUI and without a directives file, then the superclass paths can be specified in the GUI by selecting the "Superclass path" option in the "File". This will bring up the "Superclass path selection" panel into which the paths can be entered. Note that if the "Use Class Loader" checkbox is checked then the manually entered paths will be ignored.