Android程序反破解技术

标签: android 程序 破解 | 发表时间:2016-02-04 17:31 | 作者:jltxgcy
出处:http://blog.csdn.net

    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;
    }   

作者:jltxgcy 发表于2016/2/4 9:31:28 原文链接
阅读:0 评论:0 查看评论

相关 [android 程序 破解] 推荐:

Android程序反破解技术

- - CSDN博客推荐文章
    对抗反编译可以大概分为以下几点:.     1、对抗反编译工具,例如apktool、dex2jar等.     2、对抗静态编译,分为代码混淆技术、NDK保护、apk加壳保护.     3、对抗动态调试,分为检测调试器、检测模拟器.     4、防止重编译,分为检查签名,校验保护.     更多相关内容请参考《Android软件安全与逆向分析》.

Android 应用程序

- - CSDN博客推荐文章
Android 应用程序由四个模块构造而成:Activity、Intent 、Content Provider 、Service. 下面简单介绍一下如下模块的含义:. 1、Activity  "活动". 一个Activity就是单独的屏幕,每一个活动都被实现为一个独立的类,并且从活动基类中继承而来,活动类将会显示由视图控件组成的用户接口并对事件作出响应.

Android调试程序技巧

- - ITeye博客
在开发的过程中我们经常需要调试程序的执行路径,如我们想知道一个Activity的生命周期方法的调用顺序,我们可能会写如下代码. 这样每次都要输入两个参数,有没有更简便的方法呢. 我们可以通过Thread.currentThread().getStackTrace()获取当前堆栈调用信息,从堆栈信息中可以获取当前调用的java文件名,类名,方法名和代码行号.

Android 程序框架设计

- - 互联网的那点事
每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心. 通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作. 设计模式是在某种特别的情况下,针对某种问题的某种典型、通用的解决方法. 我们是需要适当了解并学习一些设计模式,在程序开发过程中,总是会涉及到一些框架设计,模块设计之类的东西,如果能很好理解并运行设计模式,你所设计的模块或框架将会要稳定得多,因为这些设计模式它们都是通用的解决方案,是经过实践经验了的.

Eclipse开发Android应用程序入门

- Bingnan - 酷壳 - CoolShell.cn
原文出处:http://www.smashingmagazine.com/2010/10/25/get-started-developing-for-android-with-eclipse/. 如今的移动设备应用程序开发充满着让人振奋的东西. 功能强大的硬件支持,平板电脑,多样的软件平台(塞班 OS,iOS,WebOS,Windows Phone 7…),移动设备开发者前景充满了机会和挑战.

BlueStacks将Android程序运行在Windows上

- nowhere - Solidot
今年初,一家叫BlueStacks的创业公司宣布,将为Windows操作系统开发Android运行时环境,让Android应用程序能运行在Windows上. 现在,该公司发布了其产品BlueStacks Android Player的alpha公测版. 如该公司所承诺的,Windows上运行的Android应用程序的性能没有下降.

android应用程序线程的监控

- - CSDN博客推荐文章
所以就开始研究起来,经过半天的模式总用有点启发,下面就简单介绍一个简单的线程监控:. DDMS是一款Google* 提供的应用,可作为独立的工具运行,也可通过ADT Eclipse* 插件集成到Eclipse* 中. 它提供了强大的特性集合,能帮助您快速了解应用的运行状况. 线程更新DDMS中的线程监控和评测浏览对于管理大量线程的应用很有用.

Android程序Crash时的异常上报

- - CSDN博客移动开发推荐文章
转载请注明来源:http://blog.csdn.net/singwhatiwanna/article/details/17289479. 大家都知道,android应用不可避免的会发生crash,无论你的程序写的多完美,总是无法完全避免crash的发生,可能是由于android系统底层的bug,也可能是由于不充分的机型适配或者是糟糕的网络状况.

Android 一个应用程序调用另一个应用程序

- - CSDN博客推荐文章
实现行业应用调用我们可以Get到哪些技能. * Activity的singleTask的启动模式 * 界面跳转的基本实现 * 前台Service的基本介绍和实现 * SharedPreference的简单用法. 在XHL应用程序中去调用MPos应用程序,借助MPos的一些界面完成特殊的功能. (1)创建名为XHL的应用程序.

10款在Google labs诞生的Android应用程序

- HUan - cnBeta.COM
Google研究部门的高级副总裁Bill Coughran通过Google博客表示公司将关闭Google labs,因为Google打算集中资源开发重点项目. Google计划先结束所有实验,然后着重开发那些已成形的产品. 这并不意味着Google停止了一切创新活动,Google员工依旧会花时间进行“宠物计划”(就是工程师每周有一天时间将自己最疯狂的想法付诸实践),同时也会继续开发新产品,但是会终止所有实验室项目.