各种对抗反编译的手段

正是因为反编译这么简单,如果不加保护,我们的劳动成果就会被轻易盗取。

市面上比较常用的反编译工具有:dex2jar,jd-gui,apktool,IDA等等。

这里我简单的说一下dex2jar这个常用反编译工具的使用。

在下载到了dex2jar和jd-gui这两个工具之后。

1.将要反编译的APK后缀名改为.rar或 .zip,并解压

-------------------------------------------------------------

2.得到其中的classes.dex文件(它就是java文件编译再通过dx工具打包而成的),将获取到的classes.dex放到之前解压出来的工具dex2jar-0.0.9.15 文件夹内

-------------------------------------------------------------

3.在命令行下定位到dex2jar.bat所在目录,输入dex2jar.bat   classes.dex。

效果如下:

在该目录下会生成一个classes_dex2jar.jar的文件,然后打开工具jd-gui文件夹里的jd-gui.exe,之后用该工具打开之前生成的classes_dex2jar.jar文件,便可以看到源码了,效果如下:

被混淆过的效果图(类文件名称以及里面的方法名称都会以a,b,c....之类的样式命名):

没有经过处理或者只是简单的混淆过的APP其代码的反编译的比较容易的。你的代码经过上面那三步已经暴露出来了。

在下面提供的更多的途径来给各位学习反编译。

更多反编译的教程:
-------------------------------------------------------------
[size=21.3333339691162px]

apktool反编译工具使用教程:

http://www.apkbus.com/forum.php?mod=viewthread&tid=60541&highlight=反编译

-------------------------------------------------------------

反编译与防止反编译:

http://www.apkbus.com/forum.php?mod=viewthread&tid=183482&highlight=%E5%8F%8D%E7%BC%96%E8%AF%91

-------------------------------------------------------------

黑马Android视频教程——119_应用程序的反编译:

http://www.apkbus.com/forum.php?mod=viewthread&tid=130649&highlight=%E5%8F%8D%E7%BC%96%E8%AF%91



怎样防止应用被破解?

在知道了这么容易就可以破解我苦心经营的APP时,我的心是崩溃的。这个时候我要听专家的,我还认真的记录了下来,看看专家怎么说。

从上图我们可以看到,现在的防止反编译的手段已经发展到了资本主义了。

下面一一列举了各种对抗反编译的手段,希望对大家有所帮助。

(一)基础手段--混淆代码

代码混淆技术基本原理是使反编译工具反编译出来的代码人难以阅读,从而达到防止被逆向破解的目的。简单的理解就是把原来的类名、方法名、字段名、参数名、变量名等,用无意义的字符序列来替换。变成类似abc这样的无命名规则的字符,增加阅读难度。

步骤:

-------------------------------------------------------------

1.找到或者创建一个proguard-project.txt文件

-------------------------------------------------------------

2.在proguard-project.txt添加混淆的申明

a) 申明外包jar包(申明的外面jar不会被混淆)

例如:-libraryjars libs/abc.jar

b) 将你不需要混淆的部分申明进来(因为有些类经过混淆会导致程序编译不通过)

如系统组件和API的类:

-keep public class * extends android.app.Fragment

-keep public class * extends android.app.Activity

-keep public class * extends android.app.Application

-keep public class * extends android.app.Service

-keep public class * extends android.content.BroadcastReceiver

-keep public class * extends android.content.ContentProvider

-keep public class * extends android.app.backup.BackupAgentHelper

-keep public class * extends android.preference.Preference

-keep public class * extends android.support.v4.**

c) -dontwarn 缺省proguard
会检查每一个引用是否正确,但是第三方库里面往往有些不会用到的类,没有正确引用。如果不配置的话,系统就会报错。

例如:-dontwarn android.support.**

d) -keepclassmembers 指定的类成员被保留。

-keepclassmembers class * extends android.app.Activity {
public void
*(android.view.View);
}

e) -keepclasseswithmembers 指定的类和类成员被保留,假如指定的类成员存在的话。

例如:

-keepclasseswithmembers class * {
public
<init>(android.content.Context, android.util.AttributeSet);
}

-------------------------------------------------------------

3.以上工作完成,混淆工作就完成了一大半了,最后需要做的就是在project.properties文件中加上你的混淆文件申明了,如下:

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

-------------------------------------------------------------

4.最后一步,打签名包测试

(二)签名自校验

