首页
社区
课程
招聘
[分享]安卓逆向课题之8, 真实App实操带壳App重打包去强制升级(部分抄袭别人笔记)(一次不完美的实践)
2023-11-27 18:37 4851

[分享]安卓逆向课题之8, 真实App实操带壳App重打包去强制升级(部分抄袭别人笔记)(一次不完美的实践)

2023-11-27 18:37
4851

入门学习逆向的个人笔记,预览(欢迎探讨)

[原创] 肉丝的r0env2022(kali linux)配置xrdp远程桌面,以及Genymotion安卓11的ssh登陆问题和11系统amr64转译问题.
[分享] (Android) 逆向入门记录 一篇杂文, 记录.
[分享] Adndroid逆向的基础环境准备 的一些记录 , 抄袭royuse的课 第3课
[分享] 安卓逆向课题之4, Activity,service,content provider,broadcast receiver和实例演示,完毕
[分享] 安卓逆向课题之5, mobile spider get started. 两天高度集中学习, 承上启下的流程,a明白,b上手练.(5th完结)
[分享] 安卓逆向课题之6, mobile spider get started. Object的自动化动态分析和快速定位(笔记完毕)
[分享] 安卓逆向课题之7, mobile spider get started. 看电视直播App(未加固)去广告升级 (笔记待完善)
[分享] 安卓逆向课题之8, 真实App实操带壳App重打包去强制升级(部分抄袭别人笔记)(一次不完美的实践)
[讨论] Android Reverse Project No.9, "Types of App Security Protection, Identification and Handling Methods"
[原创] Android Reverse Project No.9, "Types of App Protection“ ---- Video Course


一些课后的 小结

1, app 地址挂了, 能完整还原的课程, 带着apk , 带着 作者是最好的价值.
2, app,挂了, 再也没有检测, 除非浮现, 抓包, 本地架设 web server ,就可以浮现. 学习需要持续性.

apk 安装自己校验自己.
jianshu.com/p/6f979deedf5b

picture 00


类是有生命周期的,如何长期不使用, 会被回收, 肉眼可见的绝对存在于内存中.
Jvm虚拟机是非常需要了解的. 非常高阶的内容.
域, instant, filds. 构造函数, 其实都是java , 如果你深入到art 虚拟机, 你的理解,就不一样了. 并不一定每个细节都要具体了解.
构造函数,方法体, 如何操作执行的, 知道这些流程, 大致是需要有的.

核心因素, hook 就是 api 上挂个钩子.
执行一遍,就会产生一遍,

GC kick in , Garbage collector , 垃圾收集器. 只要 gc 介入, 这个类就不见了.

程序员的自我修养.
脱壳, 后,函数体不见了, 代表, 脱壳不全.

三代壳, vmp ,dex2c, ollvm.

DEXDump直接运行 脱壳

1
2
3
adb shell
top
frida-ps -U | grep hello

picture 28

1
2
3
objection -g com.hello.qqc explore
pip3 install frida-dexdump
frida-dexdump

picture 27

picture 26

picture 1

picture 2

进程附加副死 attach 模式 fail (2023年已经不存附加模式,除非你下载老版本 )
picture 3

picture 25

多进程文件

picture 4

使用Frida 进入, 在用 Dexdump 脱掉,避免双进程 (spawn 模式)

grep -ril "MainActivity" 搜索MainActivity在哪个dex中

picture 29

搜索立即升级

picture 30

picture 6
picture 31

picture 7
picture 32

Objection快速自动化定位

捷径不通, 从开发的 角度定位问题 如何实现窗口弹出功能

https://www.jianshu.com/p/18e1f518c625

一 activity以窗口形式呈现

二 Android:将activity设置为弹出式的并设置为透明的

三 Dialog

1、如果是弹出的activity,可以hook所有的activities进行启动查看

1
android hooking list activities

picture 8
picture 33

1
android intent launch_activity cn.net.tokyo.ccg.ui.activity.AboutActivity

picture 34

查看一个函数能不能hook,可以将它所有的类打印出来,然后过滤,如果有则可以hook

1
2
android hooking list classes
cat .objection/objection.log |grep -i window

picture 9
picture 35

然后将这个类全部hook上.

1
objection -g com.xxx explore --startup-command "android hooking watch class android.view.Window"

picture 10

上钩

picture 11

当点击“立即升级”发现会立即跳出下图内容,说明与升级框相关

picture 12

2、尝试下dialog

1
cat .objection/objection.log |grep -i dialog

picture 13
picture 36

android.app.Dialog 也在里面

先hook看一下android.app.AlertDialog

1
android hooking watch class android.app.AlertDialog

发现点升级没有任何反应,故判断此API与升级框没关系

然后再尝试hook下android.app.Dialog看有没有反应

1
objection -g com.xxx explore --startup-command "android hooking watch class android.app.Dialog"

点击新版本框空白地方会出现

picture 14

点击“立即升级”出现

picture 16

查看 android 官方API

picture 15

看到存在android.app.Dialog.setCancelable (用返回键无法取消)

hook该方法

1
android hooking watch class_method android.app.Dialog.setCancelable --dump-args --dump-backtrace --dump-return

picture 17

