随着Android 市场的扩大,各类盗版、破解、打包党纷纷涌现,其使用的手法无非是apk _> smali ->修改代码 ->重打包签名,为对抗此类技术,广大程序员挖掘了Android平台特有的保护技术:签名校验

 
 
1、JAVA代码本地签名校验
Android要求安装到手机上的APK文件必须有签名,而理论上开发者的签名他人是无法得到的(证书保护是另外一回事),所以比较容易想到的就是执行签名校验,验证本程序的签名是否为合法的程序。
 
代码:
android.content.pm.PackageInfo 这个类
包含有如下字段
public Signature[]  signatures  Array of all signatures read from the package file.
 
通过signature可以取得证书的HASH值,用于签名对比:cool:
然而此方法过于简单,小伙伴们一看,这不就是一个equals么。 简单的把smali中的 if-eqz 改成if-nez就能反转逻辑啦。
 
因此为了增加强度,可以将JAVA代码转为NDK代码
 
2.NDK层校验
 
简单来说,NDK就是用C/C++在Android开发的一组套件,一般来讲以so的形式存在,JAVA代码通过JNI接口来调用,当然也可以独立编译为具有main入口的可执行程序 
 
NDK的好处是增加了程序的复杂度,因为so通过反汇编,得到的是ARM代码,而不是smali这种易重修改、易理解的代码。修改so难度将大增。
 
在so中校验程序签名的方法也类似于JAVA层中代码,可通过JNI的GetMethodID 取得JAVA类函数,通过Call***Method 来调用 ,详细使用方式见附件 JNI_Docs.rar.
 
此时,虽然增加了一定的破解难度,但若使用不当,仍然容易被小朋友破解掉滴。
 
 
某APK 在so中实现签名校验功能,但在实现中将用于对比的签名HASH串明文存放在代码中,编译后,字符串存放在.rodata段,打开IDA ctrl+x 一定位,就出来啦!,然后使用强大的UE一改掉,就落入魔爪了。
 
所以讷,在so中,一定是不能这样明文存放滴 ,至少要进行两次变形。
 
1)分段存放, 将字符串分为多段, 如:0 3 6 9 .... ; 1 4 7 10 .... ;2  5  8 11 .... 各为一段, 在实际使用中,再进行拼结
 
2)分段了仍然不好,因为数字还是在,通过对比,还是比较 容易发现规律的,所以需要对数值进行加密处理,再保存。加密随便采用一个自定义的对称加密算法, 再将加密后的密文写到程序中,准备使用时,进行解密。
 
虽然做了以上猥琐的操作,还是会被干掉的 因为本地是小朋友们的地盘,迟早会发现啊,那咋整?放到服务器去啊。
 
3、服务器校验
 
服务器校验即将本地的程序信息,传输到服务器进行校验,然后返回一段核心代码进行执行(这里不是一个简单的校验结果,也是防本地修改;同时也不建议服务器下发校验信息,本地校验,原理同)
 
 
 
首先本地取一些相关信息,然后使用非对称算法进行加密,此处的信息一般很小,减轻服务器压力。
 
将加密结果发送到服务器端,服务器处理好后,下发特定的核心代码,然后动态加载执行
 
客户端执行代码,校验成功。
 
 
此种方法相对比较完善,但仍然存在绕过的可能性
非对称算法需要用到公钥加密与解密。因此存在一种中间人的可能性
 
首先将客户端的公钥取出来,替换掉自己的公钥。
 
然后传输到中间人处时,中间人用自己的密钥解密,得到明文,再用原来的公钥加密发到服务器,接收数据同
 
因此有必要对中间人的证书链进行验证。
 
 
 
以上三种校验方式相辅相成,目前而言,采用第二种的已经比较多了。第三种方式已见到一些APK在使用。第一种基本上相当于没穿
 
转自:http://blog.csdn.net/wulianghuan/article/details/22497621

