Android程序反破解技术

0x1

对抗反编译可以大概分为以下几点:

1、对抗反编译工具,例如apktool、dex2jar等

2、对抗静态编译,分为代码混淆技术、NDK保护、apk加壳保护。

3、对抗动态调试,分为检测调试器、检测模拟器。

4、防止重编译,分为检查签名,校验保护。

更多相关内容请参考《Android软件安全与逆向分析》。

0x02

对抗反编译工具,例如dex2jar,通常是在分析dex2jar源码后,来找到漏洞,在java源码中加入会触发dex2jar异常的代码,从而使dex2jar不能正常使用。

dex2jar测试版本是0.0.7.8,源码地址https://github.com/jltxgcy/AntiCrack/tree/master/Antidex2jar。这个工程是通过在java源码中加入下面函数导致dex2jar不能正常使用的。

    private int position(int idx) { // bits big-endian in each unit
        return 1 << (BITS_PER_UNIT - 1 - (idx % BITS_PER_UNIT));
    }

0x03

对抗静态编译

1、代码混淆技术请参考Android 混淆机制

2、NDK保护,就是把原来在java层实现的逻辑,挪到C/C++层去实现,因为C/C++层代码反编译后生成的arm汇编,更加难以分析。

3、apk加壳保护,请参考Android中的Apk的加固(加壳)原理解析和实现

0x04

对抗动态调试

1、检测调试器,我们已经在Android native反调试方式及使用IDA绕过反调试一文中,详细说明了有几种方式可以用来反调试器。

另外在这里面介绍一个java层的反调试器,https://github.com/jltxgcy/AntiCrack/tree/master/Antidebug/src/com/droider/antidebug

2、检测模拟器,当我们的程序运行在模拟器中,我们可以推测出我们的程序正在被动态分析,这时我们可以使我们的程序退出。工程地址:https://github.com/jltxgcy/AntiCrack/tree/master/CheckQemu

检测模拟器的方法有很多,参考Android安全–检测是否为Android模拟器

0x05

防止重编译。

1、检测签名

在java层检测签名,工程地址如下:https://github.com/jltxgcy/AntiCrack/tree/master/CheckSignature。核心的代码是:

public int getSignature(String packageName) {
		PackageManager pm = this.getPackageManager();
		PackageInfo pi = null;
		int sig = 0;
		try {
			pi = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
			Signature[] s = pi.signatures;
			sig = s[0].hashCode();
		} catch (Exception e1) {
			sig = 0;
			e1.printStackTrace();
		}
		return sig;
    }

获取签名后,然后和正确的签名信息对比,如果对比成功,说明签名信息没有被更改。

2、校验保护

重编译Android软件的实质是重新编译classes.dex文件,代码经过重新编译后,生成的classes.dex文件的Hash值已经改变。

工程地址:https://github.com/jltxgcy/AntiCrack/tree/master/CheckCRC

核心代码如下:

private boolean checkCRC() {
    	boolean beModified = false;
    	long crc = Long.parseLong(getString(R.string.crc));
    	ZipFile zf;
		try {
			zf = new ZipFile(getApplicationContext().getPackageCodePath());
	    	ZipEntry ze = zf.getEntry("classes.dex");
	    	Log.d("com.droider.checkcrc", String.valueOf(ze.getCrc()));
	    	if (ze.getCrc() == crc) {
	    		beModified = true;
	    	}
		} catch (IOException e) {
			e.printStackTrace();
			beModified = false;
		}
		return beModified;
    }   
时间: 2024-10-01 04:48:25

Android程序反破解技术的相关文章

Android中的软件安全和逆向分析[二]—apk反破解技术与安全保护机制

在Android应用开发中,当我们开发完软件之后,我们不希望别人能够反编译破解我们的应用程序,不能修改我们的代码逻辑.实际上,在应用程序的安全机制考虑中,我们希望自己的应用程序安全性高,通过各种加密操作等来增大竞争对手的反编译破解成本.设想,竞争对手开发一个同样的应用程序需要10天,而破解我们的软件程序需要100天,那么势必会打消黑客程序员破解我们应用程序的念头.如何增加对手的破解成本,就需要考验我们应用程序的安全性有多高,加密技术有多强.一个优秀的应用程序,不仅能为用户带来利益,同时也能保护自

分析Android程序之破解第一个程序

