zoukankan      html  css  js  c++  java
  • 安卓逆向:app加固原理,app脱壳原理

    ####

    app加固原理

    ####

    首先是为什么要加固app?

    加固,就是为了防止被很容易的被逆向,逆向就是说把app的源代码抠出来,比如游戏app,如果别人想要抄袭我,逆向之后,把代码拿去,然后就可以用,后台都有,这是很危险的,

    所以要加固,让你难以逆向,这不是完全杜绝,而是相对比较难,

    ###

    然后是一般app都是怎么加固的?

    一般不会自己公司加固,而是用的第三方加固, 比如应用市场的加固,所以你发布上去应用市场,要求是没有加固的,防止这个app有一些敏感的功能,违法的功能,做坏事的功能,

    然后是应用市场给你加固,加固之后然后发布出去,

    有的应用市场不严格,可能允许你上传加固的app,这是为了让别人上传更多的app,

    可以选择用还是不用他们应用市场的加固方案,可以不用,所以不是所有的app都有加固的,

    每一个应用市场,都有自己的加固方案,

     比如360,腾讯,这两个搞定了,其他的都不用管,因为大部分app都在这些应用市场了,

    加固的方案基本就是dex加固和so加固,

    加固还分为收费和免费,要更好的加固,是收费的,

    为什么360应用市场,会看到腾讯乐加固的app,

    这是为了丰富生态,有些应用市场,会抓取别的应用市场的,

    还有脱壳的时候,可以在不同的应用市场,下载app,因为不同的应用市场,是不同的,脱壳难度也是不同的,

    有的应用市场什么是没有加固的,所以要注意技巧,

    ####

    怎么判断一个app有没有加固?

    举例:

    使用反编译的方法,比如jadx工具,apktool反编译,看目录结构

    找到lib文件夹,如果里面有libsharea.so,这个就是腾讯的乐加固,

    ###

    在没有加固之前,jadx反编译之后,是可以看到源代码的

    但是加固之后的app,你是看不到源代码的,只能看到加固厂商的一些信息,根本就没有源代码的目录

    加固之后,你是看不到源码的,只能看到壳的内容,

    ####

    这个时候我们看看这个加固的apk的,application文件,

    如果没有加固,肯定是直接去找这个xml文件了,

    但是现在加固了,现在要先进加固的壳,然后才能去找这个xml,

    这个时候application文件,安卓name就是壳的入口了,往下找,就会有原来app的安卓name的入口,

    ####

    而且你去看Androidmanifest.xml文件,发现是进入这个壳的application了,不是进入app原本的application了,

    加固之后相当于是两个apk了,

    要先启动壳的apk,然后通过这个壳apk,把源app的内容加载起来,放到内存里面,

    这个就是下一步加载的源app的application,

    ###

    加固原理

    你上传你的源apk到应用市场,

    应用市场有自己的加固壳程序,用这个壳去加密你的源apk,这个壳程序主要是读取源apk的dex文件,加密成为一个新的dex文件,

    最后生成一个新的apk,

    ###

    加固之后的app运行原理

    这个apk先加载壳app,壳app读取源dex文件,然后解密出来源app的dex,运行源apk,

    ###

    现在加固了之后,你反编译就不行了,看不到源代码了,

    所以必须要解决脱壳的问题,

    ###

    加固方式,

    一般就是dex加固和so加固。

    最普遍的是dex加固,因为so加固需要一个公司的开发会c语言,

    ###

    app脱壳原理:

    脱壳的原理

    在壳app解密源apk的dex之后,源apk被加载之前,拦截这个过程中的系统函数,把内存中的dex文件dump拿出来,

    这个中间的流程是很长的,你要在哪一层hook,这个也需要你选择,

    因为只有壳app知道如何解密,所以这一步脱壳,还是需要知道这个原理,

    #######

    怎么脱壳?

    还有脱壳的时候,可以在不同的应用市场,下载app,因为不同的应用市场,是不同的,脱壳难度也是不同的,

    有的应用市场什么是没有加固的,所以要注意技巧,

    脱壳主要是两种方式,

    脱壳分为两个方法

    一个是手动脱壳,

    一个是工具脱壳

    ###

    脱壳必须要对加固的流程熟悉,你越熟悉越知道怎么脱壳,

    脱壳的方法很多,可以在不同层脱壳,但是方法原理都是一样的,就是从内存里面把解密的源app代码拿出来,

    ###

    脱壳,要了解dex文件的格式,

    dex文件包含校验位,签名,还有文件大小,

    这个签名就是app签名,这个签名会进入这个dex文件,

    因为这个原理,可以根据大小来计算内存偏移量,从内存拿取数据,

    ###

    脱壳-手动脱壳

    通过动态调试,跟踪计算Dex源文件的内存偏移地址,从内存中Dump出Dex文件
    难度大,寄存器,汇编,反调试,反读写
    IDA

    动态调试:反调试,汇编,计算内存地址

    动态调试,你要从内存里面拿代码了,这种内存里面的代码就是汇编了,甚至是机器码,就不容易了,

    而且可能人家还有反调试,这种就很困难,

    跟着app加载流程走,把内存中的文件提出来,这个难度大,

    ---->常用的脱壳方法,还是hook,

    ####

    脱壳-工具脱壳

    工具脱壳又有两种,

    第一种:脱壳-工具脱壳-Xposed框架

    Fdex2:Hook ClassLoader loadClass方法 通用脱壳
    dumpDex:https://github.com/WrBug/dumpDex 
     
    这两个工具就是apk,直接安装就可以了,很简单,不用处理,

    这两个是在java层脱壳,

    重点介绍一下fdex2,这个工具,

    很好用,基本腾讯的乐加固,360的加固,都是可以脱壳的,

    要使用这个工具,首先是要安装这个Xposed,而手机要安装这个,要先root,否则安装不了,

    使用已有工具会有问题:会发现很多的新的apk,都无法脱壳,技术晚半代至一代,可以脱老版本APP 

    xposed框架也可以自己写代码脱壳,但是这个java不会,所以不考虑,

    ####

    第二种:脱壳-工具脱壳-frida框架

    一个是hook技术,

    改变程序执行流程的一种技术 在函数被调用前,通过HOOK技术,先得到该函数的控制权,实现该函数的逻辑改写

    我们之前绕过签名是,改了人家的smali文件,这样不好,还好没有做其他的校验,否则你不一定能绕过,

    frida框架

    主要系统函数都已HOOK/基于xposed frida开发脱壳工具/有大神已开发上层应用模块

    所以两种办法,还是hook技术比较好,既不需要修改源码,还不是太困难,

    ####

    hook,一般是可以hook两层,

    1个是java层,这个比较好hook,

    1个native层,也就是so库,这个难度大一点,难在看不到源代码,内部的逻辑都是汇编,

    hook的基础是要看到源代码,找到函数,所以hook的前提首先是要脱壳,

    这个地方有一个疑点,既然是用hook脱壳,而hook又要先脱壳,这不是悖论了???

    ####

    加固后的apk的so文件是有特征的,

    那可能会从360应用市场下载下来的apk是使用的腾讯的加固方案,这是怎么回事?

    可能是应用市场为了丰富自己的apk的生态,然后扫描别的应用市场,然后把自己没有的包,拿过来,

    可以多个应用市场都下载一下apk,有的apk在别的应用市场是没有加固过的,这样就方便了,

    ###

     dex加固,这种就是第三方的加固,

    so加固,主要是把核心代码放到so文件,保护代码,是c语言写的,

    大部分加固都是dex加固,大厂的产品可能使用so加固,因为需要有c工程师才可以,

    ###

    hook一般是两种

    一个是hook java层,这个就是hookapk的源代码,这个比较简单

    一个是hook,native层,so库,这个比较难,需要看懂c语言,看懂汇编代码,

    hook 的前提,你必须要知道函数或者方法名是什么,否则你怎么hook呢,

    ###

    脱壳的原理就是因为不管怎么加固apk,你都要把源apk的代码加载到内存,运行源apk,这就是脱壳的原理,

    ###

    #####

  • 相关阅读:
    利用条件信号量设计读写锁
    高效编程之互斥锁和自旋锁的一些知识
    高效编程之指针跳转的影响
    高效编程之cache命中对于程序性能的影响
    SQL Server中使用自定义指定顺序排序
    Vue使用,异步获取日期时间后格式成"/Date(1333245600000+0800)/" 转换成正常格式
    技术胖-胜洪宇关注web前端技术
    百度editor编辑器添加新字体
    mvc4中的 webapi 的使用方式
    js特效不错的网站
  • 原文地址:https://www.cnblogs.com/andy0816/p/15176997.html
Copyright © 2011-2022 走看看