【版权所有,转载请注明出处。出处:http://www.cnblogs.com/joey-hua/p/5138585.html】

因公司项目需要对app加固,经过本人数月的研究,实现了一套完整的仿第三方加固如爱加密等的加固方案(第三方加固价钱不菲,一整套针对金融app方案10~20万/年),从对原项目java源码dex文件加密在新项目中jni层解密之并替换当前进程到jni的反调试和linux对其加壳等一系列完整的方案及代码实现。在这准备做成一套教程供大家参考和互相学习指出不足之处。

因对纯java的破解过于简单所以我的加固方案是建立在jni技术的前提下,java的破解就不介绍了,apktool能反编译其源码。但用jni加密并对其加固了并不代表就万无一失了,最安全的方案就是建立在服务端不信任任何客户端发来的请求的前提下,策略是只要接口访问本身是合法的就是安全的。好了,废话不多说了,加固只是提升一个安全档次而已。

要想对自己的app加固首先得学会破解才能知道是不是真的加固成功了。这里就先介绍一下最常见的也是最强大的破解技巧——IDA动态调试:

项目jni的关键代码(项目地址见文章底部),获取当前程序的包名com.example.shelldemo和com.example.nocrack对比,正常运行结果是this app is illegal,编译jni我就不介绍了,项目中也带了编译好的so

1.工具介绍

IDA6.5,本人使用的所有IDA版本中只有这个版本能成功真机动态调试,手机系统版本为4.4及以下,需root

2.准备工作

A.传输android_server

首先找到IDA目录下的dbgsrv目录下的android_server,将其用adb推送到手机中,命令如下:

adb push android_server /data/local/tmp/

在手机上使用root explorer并赋予root权限检查手机的/data/local/tmp下是否有android_server,这个文件是连接手机和IDA调试器的工具。

B.启动android_server

分别执行以下命令

adb shell

su

chmod 777 /data/local/tmp/android_server

/data/local/tmp/android_server

C.重定向调试端口

这时启动另一个命令窗口并执行如下命令

adb forward tcp:23946 tcp:23946

23946是和IDA上设置的端口对应

3.配置IDA

首先在手机上运行项目程序,然后:

选择对应的项目程序包名

然后就会出现

直接cancel,接下来的对话框点击OK或关闭按钮都行,进入

4.选择对应的so及将要调试的函数

找到项目的so文件

双击进入后找到对应的函数名

双击进入

往下拖,拖到关键代码处,按F2设置断点,然后按F9等待下次运行至此函数

在手机上点击按钮“检测是否被crack”后进入断点,并能够单步执行,F8-step over,F7-step into,单步运行到这一行的时候

关键寄存器就是R0,观察下面一行BEQ loc_75D09ED0,意思是如果上面一行CMP比较指令的R0等于0则跳转到loc_75D09ED0,也就是running successfully那段代码,代表破解了。

那么现在来修改R0的值为0:

输入0

OK后F9看你手机显示running successfully。

注:中国象棋也在jni用了类似的判断手法,有兴趣的可以去破解玩下

crackme项目地址

IDA工具地址

