如何封锁您的(或打开别人的) Java 代码
内容:
什么是反编译?
反汇编一个类文件
使用反编译器
反编译和对安全的威胁
针锋相对的代码模糊处理
这一领域的新成员
总结
参考资料
关于作者
评价本文
相关内容:
让您的软件运行:模糊安全性
Java 和分布式目标系统上的安全性研究
Java 代码反编译和模糊处理的完全指南
Greg Travis (mito@panix.com)
自由程序员,纽约
无论是修改许多网上开放源代码库中的代码,还是调用常见的操作系统例行程序,您免不了要花一些时间去琢磨您没有编写过的代码,而且您还可能没有这些代码的源文件。在开始调试代码时,您需要有一个好的 Java 反编译器,并了解正确使用它的技术。同时,您还要知道如何保护您自己的代码不被窥视。为此,您还需了解有关代码模糊处理的问题。在这篇有关打开和封锁 Java 代码的初学者指南中, Greg Travis 使用 Mocha、HoseMocha、jmangle 和 JODE 等流行工具中的示例,来循序渐进地教你有关反汇编、反编译和 Java 代码模糊处理的基础知识。
没有比发现一个错误,却没有源代码就不能修改更令人沮丧的了。正是这个原因导致了 Java 反编译器的出现,它可以把编译后的字节码完全转回成源代码。尽管代码反编译器不只是针对 Java 语言,但它从来没有象在 Java 开发人员中那样被公开地或广泛地使用。
与反编译针锋相对的是模糊处理。假设反编译人员能很轻易从编译后的代码中设法得到源代码,那么要保护您的代码和有价值的技术秘密就不是那么简单了。随着 Java 反编译器的普遍使用, Java 模糊处理器也同样被普及,它的作用就似乎放一块烟幕在您的代码前面。反编译和模糊处理在商业开发领域中引起了一场争论 -- 争论中的大部分都集中在了 Java 语言上。
在本文中,我将让您了解代码反编译和模糊处理的具体过程,讨论在这两种技术之后的理论问题,同时简要地谈到它们在商业编程领域中所引起的争论。我还将介绍一些比较有名的反编译器和模糊处理器(有商业的,也有开放源代码的),并随着文章的深入使用它们来创建一些实例。
什么是反编译?
反编译是一个将目标代码转换成源代码的过程。这应该很清楚了,因为编译是一个将源代码转换成目标代码的过程。但什么是目标代码呢?大体上的定义是:目标代码是一种用语言表示的代码,这种语言能通过实机或虚拟机直接执行。对于象 C 这样的语言,目标代码通常运行在硬件
相关文档:
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.logging.Logger; ......
1. byte 如果没有赋值,那么java会自动将它赋值为 (byte)0;
static String ReadLn (int maxLg) // utility function to read from stdin
{
byte lin[] = new byte [maxLg];
int lg = 0, car = -1;
String line = "";
try
{
while (lg < maxLg)
......
Java
中的常量
常量就是程序里持续不变的值,它是不能改变的数据。
Java
中的常量包含整型常量、浮点数常量、布尔常量等,下面来看一下它们是如何表示的:
整型常量
整型常量可以分为十进制
、十六进制
和八进制
。
十进制
:
0 1 2 3 4 5 6 7 8 9
注意
:以十进制表示时,第一位不能是
0
(数字 ......
最近在学习java的时候,对于java函数的传递了解了一下。java的数据类型大的分为两种,一种是基本数据类型,另一种是非基本数据类型,(类数据类型)。在参数传递时候,基本的数据类型传递的是对实参数的一份拷贝,而非基本数据类型则是实例的引用的一份拷贝。我的理解是类的实例,即对象存放的内容就是引用,实际是地址。
......
一:无返回值的存储过程
存储过程为:
create or replace procedure adddept(deptno number,dname varchar2,loc varchar2)
as
begin
insert into dept values(deptno,dname,loc);
end;
然后呢,在java里调用时就用下面的代码:
public class TestProcedure {
Connectio ......