简单的理解,签名就是标明一个APP是不是官方正版发行的标记。发现一个APP跟你的一样却无法覆盖安装,就是签名不一致的缘故。也可以理解为你的APP已经被破解并重新打包了。

那么如何获取到APK文件的公钥信息呢?因为Android系统安装程序肯定会获取APK信息进行比对,所以我们可以通过Android源码获得一些思路和帮助。
 
 
源码中有一个隐藏的类用于APK包的解析。这个类叫PackageParser,路径为frameworks\base\core\java\android\content\pm\PackageParser.java。当我们需要获取APK包的相关信息时,可以直接使用这个类,下面代码就是一个例子函数:

代码:

private PackageInfo parsePackage(String archiveFilePath, int flags){

PackageParser packageParser = new PackageParser(archiveFilePath);

DisplayMetrics metrics = new DisplayMetrics();

metrics.setToDefaults();

final File sourceFile = new File(archiveFilePath);

PackageParser.Package pkg = packageParser.parsePackage(

sourceFile, archiveFilePath, metrics, 0);

if (pkg == null) {

return null;

}

packageParser.collectCertificates(pkg, 0); 

return PackageParser.generatePackageInfo(pkg, null, flags, 0, 0);

}

其中参数archiveFilePath指定APK文件路径;flags需设置PackageManager.GET_SIGNATURES位,以保证返回证书签名信息。
 
  具体如何通过PackageParser获取签名信息在此处不做详述,具体代码请参考PackageParser中的public boolean
collectCertificates(Package pkg, int flags)和private Certificate[]
loadCertificates(JarFile jarFile, JarEntry je, byte[]
readBuffer)方法。至于如何在Android应用开发中使用隐藏的类及方法,可以参看我的这篇文章: 《Android应用开发中如何使用隐藏API》

    紧接着,我们就可以通过packageInfo.signatures来访问到APK的签名信息。还需要说明的是
Android中Signature和Java中Certificate的对应关系。它们的关系如下面代码所示:

代码:

pkg.mSignatures = new Signature[certs.length];

for (int i=0; i<N; i++) {

pkg.mSignatures = new Signature(

certs.getEncoded());

}

也就是说signature = new Signature(certificate.getEncoded()); certificate证书中包含了公钥和证书的其他基本信息。公钥不同,证书肯定互不相同。我们可以通过certificate的getPublicKey方法获取公钥信息。所以比对签名证书本质上就是比对公钥信息。
 
  OK,获取到APK签名证书之后,就剩下比对了。这个简单,功能函数如下所示:

代码:

private boolean IsSignaturesSame(Signature[] s1, Signature[] s2) {

if (s1 == null) {

return false;

}

if (s2 == null) {

return false;

}

HashSet<Signature> set1 = new HashSet<Signature>();

for (Signature sig : s1) {

set1.add(sig);

}

HashSet<Signature> set2 = new HashSet<Signature>();

for (Signature sig : s2) {

set2.add(sig);

}

// Make sure s2 contains all signatures in s1.

if (set1.equals(set2)) {

return true;

}

return false;

}

在程序运行时,自我进行签名比对。比对样本可以存放在APK包内,也可存放于云端。缺点是程序被破解时,自检测功能同样可能遭到破坏,使其失效。



(三)源程序使用C层编写

将核心代码使用C/C++编写然后编译成为.so文件,这种方式的代码保护性是比Java代码提升了不少。使用工具反编译之后的是汇编语言,不过对于熟悉汇编语言的高手来说破解也是很可能的。

对于如何编译成so文件大家可以参考下面的文档:

http://www.apkbus.com/forum.php?mod=viewthread&tid=240211&highlight=NDK%E7%BC%96%E8%AF%91

在了解了比较常用的技术之后我们来看看专家推荐的比较高新的对抗技术有哪些



