java生成的字节码类文件如何转换为机器码类文件?--有难度,参与有分.

网络科技 2009-08-27 10:45:43
前段时间看了些java的资料,据说可以实现把生成的.class文件转化为机器码的类文件,当然jvm也是可以正常加载的.
出于好奇,google了半天,可没找到相关有用的文献,于是真有点怀疑这能否实现?向高人讨教了....

后话:java为了跨平台应用,生成的字节码类文件是有它的优点的,但这同时也造就了类文件很容易被反编译,使代码更易
受到黑客的攻击,若能生成机器码的类文件,显然安全得多.

附:之前也发了个类似的了,发现这类问题没什么人回答,感到有点失望,听人说,真正的高手都不来论坛的,这话是真的吗?不过,
我还是相信csdn有高人的.不过,关于这方面的内容,感觉确实不大好弄,首先因为本来就没什么人去弄,百度\google资料自然也少了,看看自己的运气如何吧.其实,这个问题实用性应该也不是很强,这样做法似乎违背java的初衷,只是为学习下,满足下好奇心吧.
为了调动大家参与的积极性,来者均有分吧(不懂的帮顶也行,或帮忙向你们技术部经理求助,呵).

还有补充下:不是单单简单的转为为机器码啊,还要让jvm能够识别(即hello.class转化后还是hello.class,内容变了,但功能正常)
...全文
846 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
网络科技 2009-08-27
  • 打赏
  • 举报
回复
哎,好奇心太强累死人啊,又问了个无解的问题,但也好,总算彻底死心了,呵!
好了,免得夜长梦多,速战速决,感谢大家参与,结了!
WTK870424 2009-08-27
  • 打赏
  • 举报
回复
学习了
xqh2168 2009-08-27
  • 打赏
  • 举报
回复
JF
公子骏 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 fiwiner 的回复:]
如果能转成机器码,为什么java程序要在虚拟机上运行,在每个操作系统转成机器码后运行岂不是更高效?
[/Quote]

事实上是这样的,只不过它是在类加载之后编译,本地机器码在内存里而已。
fiwiner 2009-08-27
  • 打赏
  • 举报
回复
如果能转成机器码,为什么java程序要在虚拟机上运行,在每个操作系统转成机器码后运行岂不是更高效?
knightzhuwei 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 mysinglelive 的回复:]
引用 12 楼 knightzhuwei 的回复:
有没有可能它所谓的启动程序就是个exe文件


那不是以前的J++吗
或者用现在的Cygwin上的GUN编译java文件
[/Quote]
额。。。J++...真的是只闻其名。。还有在学校图书馆见过几本发黄的教程。。
公子骏 2009-08-27
  • 打赏
  • 举报
回复
其实JIT就是一边编译一边执行的样子,所以今天的Java能运行很快
feishare 2009-08-27
  • 打赏
  • 举报
回复
估计要看CGLIB怎么封装ASM的
公子骏 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 knightzhuwei 的回复:]
有没有可能它所谓的启动程序就是个exe文件
[/Quote]

那不是以前的J++吗
或者用现在的Cygwin上的GUN编译java文件
网络科技 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xzy88 的回复:]
引用 4 楼 knightzhuwei 的回复:
.class文件转化为机器码 也就是操作系统能直接执行的文件 那就应该是exe后缀 不然操作系统如何执行?
如果.class文件转化为机器码后依然是.class文件 java虚拟机该如何判断它是字节码还是机器码 如何确定用什么方式执行呢?

你说的跟我几乎想到一块去了,但那篇文章确实是说,可以弄成机器码的类文件,以防止被反编译,原文如下:
  我们看到,要在不修改源代码的情况下加密一个Java应用是很容易的。不过,世上没有完全安全的系统。本文的加密方式提供了一定程度的源代码保护,但对某些攻击来说它是脆弱的。
  虽然应用本身经过了加密,但启动程序DecryptStart没有加密。攻击者可以反编译启动程序并修改它,把解密后的类文件保存到磁盘。降低这种风险的办法之一是对启动程序进行高质量的模糊处理。或者,启动程序也可以采用直接编译成机器语言的代码,使得启动程序具有传统执行文件格式的安全性。
  另外还要记住的是,大多数JVM本身并不安全。狡猾的黑客可能会修改JVM,从ClassLoader之外获取解密后的代码并保存到磁盘,从而绕过本文的加密技术。Java没有为此提供真正有效的补救措施。

  不过应该指出的是,所有这些可能的攻击都有一个前提,这就是攻击者可以得到密匙。如果没有密匙,应用的安全性就完全取决于加密算法的安全性。虽然这种保护代码的方法称不上十全十美,但它仍不失为一种保护知识产权和敏感用户数据的有效方案。