可以看到上图被命中 ,白色标注的位置, 是他的包里面的内容 .

picture 18

picture 19

picture 20

picture 21

你的那个框怎么点击都不会消失

向上寻找

picture 37
picture 38
picture 22

找到一个升级的 UpdateDialogFragment.

向下寻找到
picture 39

picture 23

picture 24

这里是明文,所以很明显就可以判断定位的对错。如果关键字符串做了加密混淆,搜索大法也就无效了,可以使用wallbreaker内存可视化漫游,所见即所得。

Wallbreaker内存可视漫游

wallbreaker四种模式:

1
2
3
4
classdump 查看一个类的结构
classsearch 根据一个名字来找相应的类
objectsearch 查看一个类的实例内容
objectdump  查看对象的属性

使用objection加载Wallbreaker搜索值得怀疑的地方

1
2
plugin load /root/.objection/plugins/Wallbreaker
plugin wallbreaker objectsearch xxx.ui.fragment.dialog.UpdateDialogFragment

     1
picture 41

找到之后,打印该对象的属性

1
plugin wallbreaker objectdump --fullname 0x276a

看到xxx.bean.VersionBean$Version _a; => [0x2266]:

然后将其打印出来

1
plugin wallbreaker objectdump --fullname 0x2266

可以看到打印出的内容,与界面所展示的一致,验证了所见即所得原理。

picture 42

所见即所得的代码定位思路

定位完之后,我们继hookxxx.ui.fragment.dialog.UpdateDialogFragment

1
android hooking watch class xxx.ui.fragment.dialog.UpdateDialogFragment

可以看到调用栈 是从 xxx.ui.fragment.dialog.UpdateDialogFragment.b 过来的,
picture 43

打印调用栈, 上级调用者.

1
xxx.ui.fragment.dialog.UpdateDialogFragment.b

1
android hooking watch class_method xxx.ui.fragment.dialog.UpdateDialogFragment.b --dump-args --dump-backtrace --dump-return

picture 44
picture 45

根据上面的打印结果, 根据打印的结果看到

xxx.ui.fragment.dialog.UpdateDialogFragment.b是从xxx.ui.activity.MainActivity.a该类过来,然后定位该类,发现也是做了个条件判断。

picture 46

picture 47

picture 48

如何快速smali 定位

picture 51

接着我们进行修改代码去掉升级框并重打包,首先因为是带壳的APP,无法直接使用apktool进行反编译,不然壳也会被反编译为smali。所以我们使用apktool保留classes.dex文件进行解包,然后删除apk原有的classes.dex文件,并将脱壳后的classes.dex放入

修改源码重打包去强制升级

为两步走, 先替换脱壳的 dex, 再 修改 smali.

picture 49

1
2
apktool -s d xxx.apk
rm classes.dex

picture 50

按照文件大小重命名后放入该文件夹中

picture 52

搜索extends Application

picture 53

picture 54
picture 56

picture 55

测试可以成功运行后,我们接着反编译,搜索之前定位的类名含MainActivity的smali文件,编辑查找UpdateDialogFragment找到之后修改判断语句

1
2
3
apktool d xxxsigned.apk
tree -NCfhl |grep -i MainActivity
nano smali/cn/net/tokyo/ccg/ui/activity/MainActivity.smali

picture 59

picture 58

picture 57

改完之后回编译、签名、运行

1
2
apktool b xxxsigned2
jarsigner -verbose -keystore abc.keystore -signedjar xxxxxsigned-ok.apk xxxsigned2.apk abc.keystore

picture 60

picture 61


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2024-1-19 23:01 被calleng编辑 ,原因: 改变成次结构
收藏
点赞2
打赏
分享
最新回复 (8)
雪    币: 80
活跃值: (2521)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
calleng 2023-11-27 18:51
2
0
感谢参考:
程序元的自我修养
https://github.com/weaiken/ebook/blob/master/09_other/%E7%A8%8B%E5%BA%8F%E5%91%98%E8%87%AA%E6%88%91%E4%BF%AE%E5%85%BB.pdf
第八课、真实app去壳、去升级
https://blog.csdn.net/qq_37314468/article/details/129470479
带壳App去除强制升级
https://cloud.tencent.com/developer/article/1752451
雪    币: 19516
活跃值: (29191)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2023-11-28 10:04
3
1
感谢分享
雪    币: 874
活跃值: (963)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mb_iunhvspv 2023-11-28 10:37
4
1
牛啊,很nice
雪    币: 1744
活跃值: (8728)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
你瞒我瞒 2023-11-29 09:17
5
0
不知道为啥,收藏总比点赞多
雪    币: 80
活跃值: (2521)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
calleng 2023-12-31 19:53
6
0
内容还是比较满意。  只是明天就是 2024 年 1 月1 号。 绕了个大圈子,还是绕回来了。
雪    币: 80
活跃值: (2521)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
calleng 2024-1-2 07:28
7
0
雪    币: 80
活跃值: (2521)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
calleng 2024-1-2 07:29
8
0
frida 和 frida-tools 之间的对应关系
雪    币: 80
活跃值: (2521)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
calleng 2024-3-9 19:25
9
0
路过,回来看看自己的足迹????
游客
登录 | 注册 方可回帖
返回