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

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

2023-11-27 18:37
7584

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

[原创] 肉丝的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快速自动化定位

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

ddcK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2B7K9h3q4F1M7$3S2#2i4K6u0W2j5$3!0E0i4K6u0r3M7q4)9J5c8U0p5^5k6e0q4X3y4e0p5^5j5K6j5J5y4b7`.`.

一 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编辑 ,原因: 改变成次结构
收藏
免费 4
支持
分享
最新回复 (10)
雪    币: 45
活跃值: (3699)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢参考:
程序元的自我修养
b26K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6%4k6h3q4A6K9$3g2F1i4K6u0r3k6h3u0G2L8$3E0Q4x3V1k6T1L8r3!0T1i4K6u0r3L8h3q4K6N6r3g2J5i4K6u0r3x3o6W2Q4y4h3k6G2N6r3S2W2M7W2)9J5c8W2)9J5y4f1f1%4i4K6t1#2b7e0S2Q4x3U0f1^5b7W2)9J5y4f1f1#2i4K6t1#2b7V1q4Q4x3U0f1^5c8W2)9J5y4f1f1#2i4K6t1#2z5e0q4Q4x3U0f1&6z5q4)9J5y4f1f1^5i4K6t1#2z5o6N6Q4x3U0g2m8b7g2)9J5y4f1f1$3i4K6t1#2z5o6S2Q4x3U0f1&6x3g2)9J5y4f1f1@1i4K6t1#2b7V1k6Q4x3U0g2m8c8g2)9J5y4f1f1#2i4K6t1#2z5o6g2Q4x3U0g2n7b7W2)9J5k6i4m8V1k6R3`.`.
第八课、真实app去壳、去升级
c0aK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1L8r3!0Y4i4K6u0W2j5%4y4V1L8W2)9J5k6h3&6W2N6q4)9J5c8Y4q4I4i4K6g2X3x3K6M7K6x3e0b7@1y4U0S2Q4x3V1k6S2M7Y4c8A6j5$3I4W2i4K6u0r3k6r3g2@1j5h3W2D9M7#2)9J5c8U0p5J5z5e0b7%4x3o6b7%4z5b7`.`.
带壳App去除强制升级
b1fK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6U0L8r3!0#2k6q4)9J5k6i4c8W2L8X3y4W2L8Y4c8Q4x3X3g2U0L8$3#2Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0Q4x3V1k6S2M7Y4c8A6j5$3I4W2i4K6u0r3x3e0M7#2x3U0b7#2x3b7`.`.
2023-11-27 18:51
0
雪    币: 5531
活跃值: (31866)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢分享
2023-11-28 10:04
1
雪    币: 1910
活跃值: (2155)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
牛啊,很nice
2023-11-28 10:37
1
雪    币: 2860
活跃值: (11724)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不知道为啥,收藏总比点赞多
2023-11-29 09:17
0
雪    币: 45
活跃值: (3699)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
内容还是比较满意。  只是明天就是 2024 年 1 月1 号。 绕了个大圈子,还是绕回来了。
2023-12-31 19:53
0
雪    币: 45
活跃值: (3699)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
2024-1-2 07:28
0
雪    币: 45
活跃值: (3699)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
frida 和 frida-tools 之间的对应关系
2024-1-2 07:29
0
雪    币: 45
活跃值: (3699)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
路过,回来看看自己的足迹????
2024-3-9 19:25
0
雪    币: 72
活跃值: (527)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10

很实用,如果跟着实操一遍,收获很大,妈妈再也不用担心我找不到改哪里了

最后于 2024-5-31 11:41 被月清晖编辑 ,原因: 补充
2024-5-31 11:37
0
雪    币: 764
活跃值: (1967)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
哥,你的排版是真的乱
2024-5-31 11:46
0
游客
登录 | 注册 方可回帖
返回