Adding a Watermarker
Adding a new watermarking algorithm is similar to adding an
obfuscator. Algorithms are loaded dynamically at run-time, so
there is no need to explcitly link them into the system.
To create a new watermarking algorithm wm
you
- create a new directory
sandmark.watermark.wm
,
- create a new class
sandmark.watermark.wm.WM
which extends sandmark.watermark.StaticWatermarker
or sandmark.watermark.DynamicWatermarker
.
- Create a file
sandmark/watermark/wm/doc/help.html
documenting your work.
Static Watermarking
To build a new static watermarker you just have to
implement two methods, one to embed the watermark
into a jarfile and the other to extract it.
package sandmark.watermark.mywatermarker;
public class MyWatermarker extends sandmark.watermark.StaticWatermarker {
public ConstantString() {}
public String getShortName() {
return "MyWatermarker";
}
public String getLongName() {
return "Embed a watermark somewhere in the program";
}
public String getAuthor(){
return "Jane Doe";
}
public String getAuthorEmail(){
return "doe@cs.arizona.edu";
}
public String getDescription(){
return "Embed a watermark...";
}
/*
* Get the HTML codes of the About page for ConstantString
*/
public java.lang.String getAlgHTML(){
return "...";
}
/*
* Get the URL of the Help page for ConstantString
*/
public java.lang.String getAlgURL(){
return "sandmark/watermark/mywatermarker/doc/help.html";
}
/*************************************************************************/
/* Embedding */
/*************************************************************************/
public void embed(sandmark.watermark.StaticEmbedParameters params)
throws sandmark.watermark.WatermarkingException {
// The actual code goes here!
}
/*************************************************************************/
/* Recognition */
/*************************************************************************/
class Recognizer implements java.util.Iterator {
public Recognizer(sandmark.watermark.StaticRecognizeParameters params) {
...
}
public boolean hasNext() {
...
}
public java.lang.Object next() {
...
}
public void remove() {}
}
public java.util.Iterator recognize(sandmark.watermark.StaticRecognizeParameters params)
throws sandmark.watermark.WatermarkingException {
return new Recognizer(params);
}
}
- Use
BCEL
to implement your watermarker.
Have a look at the trivial static watermarker
sandmark.watermark.constantstring.ConstantString
for an example.
- Type
make
at the top-level sandmark directory (smark
).
The new watermarker should be loaded automagically at runtime.
Dynamic Watermarking
Implementing a dynamic watermarker is more complex,
since you have to provide methods for running the
application during tracing and recognition:
package sandmark.watermark.mywatermarker;
public class MyWatermarker extends sandmark.watermark.DynamicWatermarker{
private sandmark.watermark.DynamicRecognizeParameters mRecognizeParams;
private sandmark.watermark.DynamicTraceParameters mTraceParams;
/**
* Returns this watermarker's short name.
*/
public String getShortName(){
return "...";
}
/**
* Returns this watermarker's long name.
*/
public String getLongName() {
return "...";
}
public String getAuthor(){
return "Jane Doe";
}
public String getAuthorEmail(){
return "doe@cs.arizona.edu";
}
public String getDescription(){
return "....";
}
public sandmark.config.ModificationProperty[] getMutations()
{
return null;
}
public java.lang.String getAlgHTML(){
return "...";
}
/*
* Get the URL of the Help page for DynamicAA
*/
public java.lang.String getAlgURL(){
return "...";
}
/***********************************************************************/
/* Tracing */
/***********************************************************************/
public void startTracing(sandmark.watermark.DynamicTraceParameters params)
throws sandmark.util.exec.TracingException {
...
}
public void endTracing()
...
}
public void stopTracing() throws sandmark.util.exec.TracingException {
tracer.STOP();
}
/***********************************************************************/
/* Embedding */
/***********************************************************************/
public void embed(sandmark.watermark.DynamicEmbedParameters params) {
...
}
/***********************************************************************/
/* Recognition */
/***********************************************************************/
public void startRecognition (sandmark.watermark.DynamicRecognizeParameters params)
...
}
public java.util.Iterator watermarks() {
...
}
public void stopRecognition() throws sandmark.util.exec.TracingException {
...
}
public void waitForProgramExit() {
...
}
}