导航:首页 > 源码编译 > 自定义加载器被反编译

自定义加载器被反编译

发布时间:2023-03-01 07:43:25

1. classloader的原理 有哪些类加载器 为什么要用自定义类加载器

原理之类的,你自己上网看资料吧,不是一两句话说得清的。

至于为什么用自定义类加载器,个人总结了一下可能有下面几点吧,可能不全,也请大家补充:

  1. 加密:众所周知,java代码很容易被反编译,如果你需要把自己的代码进行加密,可以先将编译后的代码用某种加密算法加密,然后实现自己的类加载器,负责将这段加密后的代码还原。

  2. 从非标准的来源加载代码:例如你的部分字节码是放在数据库中甚至是网络上的,就可以自己写个类加载器,从指定的来源加载类。

  3. 动态创建:为了性能等等可能的理由,根据实际情况动态创建代码并执行。

  4. 其他(这个理由非常给力吧^_^)

2. 反编译java核心类 能不能反编译java核心类,比如java.lang.String,再编写自己的代码放到里面去

我估计你是想重编译String.class文件并覆盖吧,这个目前行不通,据说像HotSpot这种商业JVM内部都存有一张关于核心类库的装载信息表专供根加载器使用,这个表内容是以通过硬写在JVM底层C\C++程序中的方式存在的,在装载核心类库的.Jar文件时不仅要比对其中.class文件的有效性,还要比较.Jar文件的SHA1哈希值与装载信息表中的记录是否一致!(或许哈希弱无碰撞算法出现时会有希望,呵呵)同时JVM会运行各种安全沙箱机制(比如装载约束、访问权限等等)来保护运行环境的安全性,所以除非重编译JVM否则目前没有什么好方法。

3. 如何防止程序员反编译

Java从诞生以来,其基因就是开放精神,也正因此,其可以得到广泛爱好者的支持和奉献,最终很快发展壮大,以至于有今天之风光!但随着java的应用领域越来越广,特别是一些功能要发布到终端用户手中(如android开发的app),有时候,公司为了商业技术的保密考虑,不希望这里面的一些核心代码能够被人破解(破解之后,甚至可以被简单改改就发布出去,说严重点,就可能会扰乱公司的正常软件的市场行为),这时候就要求这些java代码不能够被反编译。

这里要先说一下反编译的现象。因为java一直秉持着开放共享的理念,所以大家也都知道,我们一般共享一个自己写的jar包时,同时会共享一个对应的source包。但这些依然与反编译没有什么关系,但java的共享理念,不只是建议我们这样做,而且它自己也在底层上“强迫”我们这么做!在java写的.java文件后,使用javac编译成class文件,在编译的过程,不像C/C++或C#那样编译时进行加密或混淆,它是直接对其进行符号化、标记化的编译处理,于是,也产生了一个逆向工程的问题:可以根据class文件反向解析成原来的java文件!这就是反编译的由来。

但很多时候,有些公司出于如上述的原因考虑时,真的不希望自己写的代码被别人反编译,尤其是那些收费的app或桌面软件(甚至还有一些j2ee的wen项目)!这时候,防止反编译就成了必然!但前面也说过了,因为开放理念的原因,class是可以被反编译的,那现在有这样的需求之后,有哪些方式可以做到防止反编译呢?经过研究java源代码并进行了一些技术实现(结果发现,以前都有人想到过,所以在对应章节的时候,我会贴出一些写得比较细的文章,而我就简单阐述一下,也算偷个懒吧),我总共整理出以下这几种方式:

代码混淆

这种方式的做法正如其名,是把代码打乱,并掺入一些随机或特殊的字符,让代码的可读性大大降低,“曲线救国”似的达到所谓的加密。其实,其本质就是打乱代码的顺序、将各类符号(如类名、方法名、属性名)进行随机或乱命名,使其无意义,让人读代码时很累,进而让人乍一看,以为这些代码是加过密的!

由其实现方式上可知,其实现原理只是扰乱正常的代码可读性,并不是真正的加密,如果一个人的耐心很好,依然可以理出整个程序在做什么,更何况,一个应用中,其核心代码才是人们想去了解的,所以大大缩小了代码阅读的范围!

当然,这种方式的存在,而且还比较流行,其原因在于,基本能防范一些技术人员进行反编译(比如说我,让我破解一个混淆的代码,我宁愿自己重写一个了)!而且其实现较为简单,对项目的代码又无开发上的侵入性。目前业界也有较多这类工具,有商用的,也有免费的,目前比较流行的免费的是:proguard(我现象临时用的就是这个)。

上面说了,这种方式其实并不是真正加密代码,其实代码还是能够被人反编译(有人可能说,使用proguard中的optimize选项,可以从字节流层面更改代码,甚至可以让JD这些反编译软件可以无法得到内容。说得有点道理,但有两个问题:1、使用optimize对JDK及环境要求较高,容易造成混淆后的代码无法正常运行;2、这种方式其实还是混淆,JD反编译有点问题,可以有更强悍的工具,矛盾哲学在哪儿都是存在的^_^)。那如何能做到我的class代码无法被人反编译呢?那就需要我们下面的“加密class”!

