安卓逆向4: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文件,
因为这个原理,可以根据大小来计算内存偏移量,从内存拿取数据,
###
脱壳-手动脱壳
动态调试:反调试,汇编,计算内存地址
动态调试,你要从内存里面拿代码了,这种内存里面的代码就是汇编了,甚至是机器码,就不容易了,
而且可能人家还有反调试,这种就很困难,
跟着app加载流程走,把内存中的文件提出来,这个难度大,
---->常用的脱壳方法,还是hook,
####
脱壳-工具脱壳
工具脱壳又有两种,
第一种:脱壳-工具脱壳-Xposed框架
这两个是在java层脱壳,
重点介绍一下fdex2,这个工具,
很好用,基本腾讯的乐加固,360的加固,都是可以脱壳的,
要使用这个工具,首先是要安装这个Xposed,而手机要安装这个,要先root,否则安装不了,
xposed框架也可以自己写代码脱壳,但是这个java不会,所以不考虑,
具体这个fdex2,脱壳的原理是什么?
后续还是要研究一下,
####
第二种:脱壳-工具脱壳-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,这就是脱壳的原理,
###
大厂的app为什么不常加壳,但是小app加壳,
因为大厂的app代码很大,加壳的话会有性能问题,而且兼容性会报错,
所以大厂宁愿牺牲一些安全性,但是防止客户的流失率,
那怎么保证安全性,就是混淆,混淆的比较厉害,
#####