写在前面
这篇文章重点说思路,关于mt、np管理器这些工具的使用就不做赘述了,网上有太多
文章里面有不严谨的地方欢迎讨论
基础知识
Manifest
Android应用程序由松散耦合的组件组成,并使用应用程序Manifest绑定在一起
应用程序的AndroidManifest.xml文件包含了组成应用程序的每一个Activity、Service、Content Provider和Broadcast Receiver的节点,并使用Intent Filter和权限来确定这些组件之间以及组件和其他应用程序的交互方式。
Activity:是应用程序的表示层。应用程序中的每一个UI都是通过Activity类的一个或多个扩展实现的
Service:应用程序中不可见的工作者。Service组件在运行时没有UI,它们可以更新数据源和Activity、触发通知和广播Intent
Smali
Dalvik是google专门为Android操作系统设计的一个虚拟机,经过深度的优化
Dalvik有专属的文件执行格式dex(dalvik executable)
smali就是Dalvik VM内部执行的核心代码
//基本数据类型
B—byte
C—char
D—double
F—float
I—int
S—short
V—void
J—long
Z—boolean
//语法
.fleld private isFlag:Z 定义变量
.method 方法
.parameter 方法参数
.prologue 方法开始
.line 123 此方法位于第123行
invoke-super 调用父函数
const/high16 v0,0x7fo3 把0x7fo3 赋值给v0
invoke-direct 调用函数
return-void 函数返回void
end method 函数结束
new-instance 创建实例
iput-object 象赋值
iget-object 调用对象
invoke-static 调用静态函数
//条件分支
if-eq vA,vB,:cond_ 如果vA等于vB则跳转到cond_
if-ne 不等于
if-lt 小于
if-ge 大于等于
if-gt 大于
if-le 小于等于
if-eqz 等于0
if-net 不等于0
if-ltz 小于0
if-gez 大于等于0
if-gtz 大于0
if-lez 等于0
签名
目的:
- 对发送者的身份认证:
由于开发商可能通过使用相同的package name来混淆替换已经安装的程序,以此保证签名不同的包不被替换。 - 保证信息传输的完成性:
签名对于包中的每个文件进行处理,以此确保包中内容不被替换。 - 防止交易中的抵赖发生,market对软件的要求。
原理:
对一个APK文件签名之后,APK文件根目录下会增加META-INF目录,该目录下增加三个文件,分别是:MANIFEST.MF、CERT.SF和CERT.RSA
MANIFEST.MF
摘要文件,文件中保存了APK里面所有文件的SHA1校验值的BASE64编码。
如果改变了APK包中的文件,在apk安装校验时,改变后的文件摘要信息与 MANIFEST.MF 的检验信息不同,程序就不会安装成功。
假如攻击者修改了程序的内容,又重新生成了新的摘要,就可以通过验证
CERT.SF
摘要的签名文件,对前一步生成的MANIFEST.MF,使用SHA1-RSA算法,用开发者的私钥进行签名。
在安装时只能使用公钥才能进行解密。解密之后,与未加密的MANIFEST.MF进行对比,如果相符,则表明内容没有被异常修改。
没有开发者的私钥就不能生成正确的签名文件
系统在对程序进行验证的时候,用开发者公钥对不正确的签名文件进行解密,得到的结果和摘要文件对应不起来,导致不能通过检验,不能成功安装文件。
CERT.RSA
包括公钥、所采用的加密算法等信息,还有对CERT.SF中的内容的用私钥进行加密之后的值
去广告
工具:MT管理器(收费)、NP管理器(免费)
目标APP:无加固、有开屏广告
思路:
先根据开屏广告中边角位的logo判断一下是什么厂商的广告
比较通用的方式是抓包搜字符串然后看域名,接口地址
熟练之后看一眼logo就可以是啥广告商了,直接搜厂商官方文档
如穿山甲 SDK: https://www.csjplatform.com/supportcenter/5396
最新版使用了动态创建Activity(https://blog.csdn.net/victoryckl/article/details/78406651)的加载方式,配置没有暴露在Manifest中所以也不能直接删Activity,但可以根据文档定位入口找到后端加载逻辑劫持
但是目前App一般都会使用ProGuard(https://github.com/Guardsquare/proguard)做混淆,但第三方SDK一般会强调将自己的包加到白名单内,所以改第三方SDK的成本更低,更具有通用性
关键字直接搜“穿山甲”,快速看了一眼代码,找到一个好下手的地方
if判断之前直接跳转过来,强制“无广告可用”
还有一些其他方法,比如通过官方文档我们可以知道广告SDK初始化时需要传入CodeId,我们直接改这个ID成一个非法的数值也可以让APP不能正常加载广告
另外还看到网上有大佬提供另一种简单粗暴的方式,直接在assets目录删除穿山甲的植入包,我这里是68003315,类似这种数字无扩展的就可能是
去更新
工具:MT管理器(收费)、NP管理器(免费)
目标APP:无加固、有开屏广告
思路:
比较通用的方法是抓包看广告接口,搜字符串在APK DEX里面找,直接把地址改掉,或者分析后端逻辑把代码改掉
如果是使用的三方SDK,直接在Arsc资源编辑器中搜关键字,根据资源ID、映射Key一直找到引用的包,根据包名判断SDK类型,然后看官方文档找入口,干掉加载
发现是bugly SDK: https://www.jianshu.com/p/e61482de6e0a
看完文档之后考虑从前端展示层直接干掉更新界面,直接在AndroidManifest.xml中删除com.tencent.bugly.beta.ui.BetaActivity 的相关配置即可
这个比较简单不贴图了
去加固
之前可以直接用blackdex虚拟机脱壳,但这玩意被各厂商上对抗做了特征识别已经不能用了
现在的一种做法是自己开虚拟机,用“反射大师”把dex从内存导出来,但是一些加固壳会静态抽取部分原工程中的类指令到外部,运行时再动态加载,这种就跟脱壳时机有关了,会涉及到需要手动修复dump的dex
网上有大佬写过相关文章,我也不熟就不班门弄斧了
https://blog.csdn.net/weixin_34567079/article/details/117614997
https://zhuanlan.zhihu.com/p/374939570
去签名校验
MT、NP有现成的功能直接用就行
原理就是搜原证书的哈希替换成自己的,或者搜索一下哈希计算函数,找找看有没有判断后退出APP的代码片段,把逻辑nop掉