(四)DEX文件隐藏(加壳技术

壳技术原理

所谓apk的加壳技术和pc
exe的加壳原理一样,就是在程序的外面再包裹上另外一段代码,保护里面的代码不被非法修改或反编译,在程序运行的时候优先取得程序的控制权做一些我们自己想做的工作。

加壳作用:

加壳的程序可以有效阻止对程序的反汇编分析,以达到它不可告人的目的。这种技术也常用来保护软件版权,防止被软件破解。

大家可以参考下面的文章:

http://www.apkbus.com/forum.php?mod=viewthread&tid=240207&extra=

http://www.apkbus.com/forum.php?mod=viewthread&tid=240662&highlight=so


(五)利用反编译工具漏洞


一、对抗JD-GUI原理

通常在对apk进行反编译的时候用到的最多的两个工具就是apk-tool和dex2jar。利用这两个工具将apk首先反编译成classes.dex然后再将classes.dex反编译成jar文件或者将apk直接反编译成jar文件;得到jar文件以后就可以利用JD-GUI将得到的jar文件打开就可以直接查看apk的java源码了。我们花了那么大心思写的程序就这么容易被别人拿到源码是不是很不甘心,现在我就告诉你对抗JD-GUI查看源码的方法。我们在用JD-GUI查看源码时有时有些函数的根本看不到直接提示error错误,我们就利用这点来保护我们的apk。原来JD-GUI在将经过混淆处理的jar里面的class字节码文件转成java文件时,遇到函数中根本走不到的分支的特殊实现时就会提示函数error。这时我们只要查看这些提示error的文件或者函数对应的源码是有什么语句引起的,将这些语句加到我们的源码中就可以防止利用JD-GUI去查看我们的apk源码了。

二、原理实现

(1)假如我们的apk onCreate的函数实现如下:

<font style="color:rgb(51, 51,
51)"
><font face="微软雅黑"><font
style=
"font-size:16px">[url=home.php?mod=space&uid=389554]@Override[/url]   

protected void onCreate(Bundle
savedInstanceState) {

super .onCreate(savedInstanceState);

setContentView(R.layout.activity_main);
}</font></font></font>

(2)将我们的apk经过混淆处理后经过签名导出我们的apk,我们用dex2jar工具将我们的apk转换成jar文件

(3)用JD-GUI打开我们的jar文件就可以看到我们的apk onCreate函数的源码了。如下:

(4)这时我们在apk onCreate函数里面加上不可能的特殊分支语句,代码如下:

<font style="color:rgb(51, 51, 51)"><font face="微软雅黑"><font style="font-size:16px">@Override