破解Android程序通常的方法是将apk文件利用ApkTool反编译,生成Smali格式的反汇编代码,然后阅读Smali文件的代码来理解程序的运行机制,找到程序的突破口进行修改,最后使用ApkTool重新编译生成apk文件并签名,最后运行测试,如此循环,直至程序被成功破解. 1. 反编译APK文件 ApkTool是跨平台的工具,可以在windows平台与linux平台下直接使用.使用前到:http://code.google.com/p/android-apktool/  下载ApkTool,

如何分析Android程序之破解第一个程序

破解Android程序通常的方法是将apk文件利用ApkTool反编译,生成Smali格式的反汇编代码,然后阅读Smali文件的代码来理解程序的运行机制,找到程序的突破口进行修改,最后使用ApkTool重新编译生成apk文件并签名,最后运行测试,如此循环,直至程序被成功破解. 1. 反编译APK文件 ApkTool是跨平台的工具,可以在windows平台与linux平台下直接使用.使用前到:http://code.google.com/p/android-apktool/  下载ApkTool,

android防反编译技术初体验——混淆

这几天做项目要做混淆,所以搜集资料学习了下,这次主要记录混淆的步骤,如有需要改正和完善的地方,还麻烦能够指出,大家共同进步o(* ̄▽ ̄*)ブ 1.项目防反编译技术步骤: a) 加密. b) 混淆. c) 加壳(加固); 2.加密:对信息进行摘要计算,然后摘要值用私钥进行验签,重要数据使用rsa非对称加密: 3.混淆:Android Studio开发工具自身集成了Java语言的ProGuard技术,对java代码有压缩.优化.混淆.预检的功能,AcFlash项目的Android端使用了ProGua

Android 程序的反破解技术

Android软件的逆向步骤: 1.反编译->静态分析(阅读反汇编代码,如果必要还需进行动态调试,找到突破口注入或直接修改反汇编代码)->动态调试->重新编译. 对抗反编译工具: 1.针对开源的反编译工具,找到处理apk文件的关键环节,如资源文件处理.dex文件校验.dex文件代码类解析等. 2.压力测试:收集大量apk文件,在反编译的出错信息中,查找反编译工具的缺陷. 腾讯应用加固检测点: 1.DEX文件保护检测 DEX文件是Android系统中在Dalvik虚拟机上可以直接运行的文件

分享 如何做到基于NDK的Android应用防破解!

 Android程序防破解是发布app时一个很需要考虑的问题,通常的做法是对代码加入混淆干扰以增加破解难度.但即便如此,混淆操作之后的java代码仍然可以被通过各种方法进行破解.在基于NDK的Android中含有相应的main.cpp来作为应用程序的入口,因而在这里进行一些防破解较验,相应的破解难度就会增大不少(相对于java代码). 在Android整个导出过程中,生成.dex阶段是整个打包发布操作的基础,包括相应的java源代码.外部库文件均会被编译链接到.dex文件中,而其中关于代码的任何

【转】Android 防破解技术简介

http://www.cnblogs.com/likeandroid/p/4888808.html Android 防破解技术简介 这几年随着互联网的不断发展,Android App 也越来越多!但是随之而来的问题也越来越多,这其中比较令人头疼的问题就是:有些不法分子利用反编译技术破解 App,修改代码,之后再重新编译上传到应用商店!到时候,如果用户下载了这些应用,就可能造成个人信息或者金钱的丢失!所以,作为开发者的我们,有必要学习一些防止被破解的技术手段了! 简介 现在想要破解一个 App,

android apk 防止反编译技术第一篇-加壳技术

做android framework方面的工作将近三年的时间了,现在公司让做一下android apk安全方面的研究,于是最近就在网上找大量的资料来学习.现在将最近学习成果做一下整理总结.学习的这些成果我会做成一个系列慢慢写出来与大家分享,共同进步.这篇主要讲apk的加壳技术,废话不多说了直接进入正题. 一.加壳技术原理 所谓apk的加壳技术和pc exe的加壳原理一样,就是在程序的外面再包裹上另外一段代码,保护里面的代码不被非法修改或反编译,在程序运行的时候优先取得程序的控制权做一些我们自己想

android apk 防止反编译技术第二篇-运行时修改字节码

上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止apk反编译的技术-运行时修改字节码.这种方法是在工作中在实现app wrapping时,看到国外的一篇关于android 安全的介绍实现的并且独创.下面我们来介绍一下这种方法. 我们知道apk生成后所有的java生成的class文件都被dx命令整合成了一个classes.dex文件,当apk运行时d