......
不知道红色部分是不是我理解的意思呢?不是的话,那是什么意思呢?

[/Quote]
补充:
有点困惑,难道就是说弄成exe文件吗?天啦,如果这样的话,web程序如何调用相关class类了?
可能作者是说se程序吧???
公子骏 2009-08-27
  • 打赏
  • 举报
回复
启动程序也可以采用直接编译成机器语言的代码,使得启动程序具有传统执行文件格式的安全性。



JVM的类装载器有安全沙箱,保证只有可信任代码能执行。
knightzhuwei 2009-08-27
  • 打赏
  • 举报
回复
有没有可能它所谓的启动程序就是个exe文件
网络科技 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 knightzhuwei 的回复:]
.class文件转化为机器码 也就是操作系统能直接执行的文件 那就应该是exe后缀 不然操作系统如何执行?
如果.class文件转化为机器码后依然是.class文件 java虚拟机该如何判断它是字节码还是机器码 如何确定用什么方式执行呢?
[/Quote]
你说的跟我几乎想到一块去了,但那篇文章确实是说,可以弄成机器码的类文件,以防止被反编译,原文如下:
  我们看到,要在不修改源代码的情况下加密一个Java应用是很容易的。不过,世上没有完全安全的系统。本文的加密方式提供了一定程度的源代码保护,但对某些攻击来说它是脆弱的。
  虽然应用本身经过了加密,但启动程序DecryptStart没有加密。攻击者可以反编译启动程序并修改它,把解密后的类文件保存到磁盘。降低这种风险的办法之一是对启动程序进行高质量的模糊处理。或者,启动程序也可以采用直接编译成机器语言的代码,使得启动程序具有传统执行文件格式的安全性。
  另外还要记住的是,大多数JVM本身并不安全。狡猾的黑客可能会修改JVM,从ClassLoader之外获取解密后的代码并保存到磁盘,从而绕过本文的加密技术。Java没有为此提供真正有效的补救措施。

  不过应该指出的是,所有这些可能的攻击都有一个前提,这就是攻击者可以得到密匙。如果没有密匙,应用的安全性就完全取决于加密算法的安全性。虽然这种保护代码的方法称不上十全十美,但它仍不失为一种保护知识产权和敏感用户数据的有效方案。
......
不知道红色部分是不是我理解的意思呢?不是的话,那是什么意思呢?
公子骏 2009-08-27
  • 打赏
  • 举报
回复
http://imgsrc.baidu.com/baike/pic/item/ac75478285acf3b90cf4d213.jpg
chenchengamao 2009-08-27
  • 打赏
  • 举报
回复
学习学习
网络科技 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 diggywang 的回复:]
不知道你说的,是不是“混淆”这个概念,如果是,推荐用用proguard(proguard.sourceforge.net)
[/Quote]
这里不是谈混淆,就算混淆也不大好用,要把整个工程都混淆才行,若只混淆单个的.class文件,好像这个类就失效了.不知道是不是这样?
公子骏 2009-08-27
  • 打赏
  • 举报
回复
能贴些相关代码实现吗?
JVM的机制没怎么研究,不知道你说的"超简易编译器"是那个,具体怎么玩呢?


它一般都是自行优化编译,
JVM的性能优化不光是GC。
网络科技 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mysinglelive 的回复:]
一个是GUN可以可以直接把Java编译成机器码。
一个是JVM内部的优化机制,把经常使用的代码部分直接编译为本地机器码,
JVM其实它自带一个超简易编译器。
[/Quote]
能贴些相关代码实现吗?
JVM的机制没怎么研究,不知道你说的"超简易编译器"是那个,具体怎么玩呢?
公子骏 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 knightzhuwei 的回复:]
.class文件转化为机器码 也就是操作系统能直接执行的文件 那就应该是exe后缀 不然操作系统如何执行?
如果.class文件转化为机器码后依然是.class文件 java虚拟机该如何判断它是字节码还是机器码 如何确定用什么方式执行呢?
[/Quote]

你可以看看JVM的类加载机制
knightzhuwei 2009-08-27
  • 打赏
  • 举报
回复
.class文件转化为机器码 也就是操作系统能直接执行的文件 那就应该是exe后缀 不然操作系统如何执行?
如果.class文件转化为机器码后依然是.class文件 java虚拟机该如何判断它是字节码还是机器码 如何确定用什么方式执行呢?
加载更多回复(3)

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