Android程序的签名保护及绕过方法的更多相关文章

  1. Android程序完全退出的三种方法

    很多网友可能发现自己的Android程序有很多Activity,比如说主窗口A,调用了子窗口B,在B中如何关闭整个Android应用程序呢? 这里Android123给大家三种比较简单的方法实现. 首 ...

  2. Android程序全然退出的三种方法

    1. Dalvik VM的本地方法 android.os.Process.killProcess(android.os.Process.myPid())    //获取PID,眼下获取自己的也仅仅有该 ...

  3. 用Ant手动打包android程序,android分包机制解决65536方法过多异常

    Android利用ant手动打包 首先我们要给自己的IDE eclispe配置ant,默认的eclipse是集成了ant构建工具的,但是google提供的Android集成开发工具ADT,里面封装了E ...

  4. Android 程序打包及签名

    为什么要签名??? 开发Android的人这么多,完全有可能大家都把类名,包名起成了一个同样的名字,这时候如何区分?签名这时候就是起区分作用的. 由于开发商可能通过使用相同的Package Name来 ...

  5. Android 程序打包及签名(转)

    为什么要签名??? 开发Android的人这么多,完全有可能大家都把类名,包名起成了一个同样的名字,这时候如何区分?签名这时候就是起区分作用的. 由于开发商可能通过使用相同的Package Name来 ...

  6. Android内存管理(5)*官方教程:Logcat内存日志各字段含义,查看当前内存快照,跟踪记录内存分配,用adb查看内存情况时各行列的含义,捕获内存快照的3种方法,如何让程序暴漏内存泄漏的方法

    Investigating Your RAM Usage In this document Interpreting Log Messages                 内存分析日志中各消息的含 ...

  7. 谈使用Eclipse与DDMS调试Android程序的方法

    在Eclipse开发工具中调试程序的方法很多,但是使用Eclipse调试Android程序时需要注意一些细节上的问题.许多刚接触 Android的开发者,在调试Android程序时总是不能迅速地找到程 ...

  8. 启动android程序和虚拟机时候出现如下错误的解决方法

    启动android程序和虚拟机时候出现如下错误的解决方法. 错误重现: [2011-07-13 16:22:48 - Emulator] invalid command-line parameter: ...

  9. Android程序捕获未处理异常,处理与第三方方法冲突时的异常传递

    自己的android程序对异常进行了处理,用的也是网上比较流行的CrashHandler,代码如下,就是出现了未处理的异常程序退出,并收集收集设备信息和错误信息仪器保存到SD卡,这里没有上传到服务器. ...

随机推荐

  1. 配置iDempiere源码开发环境

    你需要一个较为快速通畅的互联网连接来下载源代码! 安装软件: OS: Windows Server 2008 R2 SP1 x64 英文版 Database: Oracle 11G R2 x64 英文 ...

  2. 使用jsPlumb制作流程图设计器

    jsPlumb是一个比较强大的绘图组件,它提供了一种方法,主要用于连接网页上的元素.在现代浏览器中,它使用SVG或者Canvas技术,而对于IE8以下(含IE8)的古董浏览器,则使用VML技术. 项目 ...

  3. 修改开机启动等待时间(for Ubuntu12.10)

    Ubuntu的开机启动等待时间默认是10s,等待时间比较长,每次启动都得按一下回车,于是就想修改一下等待时间.我们可以找到Grub的配置文件(/boot/grub/grub.cfg),在其中进行个性化 ...

  4. 使用NHibernate(8)-- 延迟加载

    1,延迟加载. 延迟加载,即用到的时候再加载数据.这种机制是非常有情怀的,比如一篇中的用户实体有标签.问题等导航属性,如果只是用到用户名去查询整个实体,则把相关的标签和问题也都加载,性能会比较低.而有 ...

  5. mongo(四)索引

    mongo(四)索引 根据这里http://www.cnblogs.com/huangxincheng/archive/2012/02/29/2372699.html   首先,需要构造一些数据,如下 ...

  6. DDD Example

    PART 1: http://www.infoq.com/presentations/model-to-work-evans PART 2: http://www.infoq.com/presenta ...

  7. 带你看懂Dictionary的内部实现

    了解Dictionary的开发人员都了解,和List相比,字典添加会慢,但是查找会比较快,那么Dictionary是如何实现的呢? Dictionary的构造 下面的代码我看看Dictionary在构 ...

  8. macbook 快捷键

    macbook  air快捷键应用 Command + 空格键  = 切换输入法Command + Control + F = 全屏(Command + Shift + F Chrome全屏 Comm ...

  9. linxu ffmpeg 编译安装

    1.下载ffmpeg. 下载网址:http://www.ffmpeg.org/download.html 2.解压缩 tar -zxvf ffmpeg-2.0.1.tar.gz 3.配置,生成Make ...

  10. What is /proc/slabinfo?

    /proc/slabinfo gives information about memory usage on the slab level. Linux kernels uses slab pools ...