安卓逆向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文件,

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

 

###

脱壳-手动脱壳

通过动态调试,跟踪计算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不会,所以不考虑,

 

具体这个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代码很大,加壳的话会有性能问题,而且兼容性会报错,

所以大厂宁愿牺牲一些安全性,但是防止客户的流失率,

那怎么保证安全性,就是混淆,混淆的比较厉害, 

 

#####

posted @ 2021-08-23 17:48  技术改变命运Andy  阅读(5281)  评论(0编辑  收藏  举报