-
1
混淆器
retro
Guard
的介绍:
本节介绍如何使
用
retroGuard
来进行字节混淆来防止反编译和反向工
程。
1.1
关于
RetroGuard
Retr
oGuard
是一个字节级的混淆器,
一个替换可以识别的变量
和属性为无意义的字
符串的工具,这使得反向工程和反编译无法正常工作。编译后的代码
容量会减小。
RetroGuar
d
是一个免费的软件,使用
GNU Lesser
General Public License.
特性包括:
1
,
降低<
/p>
java
代码的
容量,
< br>(最大
可以节省将
近
50%
p>
,一般情况下
可以节省
20%-30%
p>
)
,这样对于你的
applets
程序,可以大大加速了下载时间。
2
,
设计合
理,可以与
java
工程的自动化编译过程无缝兼容。
3
,
允许全部用户定义的混淆过程。
4
,
支持多
种对
java
代码的切入点——可以访问应用程序,
applets,javaBeans
和类
库接口
。
5
,
使用
jar
这个标准的
java
打包方案。
6
,
混淆过程可以被灵活的脚本语言来控制。
7
,
提供了一个图形化的向导程序来管理脚本文件。
8
,
通过对方法和文件名的大量过载来取得高安全性
9
,
生成的
代码有效,符合
java
虚拟机规范。
10
,
自动
更新清单文件,使用混淆后的类名,并且自动生成
MD5
和
p>
SHA-1
的消息摘要
(
automatically generated MD5
and SHA-1 message digests
)
1.2
关于混淆
(obfuscation)
java
字节代码
(
class
p>
文件)
包含了所有的信息,
部分源文件中注
释。
使用
decompiler
工具可
以很轻易的取得源码。
为了对抗这种行为,
我们需要再部署软件
时混淆你的类文
件。
混淆过程剔除了
所有不需要的信息,包括行号表,本地变量名和源文件名。同时,
类,接口,字段和方法
标示被重新命名。运行这些代码的
Java
虚拟机,并不在意这
些
变化。然而,这种版本的
classes
文件反编译之后,难以理解的。
决定哪个类需要被混淆,
大多数混淆器提供一个单一的切入点
(通常是一个应用程
序的
main
方法,或则是
< br>applet
)
,
并且从这个切
入点引出一个类树出来。不幸的是,该
方法是非常有限的仅仅适用于小的
cases
当中的,
如果
ja
va
代码包含了多个切入点,
这
个方法
就不是很灵活的。
相反的,
Retr
oGuard
混淆类和接口是在
jar
文件内进行的。所有的切入点可以通过
描述文件类定义的。
(
Corruption of
class
技术
,
< br>不太理解,
主要的意思是这样处理过的代码会挑虚拟
机的
,只在部分机器上可以运行的)
使用多种技术方案来混淆字节
代码,他完全可以使市场上一些简易的编译器失效。
由于以上原因,
RetroGuard
混淆器只产生通过验证的字节代码,完全兼容
Java
虚
p>
拟机规范。与
Corrupting the bytecode<
/p>
不同,
RetroGuard
使用标示符
得过载技术。
1.3
安装使用
RetroGuard
p>
的安装很简单,只需要将
包放到
CLASSPA
TH
路径下就
可以了。
命令行格式为
:
java
RetroGuard [INPUT-JAR [OUTPUT-JAR [SCRIPT
[LOGFILE]]]]
例如:
java
RetroGuard
1.4
混淆过程的控制
脚本文件可以控制
RetroGuard
的混淆过
程
,
脚本文件可以定义那种标示符不被改
变。
脚本文件可以通过手写的方式,也可以使用图形化工具
来生成的:
java RGgui
如果一个应用程序的入口程序是
,
那么在脚本文件中可以这样写:
.class
MyApp
public method
如果
需要访问到一个
applet
程序
,
那么在脚本文件中可以这样写:
.class
MyApp
,这样将保留类的文件名不被混淆
如
果需要访问一个
JavaBean
类,
,
那么在脚本文件中可以这样写:
.class
MyBean
protected,
这样将保留类
名,
pulic
方法,保护方法和可以访问的
< br>方法和字段。
脚本文件的例子:
# All
text in a line following '#' is treated as a
comment, and
is ignored.
# Preserve the class name
'MyClass' in package 'co'
#
(note that the package identifiers 'COM' and
'widgetco' are
#
automatically preserved also, so that 'MyClass'
remains fully
#
accessible):
.class
COM/widgetco/MyClass
# Preserve the class name 'MyClass' and
all public methods and
#
fields declared in it:
.class COM/widgetco/MyClass
public
#
Preserve the class name 'MyClass' and all public,
protected or
# default-
access (package) methods and fields declared in
it:
.class
COM/widgetco/MyClass protected
# Preserve the class name
'MyClass' and all public, protected or
# default-access (package) methods (but
not fields) declared in it:
.class COM/widgetco/MyClass protected
method
#
Preserve the class name 'MyClass' and all public
and protected
# (but not
default-access, package) methods and fields
declared in
it:
.class COM/widgetco/MyClass
pub_prot_only
#
Preserve all classes and their public fields in
the package
#
'co':
# (Reference to all
classes in a package is the only situation
# where wildcards are
allowed)
.class
COM/widgetco/* public field
# Preserve the 'SourceFile' debugging
attribute of all classes:
.attribute SourceFile
#
Preserve
the
method
'double
getValue(Object
obj)'
in
class
'MyClass':
.method COM/widgetco/MyClass/getValue
(Ljava/lang/Object;)D
# Preserve the field 'char aCharacter'
in class 'MyClass':
.field
COM/widgetco/MyClass/aCharacter C
1.5
对非
class
类文件的处理
这些资源
文件包括了图形,音频文件,本地化代码,
jar
包文件包含了
一个清单文
件和一些数字签名的文件。
RetroGuard<
/p>
可以处理上面所有文件(打在
jar
中的
)
一般来说,我们访问资源文件的方法是:
1
.
使用相
对路径和
java
的类方法
InputStream getResourceAsStream(String
relativePath)
URL
getResource(String relativePath)
2
.
使用绝
对路径和
ClassLoader
的方法
InputStream
getResourceAsStream(String absolutePath)
URL
getResource(String absolutePath)
我们提倡大家采用相对路径的方式来访问资源。
签名:首先用
RetroGuard
将源包混淆后,在进行签名的。
1.6
创建补丁文件
RetroGuard(1.1
版本以后
)
支持增量混淆,这样可以大大降低了程序的下载量。
使用方法
:
java RGpatch WHOLE-JAR
PATCH-JAR LOGFILE LISTFILE
举例:
初始版本:
java
RetroGuard
(
其中,
内容为
.class JTool public
method)
该
公
司
可
以
将
< br>
发
布
,
提
供
给
客
户<
/p>
下
载
,
日
志
文
件
包含了混淆映射关系,
这个
log
< br>文件对于软件和补丁是非常重要
的。
几周后,客户发现了新的问题,修复这个问题需要类和资源的
改变。我们就
可以创建一个小的补丁包来完成程序的更新。
第一次编译和打包的
jar
包是
.
java
RetroGuard
注意到
:
这次使用的是
文件,
而不是
.
这样生
成
1.1
版本包是与
1.0
版本包完全兼容的。
剩下的工作就
是将变化的类和资源从
包中提取出来。
首先需要建立一个
文本表示变化类的名
字
COM/widgetco/
COM/widgetco/
Java
Rgpatch
jre -cp
JTool
they
could
now
take
advantage
of
the
bug-fix
by
using
the
patch file:
jre -cp jtool-patch-1.0-1.1;
JTool
2
混淆器
j
doc
的介绍:
jdoc
混淆编译器是在
Sun
p>
JDK
中提供的
Java
< br>编译器
(javac)
的基础上完成的,修改了代
码生成过程,对编译器生成的中间代码进行混淆,最后再生成
clas
s
文件,这样编译和混淆
只需要一个步骤就可以完成。
另外可以在源程序中插入符号保留指令来控制哪些符号需要保
留,不需要
单独的配置。
2.1
Xobfuscate
命令参数说明
运行
java -jar
就可以启动
Java
混淆编译器,
joc
的命令行参数和
javac
完全相同,
但增加了一个新的参数
-Xobfuscate
,它的用法如下:
-Xobfuscate:
其中指定混淆级别,可以是以下几种级别:
-Xobfuscate:none
不进行混淆
-Xobfuscate:private
对所有
private
访问级别的元素进行混淆
-Xobfuscate:package
对所有
private
或
package
private
元素进行混淆
-Xobfuscate:protected
对所有
private, package private,
protected
元素进行混淆
-Xobfuscate:public
对所有的元素都进行混淆
-Xobfuscate:all
相当于
-Xobfuscate:public
如果使用
-Xobfuscate
不带级别参数,则相当于
-Xobfuscate:package
2.2
符号保留指令
A:
除了在命令行用
-Xobfus
cate
参数控制符号混淆级别外,还可以在源代码中使用符号
保留指令来控制那些符号需要保留,符号保留指令是一个
Java
文档注释指令,可以插
入在类和类成员的文档注释中,例如:
/**
* This class should
preserve.
* @preserve
*/
public class Foo {
/**
* Y
ou can specify which
field should be preserved.
* @preserve
*/
private int x;
/**
* This field is not preserved.
*/
private int y;
/**
* Y
ou can also preserve
methods.
* @preserve
*/
public void hello() {}
/**
* This
method is not preserved.
*/
private void collect() {}
}
如果没有
@preserve
指令,则
根据混淆级别及成员的访问级别来确定符号是否保留。
对于类的符号保留指令可以附带一个保留级别参数,来控制类
成员的符号保留,包括:
@preserve
仅对类名进行保留,类成员的保留根据
-Xobfuscate
命令行参数决定
@preserve
public
保留所有
public
成员
@preserve protected
保留所有
public
和
protected
成员
@preserve package
保留所有
public, protected,
package private
成员
@preserve private
保留所有成员
@preserve
all
相当于
@preserve private
3
p>
混淆器
JODE
的介绍:
< br>
3.1
安装使用:
将
类包放入
clas
spath
路径下,立即可以使用了。
命令行格式:
java ator
.Main
中代表的是一个配置文件。
3.2
混淆过程的控制
上面参数中的
可以完成对混淆过程的控制。
下面主要分析
jos
文件的内容
1,
首先需要设置类路径
# The class path should include
everything that is needed to run the
#
project. Don't
forget
the
java
base
classes
(
or
).
classpath =
2,
生成的文件名称
# The jar, zip file or directory in
which the obfuscated class files
#
should be written.
dest =
3,
定义一个翻译表单
#
Write
the
reverse
translation
table
to
. With
the help
of
#
this table you can later undo the renaming.
revtable =
4
,定义需要除掉的内容
Unreach
不能进入的方法和类
Source java
文件名
(异常信息会不可读)
Lnt
行号表
(异常信息会不可读)
Lvt
本地变量表
(调试不能正常工作)
Inner
内部类信息
(映射不能正常工作)
strip =
-
-
-
-
-
-
-
-
-
上一篇:电影复仇者联盟2剧本中英文对照完全版
下一篇:高尔夫球术语