java为什么容易反编译 Java中Jar包为什么能轻易就给反编译了
大家好,今天来为大家分享java为什么容易反编译的一些知识点,和Java中Jar包为什么能轻易就给反编译了的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
反编译什么意思
问题一:反编译是什么意思啊用到什么知识把软件转成源代码
java的反编译很容易
c的话反编出来也基本看不懂
问题二:"反编译"是什么意思?高级语言源程序经过编译变成可执行文件,反编译就是逆过程。
但是通常不能把可执行文件变成高级语言源代码,只能转换成汇编程序。
问题三:反编译是什么意思高级语言源程序经过编译变成可执行文件,反编译就是逆过程。但是通常不能把可执行文件变成高级语言源代码,只能转换成汇编程序。反编译是一个复杂的过程,所以越是高级语言,就越难于反编译,但目前还是有许许多多的反编译软件:通过对他人软件的目标程序(可执行程序)进行“逆向分析、研究”工作,以推导出他人的软件产品所使用的思路、原理、结构、算法、处理过程、运行方法等设计要素,作为自己开顶软件时的参考,或者直接用于自己的软件产品中。所以现在大家写的东西就想办法保护,不被侵权!
大体看你的理解是正确的。
问题四:反编译什么意思,具体该怎么用?反编译做的就是编译的相反动作。举例来说,例如一个程序用C语言来写,写完之后要编译成CPU可以识别和运行的机器代码,也就是生成EXE程序。而反编译是反过来,把EXE反编译成编程源代码,也就是C程序,不过一般反编译大多数都是从机器码反编译为汇编。其他语言的情况基本也是这样的。至于具体要怎么用,这个就看你的目的了。但一般情况下是通过反编译主要是用于没有源码的程序的分析,例如破解别人的软件等。
问题五:java反编译到底是什么?你理解的反编译没有问题,应该是你的插件或操作的问题。
你用 JD-GUI软件试试看
问题六:java反编译是什么意识编译=源代码.java变成字节码.class
反编译=字节码.class变成源代码.java
=====================顶==========================
去书店看免费书。SCJP的书是一定要看的。因为他太基础了。
不要指望一次看懂。
学到哪里就认真的看到哪里!
问题七:反编译的一句,帮看看什么意思工具/原料
电脑必须装JAVA
JAVA电脑环境教程
apktool
方法/步骤
1.配置好JAVA环境变量,下载:apktool解压的文件放在C盘根目录的apktool文件夹里(apktool文件夹自己创立)
打开命令提示符,(开始-运行-输入cmd)
2.输入:cd\apktool系统指令到了apktool文件夹(这里就是为什么要把解压的apktool解压的文件放到apktool文件夹的原因,当然你也可以自命名文件夹的名称,那么比如arc,那么指令就变成了:cd\arc前提是你必须把apktool解压的文件放到这个文件夹里面)
3.使用RE管理器把系统里面的framework-res.apk与 SystemUI.apk提取出来放在apktool文件夹里面
4.如果只是想反编译framework-res.apk
输入apktool if framework-res.apk(框架的建立)
5.开始最重要的反编译,输入指令,apktool d framework-res.apk
(反编辑的APK一定要用没换过图片的,否则回编辑失败)
6.最后反编译完成
7.修改代码完成后,输入代码:apktool d framework-res即可完成回编译
8.如果反编译的是系统文件,比如,SystemUI.apk那么必须进行挂载框架,反编译时,必须敲入一下命令:(然后再重复4-7步骤)
apktool if framework-res.apk
apktool if SystemUI.apk
9.对于三星手机(比如9100、9108/9100G),如果反编译SystemUI.apk要敲入一下命令进行框架挂载apktool if framework-res.apk
apktool if twframework-res.apk
apktool if SystemUI.apk
10.回编译的命令是 apktool b XXX(没有后面的apk后缀)反编译的命令是 apktool d xxx(有后面的apk)
问题八:Java反编译工具有什么作用?就是把编译好的JAVA CLASS文件再还原成JAVA代码!
问题九:什么是反编译工具?反编译工具有什么用?简单来说,就是把一个已有的程序转化为编程的命令行。至于使用反编译的原因么……有的是为了研究一个程序以达到吸取别人的编程思路和经验。当然也有的是为了盗版。或者是为了窃取别人的软件。
Java中Jar包为什么能轻易就给反编译了
java中jar包轻易的被反编译是由于java的特性决定的。java中的jar包的实质内容是java源代码编译后的.class文件,由于java的面向对象特性和java的反射技术,可以很容易的通过对.class文件进行反射来得到java的源代码,也就是反编译!对于java的反编译,并不是所有内容都会反编译出来,java源文件中的注释、泛型等内容在经过编译和反编译之后会丢失。
防止JAVA代码被反编译的方法
我们都知道JAVA是一种解析型语言这就决定JAVA文件编译后不是机器码而是一个字节码文件也就是CLASS文件而这样的文件是存在规律的经过反编译工具是可以还原回来的例如Decafe FrontEnd YingJAD和Jode等等软件下面是《Nokia中Short数组转换算法》
类中Main函数的ByteCode
ldc#
invokestatic#
astore_
return
其源代码是 short [] pixels= parseImage(/ef s png);
我们通过反编译工具是可以还原出以上源代码的而通过简单的分析我们也能自己写出源代码的
JAVA手机网[]第一行 ldc#
ldc为虚拟机的指令作用是压入常量池的项形式如下
ldc index
这个index就是上面的也就是在常量池中的有效索引当我们去看常量池的时候我们就会找到index为的值为String_info里面存了/ef s png
所以这行的意思就是把/ef s pn作为一个String存在常量池中其有效索引为
第二行 invokestatic#
invokestatic为虚拟机指令作用是调用类(static)方法形式如下
invokestatic indexbyte indexbyte
其中indexbyte和indexbyte必须是在常量池中的有效索引而是指向的类型必须有Methodref标记对类名方法名和方法的描述符的引用
所以当我们看常量池中索引为的地方我们就会得到以下信息
Class Name: cp_info#
Name Type: cp_info#
和都是常量池中的有效索引值就是右边<>中的值再往下跟踪我就不多说了有兴趣的朋友可以去JAVA虚拟机规范
这里我简单介绍一下parseImage(Ljava/lang/String;)[S的意思
JAVA手机网[]这就是parseImage这个函数的运行我们反过来看看parseImage的原型就明白了
short [] parseImage(String)
那么Ljava/lang/String;就是说需要传入一个String对象而为什么前面要有一个L呢这是JAVA虚拟机用来表示这是一个Object如果是基本类型这里就不需要有L了然后返回为short的一维数组也就是对应的[S是不是很有意思 S对应着Short类型而 [对应一维数组那有些朋友要问了两维呢那就 [[呵呵是不是很有意思
好了调用了函数返回的值要保存下来吧那么就是第三行要做的事情了
第三行 astore_
呵呵很简单的但是却有文章也是比较容易混乱的地方
astore_为虚拟机指令作用为将当前reference存储到局部变量中去而必须是对当前框架的局部变量的有效索引打个比方可能我们这个函数中可能还要用到这个局部变量我们可以通过来找到它例如调用虚拟机指令
aload_就能得到该值
第四行 return
同样的 return也是虚拟机指令了它的作用为从方法返回void
这里也就是退出main函数
ok终于啰嗦完毕了有些朋友可能要问这么复杂才四行就说这么多呵呵可能是我这人废话过多当然如果你熟悉了一点就能看懂了通过肉眼就可以反编译程序了目前所有的反编译工具都无法做到完美反编译在有问题的地方还需要人去修正
好了说了半天如何反编译我们就来看看如果在你的程序如果防止别人来反编译好不容易写好的程序被人反编译了多郁闷哈哈工欲善其事必先利其器这句话用对了吗?
什么混淆等等的方法我就不说了我这里主要是要说一种通过添加代码来在某种程度来避免当前流行的反编译工具对你的代码进行反编译
方案一
首先要添加一个参数为Exception类型的函数例如这样
public static void Fake(Exception e)
{
JAVA手机网[] e toString();
}
一定要有e toString();因为要防止你的混淆器把无用的代码过滤
然后在每个类中调用这个函数放在try catch(Exception e)中的catch里面例如
try
JAVA手机网[]{
}
catch(Exception e)
{
Fake(e);
}
请注意一定要放在catch才有用其他地方无用
方案二
如果以上方法还不够专业我们再来一个呵呵~
同样的我们定义一个类这个类叫做AntiCrack名字好像有点大代码如下
public class AntiCrack
{
private AntiCrack()
{
}
public static Throwable Fake(Throwable throwable Throwable throwable)
{
try
{
throwable getClass() getMethod( initCause new Class[]{
JAVA手机网[] java lang Throwable class
}) invoke(throwable new Object[]{
throwable
});
}
catch(Exception exception){}
return throwable;
}
}
同样的我们在catch里面调用该函数例如如下
try
{
//your code here
}
catch(IOException ioexception)
{
IllegalArgumentException illegalargumentexception= new IllegalArgumentException(ioexception toString());
AntiCrack fake(illegalargumentexception ioexception);
throw illegalargumentexception;
}
或者也可以这样
public class AntiException extends Exception
{
public AntiException()
{
}
public AntiException(String s)
{
super(s);
}
public AntiException(String s Throwable throwable)
{
super(s);
AntiCrack fake(this throwable);
}
}
JAVA手机网[]然后在你的程序里面
try
{
}
catch(IoException e)
{
throw new AntiException(ioexception toString() ioexception);
}
当采用以上方式后任何类只要调用了该函数生成的class反编译后出错得不到结果
Decafe FrontEnd和YingJAD反编译时都有exception然后无法进行下去大家可以多测试变得反编译工具建议推荐用第二个方法
lishixinzhi/Article/program/Java/hx/201311/25765.net,java都能被反编译 那么易语言为什么不能反编译
因为.NET也好 JAVA也罢,为了跨平台,并没有直接将源代码编译成机器码(因为在不同硬件设备上的指令集是不同的),而是翻译成了一个中间语言。
.NET翻译过的中间语言叫 IL,然后通过 JIT来“解释”执行。而 Java的中间语言叫 Bytecode,通过 JVM来“解释”执行。
既然 JIT、JVM是可以“看懂”中间语言,并在不同平台上“解释”成对应的机器语言来执行,那么中间语言就一定是可逆成高级语言的了。
而易语言这种东西是直接编译成机器码的了。不是不能反编译,而是只能反编译成汇编这种低级语言了。
java为什么容易反编译的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于Java中Jar包为什么能轻易就给反编译了、java为什么容易反编译的信息别忘了在本站进行查找哦。