obfuscate
Sponsored Links
Sponsored Links
Secleted [ 0 ] software to compare
Results 1 - 15 of about 22
B::Deobfuscate 0.18
B::Deobfuscate Perl module contains the deobfuscate source code. more>>
B::Deobfuscate Perl module contains the deobfuscate source code.
SYNOPSIS
perl -MO=Deobfuscate,-csynthetic.yml,-y synthetic.pl
B::Deobfuscate is a backend module for the Perl compiler that generates perl source code, based on the internal compiled structure that perl itself creates after parsing a program. It adds symbol renaming functions to the B::Deparse module. An obfuscated program is already parsed and interpreted correctly by the B::Deparse program. Unfortunately, if the obfuscation involved variable renaming then the resulting program also has obfuscated symbols.
This module takes the last step and fixes names like $z5223ed336 to be a word from a dictionary. While the name still isnt meaningful it is at least easier to distinguish and read. Here are two examples - one from B::Deparse and one from B::Deobfuscate.
Initial input
if(@z6a703c020a){(my($z5a5fa8125d,$zcc158ad3e0)=File::Temp::tempfile(
UNLINK,1));print($z5a5fa8125d "=over 8nn");(print($z5a5fa8125d
@z6a703c020a)or die(((("Cant print $zcc158ad3e0: $!"))); print($z5a5fa8125d
"=backn");(close(*$z5a5fa8125d)or die(((("Cant close ".*$za5fa8125d.": $!")
));(@z8374cc586e=$zcc158ad3e0);($z9e5935eea4=1);}
After B::Deparse:
if (@z6a703c020a) {
(my($z5a5fa8125d, $zcc158ad3e0) = File::Temp::tempfile(UNLINK, 1));
print($z5a5fa8125d "=over 8nn");
(print($z5a5fa8125d @z6a703c020a)
or die((((q[Cant print ] . $zcc158ad3e0) . : ) . $!)));
print($z5a5fa8125d "=backn");
(close(*$z5a5fa8125d)
or die((((q[Cant close ] . *$za5fa8125d) . : . $!)));
(@z8374cc586e = $zcc158ad3e0);
($z9e5935eea4 = 1);
}
After B::Deobfuscate:
if (@parenthesises) {
(my($scrupulousity, $postprocesser) = File::Temp::tempfile(UNLINK, 1));
print($scrupulousity "=over 8nn");
(print($scrupulousity @parenthesises)
or die((((q[Cant print ] . $postprocesser) . : ) . $!)));
print($scrupulousity "=backn");
(close(*$scrupulousity)
or die((((q[Cant close ] . *$postprocesser) . : ) . $!)));
(@interruptable = $postprocesser);
($propagandaist = 1);
}
Youll note that the only real difference is that instead of variable names like $z9e5935eea4 you get $propagandist.
<<lessSYNOPSIS
perl -MO=Deobfuscate,-csynthetic.yml,-y synthetic.pl
B::Deobfuscate is a backend module for the Perl compiler that generates perl source code, based on the internal compiled structure that perl itself creates after parsing a program. It adds symbol renaming functions to the B::Deparse module. An obfuscated program is already parsed and interpreted correctly by the B::Deparse program. Unfortunately, if the obfuscation involved variable renaming then the resulting program also has obfuscated symbols.
This module takes the last step and fixes names like $z5223ed336 to be a word from a dictionary. While the name still isnt meaningful it is at least easier to distinguish and read. Here are two examples - one from B::Deparse and one from B::Deobfuscate.
Initial input
if(@z6a703c020a){(my($z5a5fa8125d,$zcc158ad3e0)=File::Temp::tempfile(
UNLINK,1));print($z5a5fa8125d "=over 8nn");(print($z5a5fa8125d
@z6a703c020a)or die(((("Cant print $zcc158ad3e0: $!"))); print($z5a5fa8125d
"=backn");(close(*$z5a5fa8125d)or die(((("Cant close ".*$za5fa8125d.": $!")
));(@z8374cc586e=$zcc158ad3e0);($z9e5935eea4=1);}
After B::Deparse:
if (@z6a703c020a) {
(my($z5a5fa8125d, $zcc158ad3e0) = File::Temp::tempfile(UNLINK, 1));
print($z5a5fa8125d "=over 8nn");
(print($z5a5fa8125d @z6a703c020a)
or die((((q[Cant print ] . $zcc158ad3e0) . : ) . $!)));
print($z5a5fa8125d "=backn");
(close(*$z5a5fa8125d)
or die((((q[Cant close ] . *$za5fa8125d) . : . $!)));
(@z8374cc586e = $zcc158ad3e0);
($z9e5935eea4 = 1);
}
After B::Deobfuscate:
if (@parenthesises) {
(my($scrupulousity, $postprocesser) = File::Temp::tempfile(UNLINK, 1));
print($scrupulousity "=over 8nn");
(print($scrupulousity @parenthesises)
or die((((q[Cant print ] . $postprocesser) . : ) . $!)));
print($scrupulousity "=backn");
(close(*$scrupulousity)
or die((((q[Cant close ] . *$postprocesser) . : ) . $!)));
(@interruptable = $postprocesser);
($propagandaist = 1);
}
Youll note that the only real difference is that instead of variable names like $z9e5935eea4 you get $propagandist.
Download (0.017MB)
Added: 2007-06-26 License: Perl Artistic License Price:
854 downloads
Obfuscated Tiny C Compiler
Obfuscated Tiny C Compiler (OTCC) is a very small C compiler. more>>
Obfuscated Tiny C Compiler (OTCC) is a very small C compiler I wrote in order to win the International Obfuscated C Code Contest (IOCCC) in 2002.
My goal was to write the smallest C compiler which is able to compile itself. I choose a subset of C which was general enough to write a small C compiler. Then I extended the C subset until I reached the maximum size authorized by the contest: 2048 bytes of C source excluding the ;, {, } and space characters.
I choose to generate i386 code. The original OTCC code could only run on i386 Linux because it relied on endianness and unaligned access. It generated the program in memory and launched it directly. External symbols were resolved with dlsym().
In order to have a portable version of OTCC, I made a variant called OTCCELF. It is only a little larger than OTCC, but it generates directly a dynamically linked i386 ELF executable from a C source without relying on any binutils tools! OTCCELF was tested succesfully on i386 Linux and on Sparc Solaris.
NOTE: My other project TinyCC which is a fully featured ISOC99 C compiler was written by starting from the source code of OTCC !
Compilation:
gcc -O2 otcc.c -o otcc -ldl
gcc -O2 otccelf.c -o otccelf
Self-compilation:
./otccelf otccelf.c otccelf1
<<lessMy goal was to write the smallest C compiler which is able to compile itself. I choose a subset of C which was general enough to write a small C compiler. Then I extended the C subset until I reached the maximum size authorized by the contest: 2048 bytes of C source excluding the ;, {, } and space characters.
I choose to generate i386 code. The original OTCC code could only run on i386 Linux because it relied on endianness and unaligned access. It generated the program in memory and launched it directly. External symbols were resolved with dlsym().
In order to have a portable version of OTCC, I made a variant called OTCCELF. It is only a little larger than OTCC, but it generates directly a dynamically linked i386 ELF executable from a C source without relying on any binutils tools! OTCCELF was tested succesfully on i386 Linux and on Sparc Solaris.
NOTE: My other project TinyCC which is a fully featured ISOC99 C compiler was written by starting from the source code of OTCC !
Compilation:
gcc -O2 otcc.c -o otcc -ldl
gcc -O2 otccelf.c -o otccelf
Self-compilation:
./otccelf otccelf.c otccelf1
Download (0.004MB)
Added: 2006-03-29 License: GPL (GNU General Public License) Price:
1318 downloads
Obfunae 0.5.2
Obfunae is an Obfuna interpreter. more>>
Obfuna is an esoteric programming language designed to minimise the instruction set, the length of code necessary to express a program, and the readability while still remaining vaguely useful.
To achieve these goals, all Obfuna operations are assigned one-character names and take exactly one argument. In fact, the name Obfuna is derived from obfuscated (Obfuna code is, at least initially, difficult to read) and unary (All operations have exactly one argument).
There are twenty six variables and one random-access unbounded array. All variables are dynamically typed as this cuts down on the code length.
Obfuna has 26 standard variables which are represented by the lower-case letters a to z.
There is one random-access array which is infinitely extendable (well, in theory anyway; in practice this will be limited by your machines memory) which is represented by a number (indicating the position in the array - starting at 0) or a function returning a number surrounded by round brackets, i.e. ( and ). For example, the first element in the array is represented by (0). The size of the array increases as you assign to higher locations. The initial size of the array is 0.
There are two special variables used to ascertain the current size of the array. $ holds the index number of the last element in the array and % holds the number of elements in the array. From above, it will be obvious that initially $ will be -1 and % will be 0. Assigning to these variables can grow or shrink (in which case you will lose data) the array to a specified size. These are of particular use as ($) can used to reference the last element in the array and (%) will reference one element beyond the end, allowing you to add a new element, treating the array like a stack.
In addition, there are three special variables which act as I/O pipes. Passing a value to ?, prints the value to the standard output. Assigning a variable from ?, reads from the standard input. ! acts similarly except that in the case of output, it appends a newline (return) character to the value, and in the case of input, it preserves the newline from standard input. # works in exactly the same way as ? but inputs and outputs from and to the currently open file.
The syntax of Obfuna is extremely simple. There are only two types of instruction: function calls and assignments. Assigments take the form of and function calls look like or . Note you can nest functions in this way.
As an example, to assign the number 10 to the variable n, you simply write n10. There is no = operator.
Strings are quoted using the angle brackets, < and >. Anything between curly brackets, { and }, is considered a comment and will be ignored by Obfuna. These are particularly useful for naming variables more helpfully. Instead of just n10, you could write n{umber}10.
The only other syntactic element of Obfuna is the square brackets, [ and ]. Any code between a pair of square brackets will be considered a block to be processed as one instruction. This is of particular use when using flow control functions which skip or repeat only the next instruction.
<<lessTo achieve these goals, all Obfuna operations are assigned one-character names and take exactly one argument. In fact, the name Obfuna is derived from obfuscated (Obfuna code is, at least initially, difficult to read) and unary (All operations have exactly one argument).
There are twenty six variables and one random-access unbounded array. All variables are dynamically typed as this cuts down on the code length.
Obfuna has 26 standard variables which are represented by the lower-case letters a to z.
There is one random-access array which is infinitely extendable (well, in theory anyway; in practice this will be limited by your machines memory) which is represented by a number (indicating the position in the array - starting at 0) or a function returning a number surrounded by round brackets, i.e. ( and ). For example, the first element in the array is represented by (0). The size of the array increases as you assign to higher locations. The initial size of the array is 0.
There are two special variables used to ascertain the current size of the array. $ holds the index number of the last element in the array and % holds the number of elements in the array. From above, it will be obvious that initially $ will be -1 and % will be 0. Assigning to these variables can grow or shrink (in which case you will lose data) the array to a specified size. These are of particular use as ($) can used to reference the last element in the array and (%) will reference one element beyond the end, allowing you to add a new element, treating the array like a stack.
In addition, there are three special variables which act as I/O pipes. Passing a value to ?, prints the value to the standard output. Assigning a variable from ?, reads from the standard input. ! acts similarly except that in the case of output, it appends a newline (return) character to the value, and in the case of input, it preserves the newline from standard input. # works in exactly the same way as ? but inputs and outputs from and to the currently open file.
The syntax of Obfuna is extremely simple. There are only two types of instruction: function calls and assignments. Assigments take the form of and function calls look like or . Note you can nest functions in this way.
As an example, to assign the number 10 to the variable n, you simply write n10. There is no = operator.
Strings are quoted using the angle brackets, < and >. Anything between curly brackets, { and }, is considered a comment and will be ignored by Obfuna. These are particularly useful for naming variables more helpfully. Instead of just n10, you could write n{umber}10.
The only other syntactic element of Obfuna is the square brackets, [ and ]. Any code between a pair of square brackets will be considered a block to be processed as one instruction. This is of particular use when using flow control functions which skip or repeat only the next instruction.
Download (0.020MB)
Added: 2005-04-14 License: GPL (GNU General Public License) Price:
1654 downloads
obfsh 1.2
obfsh is a shell script obfuscator. more>>
obfsh is a shell script obfuscator. It is quite flexible and can obfuscate any type of shell script.
The obfuscated script version is printed to stdout. The original script is not modified.
Options:
-c < n >, insert deceiving comments for every n line
-d < n >, insert deceiving code for every n line
-e < n1 >-< n2 >, prepend each line with a random number of spaces ranging
from n1 to n2
-f < file >, file to obfuscate
-g < n1 >-< n2 >+< n3 >-< n4 >, insert gibberish header and footer of n2 lines
long with each line n1 signs long, n3-n4 being range of characters
to generate from. See the manual for more details.
-h, usage and options (this help)
-i, remove blank lines, comments, leading and trailing spaces and tabs
-j < n1 >-< n2 >, insert n1 empty lines for every n2 line
-m, manual
-l, see this script"
<<lessThe obfuscated script version is printed to stdout. The original script is not modified.
Options:
-c < n >, insert deceiving comments for every n line
-d < n >, insert deceiving code for every n line
-e < n1 >-< n2 >, prepend each line with a random number of spaces ranging
from n1 to n2
-f < file >, file to obfuscate
-g < n1 >-< n2 >+< n3 >-< n4 >, insert gibberish header and footer of n2 lines
long with each line n1 signs long, n3-n4 being range of characters
to generate from. See the manual for more details.
-h, usage and options (this help)
-i, remove blank lines, comments, leading and trailing spaces and tabs
-j < n1 >-< n2 >, insert n1 empty lines for every n2 line
-m, manual
-l, see this script"
Download (0.016MB)
Added: 2006-08-23 License: GPL (GNU General Public License) Price:
1161 downloads
Camero 3.2.1
Camero is a three-part system for creating and running webcam portals. more>>
Camero is a three-part system for creating and running webcam portals. It is made of a daemon, an admin tool, and a portal CGI.
Camero 3.2 comes with the following components:
camero.py
The daemon. This component is what runs in the background, checking the cams, archiving images and updating the database.
admin.py
The admin tool cgi. This component allows you to add/remove cams, view images in the archive, edit settings, basically administrate everything
PortalConfig.py
The main portal configuration file.
PySP.py
The portal front end cgi. This processes all the portal template files.
classes/
Where the classes for the portal are kept
templates/
Where the templates for the portal are kept
db.conf
The config file for your database. This is only an example, you will need to configure and obtain info for your specific database installation.
getImage.py
This is a cgi that allows for you to obfuscate the path to your images.
See the development doc for more details
tools/archiveMaint.py
This is a utility that performs the database maintenance. It will keep your archive directories down to the size you specify.
index.html
Simple redirection to the main portal page
Secondary Components:
DB.py
This code allows for easy access to the database. All of the primary components require this to be in the same directory to execute. See the development doc for more details.
camctl
This is a shell script that should be used to start/stop/restart the daemon.
rc.d/camero.linux
A start up script for linux.
rc.d/camero.FreeBSD
A start up script for FreeBSD.
tools/deDupe.py
This is a tool that will search through all your archived images and remove any duplicates. It is not normally needed as camero will catch sequential duplicates, however users have a way of messing things up no matter how hard you try.
tools/import.py
This tool allows you to import your previous Camero config. It only imports cams but it can save a lot of entry time.
tools/sanityCheck.py
This tool will check your environment and let you know if everything checks out
tools/upgradeDB_(version).py
This tool will upgrade the database structure from any previous version to that of the current one.
tools/convertDB_(version).py
This will convert a database initialized by the free distribution to the structure of the commercial distribution (comes with commercial ver)
tools/daemonCheck.sh
This will check to see if the camero daemon is running, and if not, restart it.
Main features:
- PySP Server Page Processor (Templates, no python knowledge needed)
- New portal code thats easy to read, edit and extend
- Admin interface UI enhancements
- Configurable thumbnailing support
- Configurable generic image "pipe" support (watermark or logo the images)
<<lessCamero 3.2 comes with the following components:
camero.py
The daemon. This component is what runs in the background, checking the cams, archiving images and updating the database.
admin.py
The admin tool cgi. This component allows you to add/remove cams, view images in the archive, edit settings, basically administrate everything
PortalConfig.py
The main portal configuration file.
PySP.py
The portal front end cgi. This processes all the portal template files.
classes/
Where the classes for the portal are kept
templates/
Where the templates for the portal are kept
db.conf
The config file for your database. This is only an example, you will need to configure and obtain info for your specific database installation.
getImage.py
This is a cgi that allows for you to obfuscate the path to your images.
See the development doc for more details
tools/archiveMaint.py
This is a utility that performs the database maintenance. It will keep your archive directories down to the size you specify.
index.html
Simple redirection to the main portal page
Secondary Components:
DB.py
This code allows for easy access to the database. All of the primary components require this to be in the same directory to execute. See the development doc for more details.
camctl
This is a shell script that should be used to start/stop/restart the daemon.
rc.d/camero.linux
A start up script for linux.
rc.d/camero.FreeBSD
A start up script for FreeBSD.
tools/deDupe.py
This is a tool that will search through all your archived images and remove any duplicates. It is not normally needed as camero will catch sequential duplicates, however users have a way of messing things up no matter how hard you try.
tools/import.py
This tool allows you to import your previous Camero config. It only imports cams but it can save a lot of entry time.
tools/sanityCheck.py
This tool will check your environment and let you know if everything checks out
tools/upgradeDB_(version).py
This tool will upgrade the database structure from any previous version to that of the current one.
tools/convertDB_(version).py
This will convert a database initialized by the free distribution to the structure of the commercial distribution (comes with commercial ver)
tools/daemonCheck.sh
This will check to see if the camero daemon is running, and if not, restart it.
Main features:
- PySP Server Page Processor (Templates, no python knowledge needed)
- New portal code thats easy to read, edit and extend
- Admin interface UI enhancements
- Configurable thumbnailing support
- Configurable generic image "pipe" support (watermark or logo the images)
Download (0.052MB)
Added: 2006-06-24 License: Freeware Price:
1218 downloads
ProGuard 3.9 / 4.0 Beta
ProGuard is a Java class file shrinker and obfuscator. more>>
ProGuard is a free Java class file shrinker, optimizer, and obfuscator. ProGuard project can detect and remove unused classes, fields, methods, and attributes. It can then optimize bytecode and remove unused instructions.
Finally, it can rename the remaining classes, fields, and methods using short meaningless names. The resulting jars are smaller and harder to reverse-engineer.
More compact jar files also means smaller storage requirements, faster transfer of applications across networks, faster loading, and smaller memory footprints.
ProGuards main advantage compared to other Java obfuscators is probably its compact template-based configuration. A few intuitive command line options or a simple configuration file are usually sufficient. For instance, the following configuration option preserves all applets in a jar:
-keep public class * extends java.applet.Applet
The user manual explains all available options and shows more examples of this powerful configuration style.
ProGuard is fast. It only takes seconds to process programs and libraries of several megabytes. The results section presents actual figures for a number of applications.
ProGuard is a command-line tool with an optional graphical user interface. It also comes with plugins for Ant and for the J2ME Wireless Toolkit.
ProGuard is a Java class file shrinker, optimizer, and obfuscator. The shrinking step detects and removes unused classes, fields, methods, and attributes. The optimization step analyzes and optimizes the bytecode of the methods. The obfuscation step renames the remaining classes, fields, and methods using short meaningless names. The resulting jars are smaller and harder to reverse-engineer.
ProGuard can also be used to list unused fields and methods in an application, and to print out the internal structure of class files.
ProGuard typically reads the input jars (or wars, ears, zips, or directories). It then shrinks, optimizes, and obfuscates them. It then writes the results to one or more output jars (or wars, ears, zips, or directories). The input jars can optionally contain resource files. ProGuard copies all non-class resource files from the input jars to the output jars. Their names and contents remain unchanged.
ProGuard requires the library jars (or wars, ears, zips, or directories) of the input jars to be specified. It can then reconstruct class hierarchies and other class dependencies, which are necessary for proper shrinking, optimization, and obfuscation. The library jars themselves always remain unchanged. You should still put them in the class path of your final application.
In order to determine which code has to be preserved and which code can be discarded or obfuscated, you have to specify one or more entry points to your code. These entry points are typically classes with main methods, applets, midlets, etc.
- In the shrinking step, ProGuard starts from these seeds and recursively determines which classes and class members are used. All other classes and class members are discarded.
- In the optimization step, ProGuard further optimizes the code. Among other optimizations, classes and methods that are not entry points can be made final, and some methods may be inlined.
- In the obfuscation step, ProGuard renames classes and class members that are not entry points. In this entire process, keeping the entry points ensures that they can still be accessed by their original names.
Any classes or class members of your code that are created or invoked dynamically (that is, by name) have to be specified as entry points too. It is generally impossible to determine these cases automatically, but ProGuard will offer some suggestions if keeping some classes or class members appears necessary. For proper results, you should at least be somewhat familiar with the code that you are processing.
ProGuard does handle Class.forName("SomeClass") and SomeClass.class constructs automatically. The referenced classes are preserved in the shrinking phase, and the string arguments are properly replaced in the obfuscation phase. With variable string arguments, it is generally impossible to determine their possible values (they might be read from a configuration file, for instance).
However, as mentioned, ProGuard will note constructs like "(SomeClass)Class.forName(variable).newInstance()". These might be an indication that the class or interface SomeClass and/or its implementations may need to be preserved. You can then adapt your configuration accordingly.
Whats New in 3.9 Stable Release:
- This release fixes a number of bugs.
- Notably, ".class" constructs compiled in Java 6 are now handled correctly.
- The optimization step now avoids a possible division by 0 and correctly processes local variables with indices larger than 255.
- The documentation and examples have been updated.
Whats New in 4.0 Beta Development Release:
- Added preverifier for Java 6 and Java Micro Edition, with new option -dontpreverify.
- Added new option -target to modify java version of processed class files.
- Made -keep options more orthogonal and flexible, with option modifiers allowshrinking, allowoptimization, and allowobfuscation.
- Added support for configuration by means of annotations.
- Improved shrinking of unused annotations.
- Added check on modification times of input and output, to avoid unnecessary processing, with new option -forceprocessing.
- Added new options -flattenpackagehierarchy and -repackageclasses (replacing -defaultpackage) to control obfuscation of packages names.
- Added new options -adaptresourcefilenames and -adaptresourcefilecontents, with file filters, to update resource files corresponding to obfuscated class names.
- Now respecting naming rule for nested class names (EnclosingClass$InnerClass) in obfuscation step, if InnerClasses attributes or EnclosingMethod attributes are being kept.
- Added new inter-procedural optimizations: method inlining and propagation of constant fields, constant arguments, and constant return values.
- Added optimized local variable allocation.
- Added over 250 new peephole optimizations.
- Improved making classes and class members public or protected.
- Now printing notes on suspiciously unkept classes in parameters of specified methods.
- Now printing notes for class names that dont seem to be fully qualified.
- Added support for uppercase filename extensions.
- Rewritten class file I/O code.
- Updated documentation and examples.
<<lessFinally, it can rename the remaining classes, fields, and methods using short meaningless names. The resulting jars are smaller and harder to reverse-engineer.
More compact jar files also means smaller storage requirements, faster transfer of applications across networks, faster loading, and smaller memory footprints.
ProGuards main advantage compared to other Java obfuscators is probably its compact template-based configuration. A few intuitive command line options or a simple configuration file are usually sufficient. For instance, the following configuration option preserves all applets in a jar:
-keep public class * extends java.applet.Applet
The user manual explains all available options and shows more examples of this powerful configuration style.
ProGuard is fast. It only takes seconds to process programs and libraries of several megabytes. The results section presents actual figures for a number of applications.
ProGuard is a command-line tool with an optional graphical user interface. It also comes with plugins for Ant and for the J2ME Wireless Toolkit.
ProGuard is a Java class file shrinker, optimizer, and obfuscator. The shrinking step detects and removes unused classes, fields, methods, and attributes. The optimization step analyzes and optimizes the bytecode of the methods. The obfuscation step renames the remaining classes, fields, and methods using short meaningless names. The resulting jars are smaller and harder to reverse-engineer.
ProGuard can also be used to list unused fields and methods in an application, and to print out the internal structure of class files.
ProGuard typically reads the input jars (or wars, ears, zips, or directories). It then shrinks, optimizes, and obfuscates them. It then writes the results to one or more output jars (or wars, ears, zips, or directories). The input jars can optionally contain resource files. ProGuard copies all non-class resource files from the input jars to the output jars. Their names and contents remain unchanged.
ProGuard requires the library jars (or wars, ears, zips, or directories) of the input jars to be specified. It can then reconstruct class hierarchies and other class dependencies, which are necessary for proper shrinking, optimization, and obfuscation. The library jars themselves always remain unchanged. You should still put them in the class path of your final application.
In order to determine which code has to be preserved and which code can be discarded or obfuscated, you have to specify one or more entry points to your code. These entry points are typically classes with main methods, applets, midlets, etc.
- In the shrinking step, ProGuard starts from these seeds and recursively determines which classes and class members are used. All other classes and class members are discarded.
- In the optimization step, ProGuard further optimizes the code. Among other optimizations, classes and methods that are not entry points can be made final, and some methods may be inlined.
- In the obfuscation step, ProGuard renames classes and class members that are not entry points. In this entire process, keeping the entry points ensures that they can still be accessed by their original names.
Any classes or class members of your code that are created or invoked dynamically (that is, by name) have to be specified as entry points too. It is generally impossible to determine these cases automatically, but ProGuard will offer some suggestions if keeping some classes or class members appears necessary. For proper results, you should at least be somewhat familiar with the code that you are processing.
ProGuard does handle Class.forName("SomeClass") and SomeClass.class constructs automatically. The referenced classes are preserved in the shrinking phase, and the string arguments are properly replaced in the obfuscation phase. With variable string arguments, it is generally impossible to determine their possible values (they might be read from a configuration file, for instance).
However, as mentioned, ProGuard will note constructs like "(SomeClass)Class.forName(variable).newInstance()". These might be an indication that the class or interface SomeClass and/or its implementations may need to be preserved. You can then adapt your configuration accordingly.
Whats New in 3.9 Stable Release:
- This release fixes a number of bugs.
- Notably, ".class" constructs compiled in Java 6 are now handled correctly.
- The optimization step now avoids a possible division by 0 and correctly processes local variables with indices larger than 255.
- The documentation and examples have been updated.
Whats New in 4.0 Beta Development Release:
- Added preverifier for Java 6 and Java Micro Edition, with new option -dontpreverify.
- Added new option -target to modify java version of processed class files.
- Made -keep options more orthogonal and flexible, with option modifiers allowshrinking, allowoptimization, and allowobfuscation.
- Added support for configuration by means of annotations.
- Improved shrinking of unused annotations.
- Added check on modification times of input and output, to avoid unnecessary processing, with new option -forceprocessing.
- Added new options -flattenpackagehierarchy and -repackageclasses (replacing -defaultpackage) to control obfuscation of packages names.
- Added new options -adaptresourcefilenames and -adaptresourcefilecontents, with file filters, to update resource files corresponding to obfuscated class names.
- Now respecting naming rule for nested class names (EnclosingClass$InnerClass) in obfuscation step, if InnerClasses attributes or EnclosingMethod attributes are being kept.
- Added new inter-procedural optimizations: method inlining and propagation of constant fields, constant arguments, and constant return values.
- Added optimized local variable allocation.
- Added over 250 new peephole optimizations.
- Improved making classes and class members public or protected.
- Now printing notes on suspiciously unkept classes in parameters of specified methods.
- Now printing notes for class names that dont seem to be fully qualified.
- Added support for uppercase filename extensions.
- Rewritten class file I/O code.
- Updated documentation and examples.
Download (MB)
Added: 2007-06-27 License: GPL (GNU General Public License) Price:
905 downloads
bb_mug 1.5
bb_mug is a simple, tiny, and fast Java class obfuscator. more>>
bb_mug is a simple, tiny, and fast Java class obfuscator. Where applicable, it replaces class, method, and field names with shorter names.
bb_mug removes all information not required for execution.
Main features:
- It is simple since there are no options
- It is tiny because it was coded smart
- It is fast due to efficient algorithms
bb_mug requires 2 arguments:
< inpath > the input path, to read the classes to obfuscate
< outpath > the output path, to write the obfuscated classes to
There are no options since it follows the default visibility paradigm:
- public elements are not obfuscated
- protected elements are not obfuscated, if they might be visible to external derived classes
- package local and pricate members are always obfuscated
If you believe that a public method should be obfuscated you should reconsider why it is public.
Enhancements:
- Two bugfixes were made.
- References to mangled members in a different class are resolved correctly now even when the member resides in a base class of the reference class.
- Mangled members no longer hide mangled members from parent classes.
<<lessbb_mug removes all information not required for execution.
Main features:
- It is simple since there are no options
- It is tiny because it was coded smart
- It is fast due to efficient algorithms
bb_mug requires 2 arguments:
< inpath > the input path, to read the classes to obfuscate
< outpath > the output path, to write the obfuscated classes to
There are no options since it follows the default visibility paradigm:
- public elements are not obfuscated
- protected elements are not obfuscated, if they might be visible to external derived classes
- package local and pricate members are always obfuscated
If you believe that a public method should be obfuscated you should reconsider why it is public.
Enhancements:
- Two bugfixes were made.
- References to mangled members in a different class are resolved correctly now even when the member resides in a base class of the reference class.
- Mangled members no longer hide mangled members from parent classes.
Download (0.035MB)
Added: 2006-02-28 License: Free for non-commercial use Price:
1333 downloads
ccovinstrument 0.20
ccovinstrument package contains instruments C/C++ code for test coverage analysis. more>>
ccovinstrument package contains instruments C/C++ code for test coverage analysis.
SYNOPSIS
ccovinstrument code.c > covcode.c
ccovinstrument code.c [-f] -o covcode.c [-e errs]
-f instrument fatal code as well as normal code
Scans C/C++ source (before cpp) and inserts trip-wires in each code path to record execution.
A number of error prone coding styles are also detected. Many of these ideas came from study of the highly regarded perl5 source code (and from my own coding experience.
This approach (or almost any approach) to coverage analysis is NOT fullproof! Just because you exercise every code path does NOT mean you have exercised all possibilities. For example, consider the following code:
char
fetch_char(int xx)
{
static char *string = "Dr. Zorph Trokien";
if (xx < 0) {
return 0;
} else {
return string[xx];
}
}
Unfortunately, you still have to be somewhat intelligent about designing your test scripts. However, assuming youre clever, you can use this tool to know when to stop writing more tests. Thus, thereby achieving test coverage.
CCov SOURCE DIRECTIVES
/* CCov: off */
Turns off coverage instrumentation. You probably dont want to analyze debugging code.
/* CCov: on */
Turns on coverage instrumentation.
/* CCov: jump if for do while else return */
Adds to the list of identifiers that cause a change in execution flow. In addition to the usual keywords, macros used by the perl core and XSUBs are included by default.
/* CCov: fatal myexit croak panic */
Adds to the list of identifiers that cause a fatal exception. Instrumentation of these blocks is turned off by default. (You usually want to make sure the code is suppose to work works before you make sure that the code that isnt support to work works.)
HOW DOES IT WORK?
The instrumenter processes source code before it is seen by cpp. This helps you isolate your testing. Usually, you want to do test analysis on each library/application individually. A global analysis would cause you to test new code and all the libraries you are using (for every single application!).
The instrumentor does not really use a lexer (tokenizer). The techniques are probably more similar to image processing than parsing. As you might imagine, this doesnt work in the general case. CCov tries to be forgiving, but it simply doesnt understand obfuscated code. Rather than calling it a bug, I think its an significant feature.
Simple code probably has fewer bugs than complex code. Not only is this tool aimed at test coverage analysis, it is also helps you improve your coding style. There are still some rough edges, but I am mostly satisfied with the degree of strictness.
<<lessSYNOPSIS
ccovinstrument code.c > covcode.c
ccovinstrument code.c [-f] -o covcode.c [-e errs]
-f instrument fatal code as well as normal code
Scans C/C++ source (before cpp) and inserts trip-wires in each code path to record execution.
A number of error prone coding styles are also detected. Many of these ideas came from study of the highly regarded perl5 source code (and from my own coding experience.
This approach (or almost any approach) to coverage analysis is NOT fullproof! Just because you exercise every code path does NOT mean you have exercised all possibilities. For example, consider the following code:
char
fetch_char(int xx)
{
static char *string = "Dr. Zorph Trokien";
if (xx < 0) {
return 0;
} else {
return string[xx];
}
}
Unfortunately, you still have to be somewhat intelligent about designing your test scripts. However, assuming youre clever, you can use this tool to know when to stop writing more tests. Thus, thereby achieving test coverage.
CCov SOURCE DIRECTIVES
/* CCov: off */
Turns off coverage instrumentation. You probably dont want to analyze debugging code.
/* CCov: on */
Turns on coverage instrumentation.
/* CCov: jump if for do while else return */
Adds to the list of identifiers that cause a change in execution flow. In addition to the usual keywords, macros used by the perl core and XSUBs are included by default.
/* CCov: fatal myexit croak panic */
Adds to the list of identifiers that cause a fatal exception. Instrumentation of these blocks is turned off by default. (You usually want to make sure the code is suppose to work works before you make sure that the code that isnt support to work works.)
HOW DOES IT WORK?
The instrumenter processes source code before it is seen by cpp. This helps you isolate your testing. Usually, you want to do test analysis on each library/application individually. A global analysis would cause you to test new code and all the libraries you are using (for every single application!).
The instrumentor does not really use a lexer (tokenizer). The techniques are probably more similar to image processing than parsing. As you might imagine, this doesnt work in the general case. CCov tries to be forgiving, but it simply doesnt understand obfuscated code. Rather than calling it a bug, I think its an significant feature.
Simple code probably has fewer bugs than complex code. Not only is this tool aimed at test coverage analysis, it is also helps you improve your coding style. There are still some rough edges, but I am mostly satisfied with the degree of strictness.
Download (0.015MB)
Added: 2007-05-31 License: Perl Artistic License Price:
528 downloads
phpGuardian 2.0 Beta
phpGuardian is a script that allows to monitorize the access to your scripts. more>>
phpGuardian is a script that allows to monitorize the access to your scripts, and eventually to execute, in the script, of the additional code (es. for locking the execution to who you want).
Moreover the script acts as also from encoder of the code, preventing the visualization and the modification of the code php.
Main features:
- Monitoring execution script
- Execution additional code inside of the monitorized script
- List of the users who use the monitorized script
- Information on every users
- It codifies sources php with two modality and vary levels of security
Enhancements:
- The obfuscator, the database astraction, the re-encode script, the re-obfuscate script, the documentation were added.
- More functionality was added to server.php.
- Several improvements were carried out.
- Several bugs were resolved.
<<lessMoreover the script acts as also from encoder of the code, preventing the visualization and the modification of the code php.
Main features:
- Monitoring execution script
- Execution additional code inside of the monitorized script
- List of the users who use the monitorized script
- Information on every users
- It codifies sources php with two modality and vary levels of security
Enhancements:
- The obfuscator, the database astraction, the re-encode script, the re-obfuscate script, the documentation were added.
- More functionality was added to server.php.
- Several improvements were carried out.
- Several bugs were resolved.
Download (0.093MB)
Added: 2006-09-20 License: Other/Proprietary License with Source Price:
1131 downloads
Classfile Reader & Writer
Classfile Reader & Writer is a package for reading and writing Java .class files. more>>
This package makes it easy to read and write java classfiles. It doesnt, however, provide any help with displaying the contents of a classfile to the user (unless you count debug output), or disassembling the bytecodes.
This code snippet will read in a classfile and write it back out to a different file.
InputStream is = new FileInputStream("Foo.class");
OutputStream os = new FileOutputStream("FooCopy.class");
ClassInfo classInfo = new ClassInfo();
new ClassFileReader().read(is, classInfo);
classInfo.setName("FooCopy"); // Java requires the class name to match the file name
new ClassFileWriter().write(classInfo, os);
is.close();os.close();
The package can read "obfuscated" classfiles, like those generated by Crema, but it cant write them. Obfuscated classfiles have invalid data in them and the only reason they work is because most VMs ignore the data thats invalid (attributes like SourceFile, LineNumberTable, and LocalVariableTable). If a ClassFileReader encounters invalid data, it just ignores it.
<<lessThis code snippet will read in a classfile and write it back out to a different file.
InputStream is = new FileInputStream("Foo.class");
OutputStream os = new FileOutputStream("FooCopy.class");
ClassInfo classInfo = new ClassInfo();
new ClassFileReader().read(is, classInfo);
classInfo.setName("FooCopy"); // Java requires the class name to match the file name
new ClassFileWriter().write(classInfo, os);
is.close();os.close();
The package can read "obfuscated" classfiles, like those generated by Crema, but it cant write them. Obfuscated classfiles have invalid data in them and the only reason they work is because most VMs ignore the data thats invalid (attributes like SourceFile, LineNumberTable, and LocalVariableTable). If a ClassFileReader encounters invalid data, it just ignores it.
Download (0.056MB)
Added: 2005-04-22 License: Public Domain Price:
1651 downloads
Tom the Tomato 2.0.1
Tom the Tomato is a clone of Rainbow inslands. more>>
Tom the Tomato is a clone of Rainbow inslands.
Tom must jump higher and higher to survive. Graphic is simple - hand draw.
Enhancements:
- Higher RESOLUTION (320x240 Pixel instead of 256x192!)
- More COLORS (Full 8-bit mode, 262144 color palette instead of 256 colors!)
- More NOISE (New 8-bit square-wave generator! [replaced with a sample in 2.01])
- True programmers` art GRAPHICS (...!)
- True programmers` art MUSIC (turn off speakers!)
- Bounding box COLLISION (with big bounding boxes!)
- 4-way SCROLLING (and simulated 8-way scrolling!)
- 10 LEVELS (hard to beat!)
- unique TILES in every level (with transparent background!)
- 4 unique ENEMIES (animated!)
- 1 PARTICLE effect (rain drops!)
- 1 SPECIAL EFFECT (tainted sprites in water!)
- 1 SOUND effect (might interfere with music though [not anymore in 2.01]!)
- RECORD/PLAYBACK possibilities (9 demo recordings included!)
- Unlimited RESTARTS (instead of load/save cheating!)
- CHEAT CODE (skip levels by pressing IDLEV times during ready screen!)
- Full C++ SOURCE CODE provided (somewhat obfuscated, and protected by GPL!)
- Uses the ALLEGRO library (therefore running on lots of platforms!)
- Uses DUMB for music playback (as of version 2.01!)
<<lessTom must jump higher and higher to survive. Graphic is simple - hand draw.
Enhancements:
- Higher RESOLUTION (320x240 Pixel instead of 256x192!)
- More COLORS (Full 8-bit mode, 262144 color palette instead of 256 colors!)
- More NOISE (New 8-bit square-wave generator! [replaced with a sample in 2.01])
- True programmers` art GRAPHICS (...!)
- True programmers` art MUSIC (turn off speakers!)
- Bounding box COLLISION (with big bounding boxes!)
- 4-way SCROLLING (and simulated 8-way scrolling!)
- 10 LEVELS (hard to beat!)
- unique TILES in every level (with transparent background!)
- 4 unique ENEMIES (animated!)
- 1 PARTICLE effect (rain drops!)
- 1 SPECIAL EFFECT (tainted sprites in water!)
- 1 SOUND effect (might interfere with music though [not anymore in 2.01]!)
- RECORD/PLAYBACK possibilities (9 demo recordings included!)
- Unlimited RESTARTS (instead of load/save cheating!)
- CHEAT CODE (skip levels by pressing IDLEV times during ready screen!)
- Full C++ SOURCE CODE provided (somewhat obfuscated, and protected by GPL!)
- Uses the ALLEGRO library (therefore running on lots of platforms!)
- Uses DUMB for music playback (as of version 2.01!)
Download (0.12MB)
Added: 2005-08-11 License: GPL (GNU General Public License) Price:
859 downloads
Sunifdef 3.1
Sunifdef is a command line tool for simplifying the preprocessor conditionals in C/C++ source code. more>>
Sunifdef is a command line tool for simplifying the preprocessor conditionals in C/C++ source code (#if and related directives) based on the the users chosen interpretation of the preprocessor symbols.
Sunifdef is a more powerful successor to the FreeBSD unifdef tool. Sunifdef is most useful to developers of constantly evolving products with large code bases, where preprocessor conditionals are used to configure the feature sets, APIs or implementations of different releases.
In these environments, the code base steadily accumulates #ifdef-pollution as transient configuration options become obselete. Sunifdef can largely automate the recurrent task of purging redundant #if-logic from the code.
Installation:
Download the tarball to a location under your home directory
Extract the directory sunifdef from the tarball. Do not rename it.
To install from source:
Open a command console and cd into the sunifdef directory
Run ./configure
If all is well, run make
If all is well, run su and enter the root password when prompted (to become root).
Run make install
To install the pre-built executable:
As root, copy built-bin/sunfidef from the sunifdef directory into /usr/local/bin.
Set permissions on /usr/local/bin/sunifdef to make it executable.
As root, copy man/sunifdef.1 from the sunifdef directory into /usr/local/man/man1
To test that Sunifdef is installed:
Run sunifdef -v, and expect output like:
sunifdef, version 0.1.3 (built Feb 22 2006, 19:47:48)
sunifdef: Completed, exit code 0x0000
Run man sunifdef, and expect to see the sunifdef man page.
Enhancements:
- The parser is strengthened to cope with contexts that were formerly skipped over as "obfuscated".
- The --obfusc option is thus redundant and is withdrawn.
- Six bugs are fixed.
- The demise of the Sourceforge compile farm means that many platforms can no longer be tested for this release.
<<lessSunifdef is a more powerful successor to the FreeBSD unifdef tool. Sunifdef is most useful to developers of constantly evolving products with large code bases, where preprocessor conditionals are used to configure the feature sets, APIs or implementations of different releases.
In these environments, the code base steadily accumulates #ifdef-pollution as transient configuration options become obselete. Sunifdef can largely automate the recurrent task of purging redundant #if-logic from the code.
Installation:
Download the tarball to a location under your home directory
Extract the directory sunifdef from the tarball. Do not rename it.
To install from source:
Open a command console and cd into the sunifdef directory
Run ./configure
If all is well, run make
If all is well, run su and enter the root password when prompted (to become root).
Run make install
To install the pre-built executable:
As root, copy built-bin/sunfidef from the sunifdef directory into /usr/local/bin.
Set permissions on /usr/local/bin/sunifdef to make it executable.
As root, copy man/sunifdef.1 from the sunifdef directory into /usr/local/man/man1
To test that Sunifdef is installed:
Run sunifdef -v, and expect output like:
sunifdef, version 0.1.3 (built Feb 22 2006, 19:47:48)
sunifdef: Completed, exit code 0x0000
Run man sunifdef, and expect to see the sunifdef man page.
Enhancements:
- The parser is strengthened to cope with contexts that were formerly skipped over as "obfuscated".
- The --obfusc option is thus redundant and is withdrawn.
- Six bugs are fixed.
- The demise of the Sourceforge compile farm means that many platforms can no longer be tested for this release.
Download (0.10MB)
Added: 2007-05-13 License: BSD License Price:
894 downloads
uml2svg 0.18
uml2svg is an XSLT-based tool for converting XMI-compliant UML Diagrams into SVG. more>>
uml2svg is an XSLT-based tool for converting XMI-compliant UML Diagrams into SVG.
We started the developing uml2svg with six main goals in mind:
- Standard conformance
- Good Documentation
- Modularity
- Extensibility
- Comprehensible SVG
- Multiple diagrams per XMI-file
SVG is a standard language for describing two-dimensional vector graphics in XML. As the open SVG standard gains in popularity and gradually replaces proprietary formats for vectorial graphics, the support provided by the Web browsers is getting better.
Plugins to display SVG exist for most browsers and it is most likely that the next generation of Web browser will provide built-in support for SVG. When that happens there will be no better way to distribute vector graphics on the web. Furthermore, not only web browsers can process SVG in a meaningful way; in fact that is just the tip of the iceberg. SVG can be easily read in, processed, and then transformed into many other formats, being well suited for both text and graphic tools as well as for web agents and screen readers.
UML diagrams are composed of lines, polygons, ellipses and text labels, so they are inherently vectorial. However, the SVG is not very well suited for direct use by UML tools. While some of them can in fact export UML diagrams directly to SVG, they do that by discarding all the information about structure, and converting everything into a shape. Moreover, some tools use the screen-capture function provided by their environment (such as java2d) and then they apply a filter to generate SVG out of the "screenshot".
What comes out of that is a pile of meaningless information, which by accident happens to draw a gorgeous diagram. How will a screen reader interpret such a file? How will a web crawler be able to index it? How will a web agent process it in a meaningful way? A program needs the semantic information that the humans can extract just by looking at a picture. For a machine, an obfuscated SVG file is not easier to process than a PNG file or any other image.
Although for humans it is better to be able to scale the image, for a program this is irrelevant. Programs need a way to "understand" the semantics of the UML models to be able to process and interchange them in a meaningfull way. This was the main idea behind the XML Metadata Interchange (XMI), an OMG specification for model interchange. And probably the best use that XMI has found so far is the exchange of UML models between different modeling tools. And while the XMI provides a standard way for tools to represent models as XML documents, it is still limited to the model elements only.
With the introduction of the UML 2.0 Diagram Interchange Specification as part of the upcoming UML 2.0 standard, it will become possible for tools to exchange the models together with the layout of the diagrams. We think that, once this specification appears, XMI will be used averywhere. Not only will the tools be able to exchange diagrams, but could even represent them internaly as DOM trees. Have you ever considered drawing your UML diagrams online, using only a web browser? This could be done even now by using a custom SVG syntax for the DOM tree, but a solution based on XMI could do even better and be a standard at the same time.
Therefore, we believe that with the advent of UML 2.0 and the increase in the use of SVG, the need for transformations between XMI and SVG will be great. Nevertheless when the uml2svg project was started, there was hardly any good open-source solution to convert XMI diagams into SVG.
The UML 2.0 Diagram Interchange Adopted Specification in its current incipient form references a set of XSL transformations. Although the standard draft covers them to a large extent, the link is actually broken (you can try for yourself). It has been broken for more than a year and most likely it will stay like that forever.
The personal webpage of Professor Mario Jeckle provides an online transformation service capable of dynamically generating SVG from XMI-compliant XML files. The XSL files accomplishing the transformations are also available on that website. These transformations are monolithic and not well documented (the only documentation is in the code, and it is generally written in German). With the tragic accident that took the life of Professor Jeckle, the transformations have no longer been maintained.
Finally, the STZ-IDA research center in Karlsruhe had to convert UML diagrams to SVG, as part of one of their projects. The XSLT stylesheet they created for this purpose was named xmi2svg and is available under the terms of the MIT license. At the time we started work on uml2svg the only type of diagrams supported was class diagrams.
Recently the package reached version 0.2 and it supports more diagram types, without major changes in the code (the opposite of what we were expecting). Andreas Junghans, the author of xmi2svg, provided us with a lot of insightful hints which helped us eliminate many glitches in uml2svg. It looks that the development of uml2svg and xmi2svg will continue in parallel, at least for a while. The good thing about this is that the two (quite different) implementations prove each others validity and the features tend to propagate freely from one side to the other. However, this comes with the prize of having to maintain two different code-trees and possibly confusing some users.
We did not like the two existing solutions because they were:
incomplete - just prototypes, not well suited for production environment
monolithic - hard to maintain and extend
not documented - hard to understand
At first sight, we thought we could find a way to improve one of the existing solutions and just add the features we needed. However, we slowly came to the conclusion that it would be better if we started anew. There are things one can fix in a project, but that does not include what we thought is was bad design. The fact that the two implementations presented above are open source helped us get quickly on the way with our own project.
Enhancements:
- Two annoying bugs were fixed.
- The site and documentation were updated.
<<lessWe started the developing uml2svg with six main goals in mind:
- Standard conformance
- Good Documentation
- Modularity
- Extensibility
- Comprehensible SVG
- Multiple diagrams per XMI-file
SVG is a standard language for describing two-dimensional vector graphics in XML. As the open SVG standard gains in popularity and gradually replaces proprietary formats for vectorial graphics, the support provided by the Web browsers is getting better.
Plugins to display SVG exist for most browsers and it is most likely that the next generation of Web browser will provide built-in support for SVG. When that happens there will be no better way to distribute vector graphics on the web. Furthermore, not only web browsers can process SVG in a meaningful way; in fact that is just the tip of the iceberg. SVG can be easily read in, processed, and then transformed into many other formats, being well suited for both text and graphic tools as well as for web agents and screen readers.
UML diagrams are composed of lines, polygons, ellipses and text labels, so they are inherently vectorial. However, the SVG is not very well suited for direct use by UML tools. While some of them can in fact export UML diagrams directly to SVG, they do that by discarding all the information about structure, and converting everything into a shape. Moreover, some tools use the screen-capture function provided by their environment (such as java2d) and then they apply a filter to generate SVG out of the "screenshot".
What comes out of that is a pile of meaningless information, which by accident happens to draw a gorgeous diagram. How will a screen reader interpret such a file? How will a web crawler be able to index it? How will a web agent process it in a meaningful way? A program needs the semantic information that the humans can extract just by looking at a picture. For a machine, an obfuscated SVG file is not easier to process than a PNG file or any other image.
Although for humans it is better to be able to scale the image, for a program this is irrelevant. Programs need a way to "understand" the semantics of the UML models to be able to process and interchange them in a meaningfull way. This was the main idea behind the XML Metadata Interchange (XMI), an OMG specification for model interchange. And probably the best use that XMI has found so far is the exchange of UML models between different modeling tools. And while the XMI provides a standard way for tools to represent models as XML documents, it is still limited to the model elements only.
With the introduction of the UML 2.0 Diagram Interchange Specification as part of the upcoming UML 2.0 standard, it will become possible for tools to exchange the models together with the layout of the diagrams. We think that, once this specification appears, XMI will be used averywhere. Not only will the tools be able to exchange diagrams, but could even represent them internaly as DOM trees. Have you ever considered drawing your UML diagrams online, using only a web browser? This could be done even now by using a custom SVG syntax for the DOM tree, but a solution based on XMI could do even better and be a standard at the same time.
Therefore, we believe that with the advent of UML 2.0 and the increase in the use of SVG, the need for transformations between XMI and SVG will be great. Nevertheless when the uml2svg project was started, there was hardly any good open-source solution to convert XMI diagams into SVG.
The UML 2.0 Diagram Interchange Adopted Specification in its current incipient form references a set of XSL transformations. Although the standard draft covers them to a large extent, the link is actually broken (you can try for yourself). It has been broken for more than a year and most likely it will stay like that forever.
The personal webpage of Professor Mario Jeckle provides an online transformation service capable of dynamically generating SVG from XMI-compliant XML files. The XSL files accomplishing the transformations are also available on that website. These transformations are monolithic and not well documented (the only documentation is in the code, and it is generally written in German). With the tragic accident that took the life of Professor Jeckle, the transformations have no longer been maintained.
Finally, the STZ-IDA research center in Karlsruhe had to convert UML diagrams to SVG, as part of one of their projects. The XSLT stylesheet they created for this purpose was named xmi2svg and is available under the terms of the MIT license. At the time we started work on uml2svg the only type of diagrams supported was class diagrams.
Recently the package reached version 0.2 and it supports more diagram types, without major changes in the code (the opposite of what we were expecting). Andreas Junghans, the author of xmi2svg, provided us with a lot of insightful hints which helped us eliminate many glitches in uml2svg. It looks that the development of uml2svg and xmi2svg will continue in parallel, at least for a while. The good thing about this is that the two (quite different) implementations prove each others validity and the features tend to propagate freely from one side to the other. However, this comes with the prize of having to maintain two different code-trees and possibly confusing some users.
We did not like the two existing solutions because they were:
incomplete - just prototypes, not well suited for production environment
monolithic - hard to maintain and extend
not documented - hard to understand
At first sight, we thought we could find a way to improve one of the existing solutions and just add the features we needed. However, we slowly came to the conclusion that it would be better if we started anew. There are things one can fix in a project, but that does not include what we thought is was bad design. The fact that the two implementations presented above are open source helped us get quickly on the way with our own project.
Enhancements:
- Two annoying bugs were fixed.
- The site and documentation were updated.
Download (MB)
Added: 2007-02-18 License: LGPL (GNU Lesser General Public License) Price:
981 downloads
mailto.php 1.4.1
mailto.php reclaims HTML mailto: links from spammers e-mail address harvesters. more>>
mailto.php reclaims HTML mailto: links from spammers e-mail address harvesters. Using JavaScript, it creates a link to an e-mail address while keeping the actual address obfuscated.
mailto.php turns this:
< a href="mailto:user@host.com">user@host.com< /a>
into
< script language="JavaScript"
type="text/javascript">eval(unescape(%76%61%72%20%61%64%64%72%20%3
d%20%27%25%36%61%25%36%66%25%36%34%25%37%32%25%36%35%25%36%63%25%36%63%25%34%30%
25%37%33%25%37%30%25%36%66%25%36%34%25%32%65%25%37%35%25%36%62%25%32%65%25%36%65
%25%36%35%25%37%34%27%3b%76%61%72%20%73%74%72%69%6e%67%20%3d%20%27%25%36%61%25%3
6%66%25%36%34%25%37%32%25%36%35%25%36%63%25%36%63%25%34%30%25%37%33%25%37%30%25%
36%66%25%36%34%25%32%65%25%37%35%25%36%62%25%32%65%25%36%65%25%36%35%25%37%34%27
%3b%64%6f%63%75%6d%65%6e%74%2e%77%72%69%74%65%28%27%3c%61%20%20%68%72%65%66%3d%2
2%6d%61%69%6c%74%6f%3a%27%20%2b%20%75%6e%65%73%63%61%70%65%28%61%64%64%72%29%20%
2b%20%27%22%3e%27%20%2b%20%75%6e%65%73%63%61%70%65%28%73%74%72%69%6e%67%29%20%2b
%20%27%3c%2f%61%3e%27%29%3b));< /script>
Which is pretty hard for e-mail gathering programs to decode.
mailto.php has been tested in all major browsers, including Mozilla, NS4, IE, Opera and Konqueror.
<<lessmailto.php turns this:
< a href="mailto:user@host.com">user@host.com< /a>
into
< script language="JavaScript"
type="text/javascript">eval(unescape(%76%61%72%20%61%64%64%72%20%3
d%20%27%25%36%61%25%36%66%25%36%34%25%37%32%25%36%35%25%36%63%25%36%63%25%34%30%
25%37%33%25%37%30%25%36%66%25%36%34%25%32%65%25%37%35%25%36%62%25%32%65%25%36%65
%25%36%35%25%37%34%27%3b%76%61%72%20%73%74%72%69%6e%67%20%3d%20%27%25%36%61%25%3
6%66%25%36%34%25%37%32%25%36%35%25%36%63%25%36%63%25%34%30%25%37%33%25%37%30%25%
36%66%25%36%34%25%32%65%25%37%35%25%36%62%25%32%65%25%36%65%25%36%35%25%37%34%27
%3b%64%6f%63%75%6d%65%6e%74%2e%77%72%69%74%65%28%27%3c%61%20%20%68%72%65%66%3d%2
2%6d%61%69%6c%74%6f%3a%27%20%2b%20%75%6e%65%73%63%61%70%65%28%61%64%64%72%29%20%
2b%20%27%22%3e%27%20%2b%20%75%6e%65%73%63%61%70%65%28%73%74%72%69%6e%67%29%20%2b
%20%27%3c%2f%61%3e%27%29%3b));< /script>
Which is pretty hard for e-mail gathering programs to decode.
mailto.php has been tested in all major browsers, including Mozilla, NS4, IE, Opera and Konqueror.
Download (0.010MB)
Added: 2005-09-28 License: GPL (GNU General Public License) Price:
1493 downloads
Text::Convert::ToImage
Text::Convert::ToImage is a Perl module. more>>
Text::Convert::ToImage is a Perl module.
SYNOPSIS
use Text::Convert::ToImage;
my $tti = Text::Convert::ToImage->new();
my $length = length($email);
if ($length > 150) {
$email = "Your text length of $length is too large:";
}
my $config = {
TEXT => $email ? $email : "y@hn.org",
POINTSIZE => $point_size ? $point_size : 14,
LEVEL => $level ? $level : 0,
FONT => $font,
XSKEW => $xskew,
YSKEW => $yskew,
};
$tti->calculate($config);
print "Content-type: image/pngnn";
binmode STDOUT;
$tti->Write(png:-);
This was knocked up a long time ago and someone asked me if the source was available so I decided to put it on CPAN. There is very little documentation with it.
There are also very few tests. If more than me and the person who asked for the module use it then I will write some tests for it.
At the moment I have been using it top obfuscate emails and not much else. A demo can be found at http://www.hjackson.org/cgi-bin/tools/email.pl
There are some undocumented features to this module and they are this way because I have not tested to see if they work yet.
<<lessSYNOPSIS
use Text::Convert::ToImage;
my $tti = Text::Convert::ToImage->new();
my $length = length($email);
if ($length > 150) {
$email = "Your text length of $length is too large:";
}
my $config = {
TEXT => $email ? $email : "y@hn.org",
POINTSIZE => $point_size ? $point_size : 14,
LEVEL => $level ? $level : 0,
FONT => $font,
XSKEW => $xskew,
YSKEW => $yskew,
};
$tti->calculate($config);
print "Content-type: image/pngnn";
binmode STDOUT;
$tti->Write(png:-);
This was knocked up a long time ago and someone asked me if the source was available so I decided to put it on CPAN. There is very little documentation with it.
There are also very few tests. If more than me and the person who asked for the module use it then I will write some tests for it.
At the moment I have been using it top obfuscate emails and not much else. A demo can be found at http://www.hjackson.org/cgi-bin/tools/email.pl
There are some undocumented features to this module and they are this way because I have not tested to see if they work yet.
Download (0.011MB)
Added: 2006-08-22 License: Perl Artistic License Price:
1158 downloads
Secleted [ 0 ] software to compare
- Page: 1 of 2
- 1
- 2
Copyright Notice:
Software piracy is theft, Using crack, password, serial numbers, registration codes, key generators is illegal and prevent future software development. The above obfuscate search only lists software in full, demo and trial versions for free download. Download links are directly from our mirror sites or publisher sites, torrent files or links from rapidshare.com, yousendit.com or megaupload.com are not allowed