小迪安全v2023学习笔记(八十七讲)—— 安卓逆向篇&Smail语法&反编译重打包&Activity周期&Hook模块 - 实践

前记

  • 今天是学习小迪安全的第八十七天,本节课内容是关于安卓逆向的,主要是初步了解逆向的步骤、思路,以及学会采用一些好用的工具
  • 本篇文章篇幅比较长的原因是因为我觉得里面很多东西不太好懂,因此尽可能写得很详细,复现起来没那么吃力吧
  • 所有用到的资源已放至下方链接,然后我也找到了一些更好用的工具,链接在文章里,各位就自行下载吧:

APP攻防——第八十七天

安卓逆向篇&Smail语法&反编译签名重打包&Activity周期&Hook模块

前置知识

常见安卓逆向工具及环境
Magisk+LSPosed安装
  • 这里我们为了后面的演示,就先在雷电模拟器上装Magisk+LSPosed了,就是根据我上面给出的参考文章一步步安装即可

  • 如果在这两个页面显示无法获取,或者只有”选择并补修一个文件”这种安装方式,那多半是代理问题
    在这里插入图片描述
    在这里插入图片描述

  • 解决方式就是开个代理,我这里是用glider+postern解决的,glider就是一个代理池工具,将我PC端的代理形成一个代理池,然后在安卓端通过postern去连接发包,至于glider怎么使用就自己上网搜了

  • 我在安装的时候就只遇到了这一个疑问,如果遇到了其他的困难,欢迎留言至评论区或者私信我!

APK资料知识了解
文件结构
  • 大致的目录结构如下图所示:
    在这里插入图片描述
    在这里插入图片描述
APK组件
  • 然后Android的四大组件介绍如下图:
    在这里插入图片描述
APK生命周期
  • 一个APK文件的Activity生命周期如下图所示:
    在这里插入图片描述

  • 这里主要讲的是Activity组件的生命周期,大致就是上面这张图所示,然后里面涉及到的函数介绍如下图:
    在这里插入图片描述

APK逆向流程
  • 基本流程:
    在这里插入图片描述

  • 逆向关键点:
    在这里插入图片描述

  • 主要在两个地方:如何定位和如何修改,定位的问题大家行通过全局搜索关键词、ID、代码块、类名等等来快速找到关键位置修改的问题就是要熟悉Smail或者Java代码,能够看懂他的代码逻辑然后修改重打包

APK逆向 - 靶场练手

在这里插入图片描述

  • 这里大家先利用吾爱破解的靶场练练手,熟悉大概的反编译改包流程,然后再进行实际案例的演示
  • 今天主要是靶场的一到三关,包括熟悉APK结构、尝试更改APK逻辑以及关于Activity组件的内容
内容修改-结构&格式

在这里插入图片描述

  • 这个是第一关,要求如上所示,需要改动文字的替换和汉化,其实这里汉不汉化都无所谓,只要能够替换文字就说明大家已经掌握了改包的技能了

  • 第一步我们要拿到这个APP的apk安装包,这里还是有两种技巧,一是通过昨天讲的APK资源提取工具;而是MT管理器
    在这里插入图片描述
    在这里插入图片描述

  • 这里要改动文字,那我们就需要拿到这个APK的源码,也就是要反编译,这里可以使用上面提到的jadx_gui反编译,当然需要先查壳,然后考虑脱壳操作(不过本节课没有这个需求):
    在这里插入图片描述

  • 更推荐的工具就是MT管理器,他支撑基本的反编译,继而许可直接在材料里面修改并且重打包,非常方便
    在这里插入图片描述

  • 直接找到这个apk,然后点击查看即可:
    在这里插入图片描述

  • 然后我们就可以通过全局搜索关键字看看有没有刚刚看到的文字,比如hello 52pojie这个字符串:
    在这里插入图片描述
    在这里插入图片描述

  • 可以看到它确实搜索到了在这个材料中存在这个字符串,那么我们直接反编译打开查看,接着继续搜索这个字符串:
    在这里插入图片描述

  • 它就在该材料中出现过一次,虽然我们看不懂其他的代码,但是我们基本知道了这里就是它显示该字符串的位置,于是我们尝试修改:
    在这里插入图片描述

  • 然后点击保存,关闭文件,他会提示是否更新,大家直接点击确定(这里最好不要勾选自动签名):
    在这里插入图片描述

  • 然后退出该apk包,就会发现它已经将以前的apk备份了:
    在这里插入图片描述

  • 这里大家就对这个已经修改过的apk默认签名,又会多出一个新的apk记录,然后安装它即可:
    在这里插入图片描述

  • 安装成功之后,我们再次打开该软件,进入第一关就会发现原本的文字已经被我们成功修改:
    在这里插入图片描述

  • 这个是对一些可见字符,或者说好手打的字符进行修改,如果是下面这些其他国家的语言进行修改,大家手打肯定不现实

  • 怎么解决呢?可以使用开发者助手这个工具,点击界面资源分析,然后选择想要的查看的资源(这里一定要注意,需要重新安装原本的apk文件!!!):
    在这里插入图片描述
    在这里插入图片描述

  • 然后以同样的方式找到位置,由于我们用的是破解版,故而允许直接使用Arsc编辑器++:
    在这里插入图片描述
    在这里插入图片描述

  • 双击进入修改即可:
    在这里插入图片描述
    在这里插入图片描述

  • 重打包之后打开,允许看到也是同样被修改成功,其他的也不演示了,都是一样的修改思路

