脱壳实现去广告

1 前言 对针对服务器的渗透测试而言,修改APP内容的意义是绕过一些弹窗、前端逻辑等。
2 对APP进行基础分析并脱壳
2.1 分析
拿到APP,先使用APK Messenger和GDA看一下壳:

在这里插入图片描述
这里注意,查壳软件最好一次使用多个。因为各个查壳软件使用的规则不同,可能出现加壳APP不显示已加壳的情况。比如这个APP在APK Messenger里就显示未加壳,但其实是有壳的:

在这里插入图片描述
2.2 脱壳
脱壳最主要的目的是还原被混淆、抽取的函数,便于上钩子或调试、阅读代码。

2.2.1 脱出dex文件并删改、修复
使用工具为BlackDex,请注意此APK分位数版本,需要按照手机位数下载32位或64位。

打开工具,直接选择APK自动脱壳:
在这里插入图片描述
脱出来了四个dex文件:
在这里插入图片描述将APK用解压缩软件打开,对比两边的dex文件大小:

在这里插入图片描述
可以看到有两个dex文件与原始dex大小相同,删去这两个dex。

剩下的dex留个备份,然后用NP管理器打开进行dex文件修复,选择全部修复:

在这里插入图片描述
2.2.2 查找真实入口并进行替换
gda打开或使用baksmali(前者是国人写的软件,后者貌似是什么官方工具,都很容易下载)反编译dex文件**(指的是原dex文件,不是脱下来的)**,然后查找真实appname。

这里使用backsmali,命令为 java -jar .\baksmali-2.5.2.jar d .\cookie_3561024.dex。

全局搜索.field static className:Ljava/lang/String;找到对应的字段(这个需要搜索的字段每个加固是不一样的,毕竟加固相当于自定义读取器,每个厂家代码不同):
在这里插入图片描述
向下看,找到赋值部分:

在这里插入图片描述
可以看到值为com.nursinghome.monitor.base.MyApp,这就是APK的真实入口名。

电脑端使用apktool对apk进行反编译(命令参考上面章节),得到smali源码文件夹。

在文件夹中找到AndroidManifest.xml文件,找到application元素的android:name字段,替换为刚才找到的值:
在这里插入图片描述
2.2.3 重新编译APK并删除加固文件、替换dex
替换完成后,保存文件,使用apktool重新编译:
然后用解压缩软件打开编译后的APK文件,查找并删除以下文件:

0O等类似开头长得很混乱的文件,如0OO00l111l1l
tencent_stub
tosversion
其他名字中带有shell的文件(主要是so文件)
然后,删除根目录下的classes{n}.dex文件,放入第一步中修复好的dex文件并将它们重命名为classes{n}.dex。

2.2.4 重新签名,安装
跟第八节中的步骤一样。打开NP管理器,选择APK文件,可以看到加固已经没有了,但是显示校验不通过。

在这里插入图片描述
点击功能,选择签名然后安装签名后的APK即可:
在这里插入图片描述
3 静态审计和动态代码分析
这个APP的话,其实代码写的还可以,没有特别离谱的部分,静态是可以看出来的。

而且动态调试主要调试的是SMALI代码,看的也是Dalvik寄存器。没有一定的经验是不建议直接动态调试的。

静态审计代码推荐使用Jadx,可以直接查看JAVA代码。动态调试推荐JEB。动态调试的环境能使用真机就使用真机。使用模拟器会出现各种各样预料之外的情况。

3.1 静态审计之前:Android代码讲解
无论是静态审计还是动态调试,都需要具备一些代码基础(最好自己上手写一个简单的Android应用)。也许有些情况只需要修改一下if表达式的true/false,但更多情况需要我们跟随Intent、追踪函数。

我们这里的目标是去除开屏广告。开屏广告是无论如何都会被展示的,所以不能通过修改逻辑表达式的值来跳过,而是要通过Intent进行跳过。

Android中Intent的介绍_android intent_休以希的博客-优快云博客

Intent是Android中的重要组件,很多Activity之间的跳转操作都通过Intent执行(微信小程序中也有类似的组件)。我们可以将Intent理解为一种跳转指令,activity.startActivity(intent)会令APP跳转到destActivity。

开屏广告之类的占满整个屏幕的广告绝大多数会以Activity存在(我不知道谁会把它写成Fragment,但是完全没必要,所以可能性是可以忽略不计的),所以要跳过开屏广告,我们要找的第一行代码是跳转到广告Activity的Intent,第二行是广告Activity中跳出的Intent。

另外,拿到代码先看抽象程度,如果没有混淆的很厉害可以先找类名、函数名等关键词,如果参数等完全被混淆我们可以找APP中出现的中文(这些中文按照Android的代码规范需要存储在特定的xml文件里),如:
在这里插入图片描述
然后我们可以根据其对应的“name”查找调用地点(搜索R.string.name),进而定位到其所属的Activity或代码。如:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
或者我们也可以继续搜索资源(布局文件),使用@string/name,找到其所属的Activity或Fragment,如:
在这里插入图片描述
在这里插入图片描述
3.2 静态审计
先看下混淆程度,查看主包下类名混淆程度:

在这里插入图片描述
还能接受,程度不重。我们先找一下广告所属的类,尝试搜索类名Ad:
在这里插入图片描述
可以看到明文的类名还是挺多的。我们先看看能不能找到Activity类,缩小范围:
在这里插入图片描述
找到了,名字就叫AdActivity。

然后我们开始寻找两个Intent。先在AdActivity里找跳出Intent,看代码,文件中搜索startActivity:
在这里插入图片描述
有两处跳转,一处跳转到登陆,一处直接跳转到主页面。这里我们可以思考一下如何绕过广告框比较合适。本来最简单的方法是直接复制这里的Intent替换进入AdActivity的Intent。但是这里明显有额外的逻辑。那么我们可能需要在进入AdActivity后促使其自动执行跳转的方法b。

然后我们继续查找跳转到AdActivity的Intent。

跳转到某某Activity的代码为new Intent(content,xxActivity.class),可以全局搜索new Intent(this, xxActivity.class)或xxActivity.class(记得关掉正则表达式)。这里试试第一种:

在这里插入图片描述
果不其然,找到了。
在这里插入图片描述
3.3 动态代码分析调用路径
由于静态审计处并不方便查看代码调用逻辑,我们使用动态分析来查看AdActivity内部的调用链。

使用JEB打开APP,找到第一个Intent startActivity时的代码,再次解析跳转到SMALI并Ctrl+B上断点:
在这里插入图片描述
手机打开APP(最好在开发者选项里设置一个等待调试器),JEB打开调试器,链接到目标进程:
在这里插入图片描述
附上进程后,使用跳过和进入查看代码的执行流程。

3.3 修改代码并重新打包
从上面的动态和静态审计中可以找到很多种修改APP绕过广告的方式。我们这里使用最简单的一种:直接将计时器的时间设为0,使其立刻跳转。
在这里插入图片描述
关键代码如上所示。

apktool直接反编译APP,然后寻找此方法(通过搜索函数名可以快速查找到):
在这里插入图片描述
参数对应如下所示:
在这里插入图片描述
对照原JAVA函数调用:

可以看出,我们需要找到寄存器v4的上一次赋值,将其改为0f(float)。
在这里插入图片描述
然后重新打包,签名,安装,绕过成功。
绕过前有五秒广告(我中间点了一下跳过):

在这里插入图片描述
绕过之后广告界面直接消失:
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值