问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
脱壳并修改APP内容实现去广告
移动安全
1 前言 对针对服务器的渗透测试而言,修改APP内容的意义是绕过一些弹窗、前端逻辑等。当然 也可以用来开挂,出去就说你是自学的^ ^。 2 对APP进行基础分析并脱壳 2.1 分析 拿到APP,先使用APK M...
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\_休以希的博客-CSDN博客](https://blog.csdn.net/u010845516/article/details/122423619) 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)。  然后重新打包,签名,安装,绕过成功。 绕过前有五秒广告(我中间点了一下跳过):  绕过之后广告界面直接消失: 
发表于 2024-06-04 09:37:42
阅读 ( 3795 )
分类:
硬件与物联网
0 推荐
收藏
0 条评论
请先
登录
后评论
阿斯特
AugustTheodor di CatXicure
6 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!