加密class

在说加密class之前,我们要先了解一些java的基本概念,如:ClassLoader。做java的人已经或者以后会知道,java程序的运行,是类中的逻辑在JVM中运行,而类又是怎么加载到JVM中的呢(JVM内幕之类的,不在本文中阐述,所以点到为止)?答案是:ClassLoader。JVM在启动时是如何初始化整个环境的,有哪些ClassLoader及作用是什么,大家可以自己问度娘,也不在本文中讨论。

让我们从最常见的代码开始,揭开一下ClassLoader的一点点面纱!看下面的代码:

Java代码

4. flash xml 音乐播放器 反编译

去试试开源的ruochi.com,也许能满足你的需求。直接调用,JS调用,都可以,并且相关参数也比较全面,画面也可以通过相关参数关掉你不想要的界面属性。最重要的是开源,能下载相关的FLA文件。可以自由编辑,不过像你这种情况,不用源文件已经完全能满足了。

5. 如何防止Unity3D代码被反编译

加密原理(无需Unity源码):
1. IDA Pro打开libmono.so, 修改mono_image_open_from_data_with_name为
mono_image_open_from_data_with_name_0,
2. 替换实现mono_image_open_from_data_with_name,
extern mono_image_open_from_data_with_name_0(...);
mono_image_open_from_data_with_name(...) {
MonoImage *img = mono_image_open_from_data_with_name_0(...);
//发现数据文件头不是DLL前缀则解密 img->raw_data, 相应修改img->raw_data_len
return img;
}
3. 重新打包libmono.so; 替换Unity3D中的android下的版本.
4. 另外写个加密的工具,植入构建环境(MonoDeveloper或VS,添加一个打包后Build Phase来加密DLL); (IOS下禁用JIT固采用AOT编译,DLL中没有逻辑代码,所以无需操心);
从AndroidManifest.xml中可以看出,腾讯的改造应该是修改并替换了入口的classes.dex,把以前的入口 UnityPlayerProxyActivity替换为com.tencent.tauth.AuthActivity. 然后去加载了自定义的几个so: libNativeRQD.so. 周全考虑,为了防止第三方委托libmono去做解密而做了防护措施. 具体实现我还没做深入分析, 应该也是老套路.
libmono.so中的mono_image_open_from_data_with_name也被替换成了mono_image_open_from_data_with_name_0.
解密(android):
方法一: ROOT android系统(最好是一部手机,别搞模拟器,慢死), 挂载LD_PRELOAD的API hook来实现.
方法二: 内存特征码提取,简单高效无敌; 机器能读,你就能读;

6. 防止Class类反编译的方法,对Class进行加密

这个我之前也研究过,现在与你分享一下吧。希望对你有帮助:

首先在介绍反编译器之前,要提及JDK自带的一个工具 [javap] ,它是一个Java代码反汇编器。

然后其次是有一个sourceforge中开源的一个反编译器 Jode(http://jode.sourceforge.net/download.html) 下载。

反编译对安全构成的威胁是显而易见的,因此源码保护也就必不可少的。其实,反编译和代码保护是一场无停止斗争,双方都在争斗中得以发展。

那么到目前为止,保护源码大致可以分为三类: 加密、模糊、和定制JAVA类装载器。现在依我看来,流行的工具有 PGP(Pretty Good Privacy) 和 GPG(Gnu Pirvacy Guard)等等(有些名字忘记了!呵呵!)

我先讲讲模糊技术吧,Obfuscator就是对源代码进行模糊化处理的行为。但是经过模糊处理后的代码,将失去了一些可读 性,程序员很难识别代码的用意。利用模糊处理的工具是 Smokescreen(http://www.leesw.com/smokescreen/licensedownload.html).....

至于类加载器,你只需要看看ClassLoader的原理就行了。具体代码实现的太多了,打字打的累!!!!

我先说这么多了,如果还有什么不明白的可以加我MSN与我讨论:[email protected]
即可!

阅读全文

与自定义加载器被反编译相关的资料

热点内容
幽冥诡匠漫画全集用什么app可以看 浏览:1001
租用服务器为什么越来越慢 浏览:960
算法创新就业方向 浏览:423
算法最优解作者 浏览:867
通达信红绿宝塔线指标源码 浏览:666
app是什么东西合法吗 浏览:231
怎么锁app视频教程 浏览:841
迅捷pdf注册码生成器 浏览:748
androidsdkosx 浏览:302
压缩面膜纸荧光 浏览:841
app怎么分身三个 浏览:744
电影bt下载源码 浏览:421
iwatch屏幕加密芯片 浏览:570
公安主题网站源码 浏览:986
天津市服务器供应商云服务器 浏览:115
数控车床子程序编程 浏览:111
floydwarshall算法 浏览:717
丢失微信app怎么找 浏览:252
php能写前端吗 浏览:9
服务器如何更改raid模式 浏览:92