逻辑修改-Smail语法

在这里插入图片描述

  • 第二关是这样的,它需要我们成功一键三连,但是直接点击会提示需先获取10个硬币,然后我们点击获取10个硬币之后就可能成功三连了

  • 这里的话,我们很有理由猜测它是一个if判断,如果硬币数量大于等于10,就可以成功三连,所以我们应该是要修改它的判断逻辑,比如改为大于10等等

  • 通过于是先尝试采用MT反编译,然后搜索关键词,这里能够搜索 “一键三连” 或者它的判断提示词 “请先获取10个硬币哦” 等等:
    在这里插入图片描述

  • 这句话在classes.dex中出现过,那我们就直接打开然后再次寻找:
    在这里插入图片描述

  • 成功找到那就直接双击打开,因为我们这里是要修改它的逻辑,所以需要看懂该代码是在干嘛,这里可能先转为Java代码看它的逻辑:
    在这里插入图片描述

  • 可以看到逻辑很简单,如果intRef.element < 10就提示,否则进入三连代码,那这里我们修改的思路不就几种吗:要么把小于改成大于,要么更改这个数值,要么删掉这个if判断

  • 这里因为只能更改Smail语法,所以我们需要先定位,它是m2onCreate$lambda-2方法,所以在Smail语法中对应这一段:
    在这里插入图片描述

  • 然后这里可以看到if-ge语句,这应该就是刚刚的if判断,那我们直接搜一下这个语句代表什么意思就得了:
    在这里插入图片描述

  • 意思是如果p0 >= v0,就跳转到后面:cond_15的位置,否则就执行下面代码,那根据Java代码,这里p0就是我的硬币数量,v0就等于10,所以我们先看看什么if语法代表小于:
    在这里插入图片描述

  • 直接更改然后签名重打包安装,此时大家硬币数量为0的时候长按一键三连就会发现它成功了:
    在这里插入图片描述

视图修改-Activity&XML
APK逆向改包

在这里插入图片描述

  • 这里如果直接打开第三关会弹出很多广告,并且点击返回键或者关闭键都是没用的,那这一关我们的目标就是去除广告弹窗

  • 这里广告是关于Activity组件的内容,它是动态触发的,所以我们需要动态去调试,使用MT的Activity记录,然后去打开这个靶场他就会记录到关于这个靶场的所有Activity记录:
    在这里插入图片描述

  • 很明显就找到了关于这个靶场的Activity记录,并且根据英文判断是这个com.zj.wuaipojie.ui.AdActivity类触发的,所以我们直接在classes.dex因为这个文件中存放的是核心逻辑)中搜索:
    在这里插入图片描述

  • 成功搜索到,然后双击点开,分析Java代码,这里主要代码在这里:
    在这里插入图片描述

  • 其实很简单,就是前置知识里面讲到的Activity的生命周期,然后你按照上面的逻辑看下去就知道这个代码的执行流程了

  • 所以我们发现它这里有两个关键的东西,一个是AD_TIMEOUT,猜测是广告的延长时间;然后还有一个是hasPaused,这个应该是判断是否推送过广告

  • 于是我们就可以修改两个地方:将AD_TIMEOUT改为0,或者更改jump()的判断语句

  • 选择第一种方式我们先看3000的十六进制为0xbb8,于是在Smail中找到这个地方,更改为0x00
    在这里插入图片描述

  • 保存签名重打包,重启靶场就会发现没有广告了,当然修改jump()逻辑也是同样的道理,将if-nez改为if=eqz即可:
    在这里插入图片描述