protected void onCreate(Bundle savedInstanceState) {

super .onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

switch ( )

{

case :

JSONObject jsoObj;

String date= null ;

String second= null ;

try {

jsoObj= new JSONObject();

date=jsoObj.getString( "date" );

second=jsoObj.getString( "second" );

}

catch (JSONException e)

{ e.printStackTrace(); } test.settime(date,second);

break ;

}
 

class test

{

public static void settime(String a,String b){}

}

(5)我们用(2)中同样的方法将apk转成jar文件,然后用JD-GUI打开会看到提示error错误。如下:

根据上面的讲述相信大家对对抗JD-GUI的方法有了一定的了解,我只是举了其中的一个方法,之所以说是特殊的分支语句是因为不是所有的分支语句都可以让JD-GUI提示error。

(六)运行时修改Dalvik指令

我们知道apk生成后所有的java生成的class文件都被dx命令整合成了一个classes.dex文件,当apk运行时dalvik虚拟机加载classes.dex文件并且用dexopt命令进行进一步的优化成odex文件。我们的方法就是在这个过程中修改dalvik指令来达到我们的目的。

大家可以参考下面的文章:

http://www.apkbus.com/forum.php?mod=viewthread&tid=240208&extra=



快捷的APK反逆向解决方案

在了解上面这么多的反逆向方法之后,我们要保护自己的APP要付出的时间和技术成本看起来还是很高的,这时候如果有一些产品或者工具可以帮我们完成这些工作。那么这方面的成本就低很多了,而目前市面上的确有不少这样的服务。

360加固宝

http://jiagu.360.cn/protect/welcome/

阿里聚安全

http://jaq.alibaba.com/

爱加密

网址百度收

梆梆加固

http://www.bangcle.com/

百度云加固

http://apkprotect.baidu.com/

腾讯云加固

http://jiagu.qcloud.com/

时间: 2024-11-07 02:25:08

各种对抗反编译的手段的相关文章

【Android应用保护技术探索之路系列】之二:对抗反编译

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell 对于Android应用盈利模式而言,一般都是免费发布应用,然后通过广告来赚钱,应用本身没有任何授权访问机制来进行保护,对于任何一个想要逆向分析该应用的人都可以在网上直接下载,也就是说我们无法通过发布渠道来保证应用的安全性,那么我们只能从保护应用代码入手了. 对抗反编译就是指AP

Android apk反编译基础(apktoos)图文教程

本文主要介绍了Android apk反编译基础,使用的工具是apktoos,我们将用图文的方式说明apktoos工具的使用方式,你可以参考这个方法反编译其它APK试试看了 很久有写过一个广工图书馆主页一个类爬虫的demo(因为没接口,只能扒取静态网页),实现一些图书馆系统的一些功能.但最近发现图书馆系统在html页面上做了手脚,一页html页面中嵌入了几千行的注释,并有了自己的App,应该是为了增加扒取的流量成本来防止别人去扒取网页,不过加注释这手段就不敢恭维了,内网访问速度还行,但外网访问的话

android apk 防止反编译技术第四篇-对抗JD-GUI

又到周末一个人侘在家里无事可干,这就是程序员的悲哀啊.好了我们利用周末的时间继续介绍android apk防止反编译技术的另一种方法.前三篇我们讲了加壳技术(http://my.oschina.net/u/2323218/blog/393372).运行时修改字节码(http://my.oschina.net/u/2323218/blog/396203)和伪加密(http://my.oschina.net/u/2323218/blog/399326),如果有不明白的可以查看我的博客的前三篇中关于这

android防止反编译系列:如何对抗JD-GUI

又到周末一个人侘在家里无事可干,这就是程序员的悲哀啊.好了我们利用周末的时间继续介绍android apk防止反编译技术的另一种方法.前三篇我们讲了加壳技术(http://my.oschina.net/u/2323218/blog/393372).运行时修改字节码(http://my.oschina.net/u/2323218/blog/396203)和伪加密(http://my.oschina.net/u/2323218/blog/399326),如果有不明白的可以查看我的博客的前三篇中关于这

AutoHotKey程序防止反编译的简单手段

可以使用AutoHotKey自带的工具. AutoHotKey安装完成后(我使用的是1.1.0.0),找到安装所在目录下的文件:\Compiler\Ahk2Exe.exe. 程序界面如下: 简单使用: 1.选择源文件(script file) 2.选择目标文件(.exe file).不选择时,默认在源文件目录下生成同名的exe文件. 3.选择程序图标.不选择时,将是默认的autohotkey图标. [关键]4.输入密码及验证密码(Passphrase/ Verify passphrase).这步

介绍一点.NET反编译的知识

反编译是我们理解.NET内部实现的一种良好的手段. 程序编译时 Test.exe是IL代码.我们可以通过一些工具,来查看这些IL代码. 一模一样? 理论上来说,一模一样的反编译是不存在的.原因有以下3点: 1. 注释不通过编译程序,自然木有注释. 2. .NET编译器会做一些优化,例如 int i= 5+6 : 编译时直接表述成 i=11了.无用变量直接过滤. (i=5+6这种方式写代码不是没有必要的,有些时候,例如文件操作中定义文件大小,我们经常为了可读性,写成(7*1024*1024*...

安卓程序防止反编译的方式

1. 加壳 apk的加壳:在程序外面再包裹一层代码,保护里面的代码不被非法修改或者反编译. 被保护的程序用加密算法加密,解密逻辑写在作为壳的APK中,实际执行的是被保护的程序. 大多是通过DexClassLoader或者隐藏的函数openDexFile将源dex(即被保护的app)加载进来,然后动态替换Application来启动源程序.跟Windows上传统的PE文件加壳有一定区别. 要破解传统的壳,需要跟踪控制流找到OEP,然后把源程序从内存中dump下来,重建输入表,最困难的就是要跟着外壳

Android 反编译初探 应用是如何被注入广告的

本文由我的微信公众号:鸿洋(hongyangAndroid)原创首发. 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/53370414: 本文出自:[张鸿洋的博客] 一.概述 最近和朋友聊天,发现一些灰色产业链通过批量反编译市场上的apk,然后进行注入广告,再重新打包上渠道. 我想大家都不希望自己家的产品或者自己的app那么容易被"占据",但是想要自身能够防御,首先要知道对方的手段.所以本篇博客的目的不是教大家如何

[C#防止反编译].NET 产品版权保护方案 (.NET源码加密保护)

[C#防止反编译].NET 产品版权保护方案 (.NET源码加密保护) 标签: .net加密产品c#dll工具 2011-03-24 21:06 27009人阅读 评论(13) 收藏 举报 分类: C#/.NET(4)  Decompile(6) 说 明:你希望自己用.net辛辛苦苦做出来的软件被人轻易破解吗?你希望自己花了大量人力物力用.net开发出来的产品被竞争对手轻易获取核心代码吗?这是 一篇比较详尽地介绍如何保护自己的.net源代码的文章,如混淆.加密和强名称等,出于保护原作者的角度,所