android加固系列—2.加固前先要学会破解,调试内存值修改程序走向的更多相关文章

  1. android加固系列—5.加固前先学会破解,hook(钩子)jni层系统api

    [版权所有,转载请注明出处.出处:http://www.cnblogs.com/joey-hua/p/5138585.html] crackme项目jni的关键代码(项目地址见文章底部),获取当前程序 ...

  2. android加固系列—4.加固前先学会破解,无源码调试apk

    [版权所有,转载请注明出处.出处:http://www.cnblogs.com/joey-hua/p/5138585.html] 项目关键java代码为,将tv设置为从jni读取的字符串,这里的破解内 ...

  3. android加固系列—3.加固前先学会破解,静态修改so

    [版权所有,转载请注明出处.出处:http://www.cnblogs.com/joey-hua/p/5138585.html] 项目jni的关键代码(项目地址见文章底部),获取当前程序的包名com. ...

  4. android黑科技系列——获取加固后应用App的所有方法信息

    一.前言 在逆向应用的时候,我们有时候希望能够快速定位到应用的关键方法,在之前我已经详细介绍了一个自己研发的代码动态注入工具icodetools,来进行动态注入日志信息到应用中,不了解的同学可以查看这 ...

  5. Android拓展系列(11)--打造Windows下便携的Android源码阅读环境

    因为EXT和NTFS格式的差异,我一直对于windows下阅读Android源码感到不满. 前几天,想把最新的android5.0的源码下下来研究一下,而平时日常使用的又是windows环境,于是专门 ...

  6. Android Studio系列教程四--Gradle基础

    Android Studio系列教程四--Gradle基础 2014 年 12 月 18 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzhang ...

  7. Android Studio系列教程二--基本设置与运行

    Android Studio系列教程二--基本设置与运行 2014 年 11 月 28 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处! 上面一篇博客,介绍了Studio的 ...

  8. Android设计模式系列

    http://www.cnblogs.com/qianxudetianxia/category/312863.html Android设计模式系列(12)--SDK源码之生成器模式(建造者模式) 摘要 ...

  9. Android学习系列(17)--App列表之圆角ListView(续)

    http://www.cnblogs.com/qianxudetianxia/archive/2011/09/19/2068760.html   本来这篇文章想并到上篇Android学习系列(16)- ...

随机推荐

  1. Microsoft Azure News(5) Azure新DV2系列虚拟机上线

    <Windows Azure Platform 系列文章目录> 在之前的文章中,笔者了Azure VM虚拟机,分为A系列和D系列2种 Microsoft Azure News(4) Azu ...

  2. resin4 发布war包

    1.将web项目打包成xxxx.war 2.将war包放到webapps下 3.修改conf/resin.xml文件如下部分: <!-- - Configures the main applic ...

  3. Theano入门神经网络(二) 实现一个XOR门

    与非门的图片如下 示意图 详细解释: 1 定义变量的代码,包括了输入.权值.输出等.其中激活函数采用的是sigmod函数 # -*- coding: utf-8 -*- __author__ = 'A ...

  4. Elasticsearch Span Query跨度查询

    ES基于Lucene开发,因此也继承了Lucene的一些多样化的查询,比如本篇说的Span Query跨度查询,就是基于Lucene中的SpanTermQuery以及其他的Query封装出的DSL,接 ...

  5. 【分享】学长的安利来了~~O(∩_∩)O

    前言:应栋哥要求,学长把演讲稿稍微整理下发布出来,这可以算是一篇安利文,也可以说是一篇经历文吧.作为一个确确实实从软工里收获到挺多东西的过来人,学长希望可以通过学长的经历来让你们对软工更加期待. 安利 ...

  6. 关于Html与css的一些解释

    一.简单介绍 1.html,是hyper text markup language的缩写,中文为“超文本标记语言”. 2.html不是编程语言而是一种标记语言. 二.标签与元素 1.html标签:如& ...

  7. 【转】万网域名查询接口(API)的说明

    1.域名查询接口采用HTTP,POST,GET协议:调用URL:http://panda.www.net.cn/cgi-bin/check.cgi参数名称:area_domain 值为标准域名,例:h ...

  8. C#编程总结(四)多线程应用

    C#编程总结(四)多线程应用 多线程应用很广泛,简单总结了一下: 1)不阻断主线程,实现即时响应,由后台线程完成特定操作2)多个线程,完成同类任务,提高并发性能3)一个任务有多个独立的步骤,多个线程并 ...

  9. 硬链接 and 软链接

    硬链接 软链接

  10. Repository 设计模式介绍

    在DDD设计中大家都会使用Repository pattern来获取domain model所需要的数据. 1.什么是Repository? "A Repository mediates b ...