HOOK模块
  • 这里也有更简单的方法,就是直接通过Magsik+LSPosed去HOOK这个软件,我们先在Kitsune Magisk中启用LPSosed模块,然后打开LSPosed(如果提示更新就更新)启用算法助手模块:
    在这里插入图片描述
    在这里插入图片描述

  • 接着双击进入该模块,勾选我们需要调试的软件:
    在这里插入图片描述

  • 之后重启打开算法助手APP,选择得调试的应用:
    在这里插入图片描述

  • 双击进入调试设置,选中弹窗定位以及屏蔽关键词弹窗:
    在这里插入图片描述

  • 然后我们点击右上角的启动符号:
    在这里插入图片描述

  • 重新打开第三关,会发现它的广告弹窗就消失了:
    在这里插入图片描述

APK逆向 - 实战分析

  • 经过上面的靶场练习,我们已经熟悉了安卓逆向最基本的运行,所以接下来会通过三个简单的案例来看看实战中该有什么作用
  • 需要注意的是,本节课大家并不讨论加壳的APP如何进行脱壳,因此这里的案例均为不加壳或者能够被自动脱壳的软件
实战案例1 - 淘小说-升级VIP
  • 游客身份,并且此时没有会员:就是我们打开软件,首先我们
    在这里插入图片描述

  • 此时随便打开一本书,然后点击缓存它会提示非VIP无法缓存:
    在这里插入图片描述

  • 现在大家开始操作,首先还是提取apk,然后使用MT反编译打开,搜索 “立即开通” 这种关键字:
    在这里插入图片描述

  • 看了一下不在这里面,那我们就把关键词范围扩大一点,搜索“开通”:
    在这里插入图片描述

  • 这里又一个个慢慢看,在classes.dex文件中有5处关键字:
    在这里插入图片描述

  • resources.arsc文件中有10处关键字:
    在这里插入图片描述

  • 这里出现了 “已开通” 的字样,说明可能是哪里逻辑判断之后从开通变成了已开通,因为是常量池,所以我们需要找到这个字符串出现的类的位置:
    在这里插入图片描述

  • 然后长按复制ID,因为我们直接在全文件中搜索“已开通”关键字是没有的,所以尝试在classes.dex中搜索一下这个常量池的ID看看是不是被调用了:
    在这里插入图片描述

  • 我们发现确实是通过调用ID的方式去判断是否开通会员,这里有4个结果,那就一个一个点进去分析Java代码吧,我们先将0x7f110725转为十进制2131822373,然后在Java代码中搜索,它的关键代码在每个文件中依次为如下所示:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 这里可以看到不管哪个文件中,它都是调用的MiConfigSingleton.q3().y5()方法去进行if判断,那我们猜测这个方法就是它判断是否开通会员的关键,于是定位该方法,搜索y5()
    在这里插入图片描述

  • 我们直接找到MiConfigSingleton类下的方法即可,就这里的第二个,点进去看它的代码逻辑,我们发现这个代码:
    在这里插入图片描述

  • 这就和上面的q3对上了,这里的返回值就是Q3不为空与上Q3.getIsVip>0的值,其实说白了就是要返回一个正值

  • 我们找到Smail代码:
    在这里插入图片描述

  • 这里一步步注释应该是能看懂这个执行逻辑的,所以大家的目标其实就很简单了,只要让他最后的v0为1即可,可以将const/4 v0,0x0改为const/4 v0,0x1;也可以直接将return v0改为return 0x1(当然最好是修改v0);或者在return v0前加一行const/4 v0,0x1都是可以的
    在这里插入图片描述

  • 修改之后签名重打包,我们再查看个人信息,就会显示会员已开通:
    在这里插入图片描述

  • 此时再随便打开一本小说,点击缓存就能够直接缓存了:
    在这里插入图片描述

  • 说明vip确实生效了,不是在紫薇[doge]

实战案例2 - 刷圈兔-去除广告
  • 这个软件emmm,这里就不演示了,和上面靶场环境差不多,没什么必要
实战案例3 - 元气壁纸-永久会员
  • 这个案例好像也没办法演示了,目前它需要强制更新,应该是修复了这个bug,然后我尝试去反编译它的源码绕过更新没成功,它加壳并且做了混淆,我目前的水平搞不明白,故而这里就看小迪是怎么做的就好了
  • 其实也很简单,就类似于Web端测试一样,通过小黄鸟抓响应包,由于是在前端判断是否为vip,所以直接更改绕过检测
posted @ 2025-10-09 15:18  yxysuanfa  阅读(23)  评论(0)    收藏  举报