入门学习逆向的个人笔记,预览(欢迎探讨)
[原创] 肉丝的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
类是有生命周期的,如何长期不使用, 会被回收, 肉眼可见的绝对存在于内存中.
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
|
1 2 3 | objection - g com.hello.qqc explore
pip3 install frida - dexdump
frida - dexdump
|
进程附加副死 attach 模式 fail (2023年已经不存附加模式,除非你下载老版本 )
多进程文件
使用Frida 进入, 在用 Dexdump 脱掉,避免双进程 (spawn 模式)
grep -ril "MainActivity" 搜索MainActivity在哪个dex中
搜索立即升级
Objection快速自动化定位
捷径不通, 从开发的 角度定位问题 如何实现窗口弹出功能
https://www.jianshu.com/p/18e1f518c625
一 activity以窗口形式呈现
二 Android:将activity设置为弹出式的并设置为透明的
三 Dialog
1、如果是弹出的activity,可以hook所有的activities进行启动查看
1 | android hooking list activities
|
1 | android intent launch_activity cn.net.tokyo.ccg.ui.activity.AboutActivity
|
查看一个函数能不能hook,可以将它所有的类打印出来,然后过滤,如果有则可以hook
1 2 | android hooking list classes
cat .objection / objection.log |grep - i window
|
然后将这个类全部hook上.
1 | objection - g com.xxx explore - - startup - command "android hooking watch class android.view.Window"
|
上钩
当点击“立即升级”发现会立即跳出下图内容,说明与升级框相关
2、尝试下dialog
1 | cat .objection / objection.log |grep - i dialog
|
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"
|
点击新版本框空白地方会出现
点击“立即升级”出现
查看 android 官方API
看到存在android.app.Dialog.setCancelable (用返回键无法取消)
hook该方法
1 | android hooking watch class_method android.app.Dialog.setCancelable - - dump - args - - dump - backtrace - - dump - return
|
可以看到上图被命中 ,白色标注的位置, 是他的包里面的内容 .
你的那个框怎么点击都不会消失
向上寻找
找到一个升级的 UpdateDialogFragment.
向下寻找到
这里是明文,所以很明显就可以判断定位的对错。如果关键字符串做了加密混淆,搜索大法也就无效了,可以使用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 | plugin wallbreaker objectdump - - fullname 0x276a
|
看到xxx.bean.VersionBean$Version _a; => [0x2266]:
然后将其打印出来
1 | plugin wallbreaker objectdump - - fullname 0x2266
|
可以看到打印出的内容,与界面所展示的一致,验证了所见即所得原理。
所见即所得的代码定位思路
定位完之后,我们继hookxxx.ui.fragment.dialog.UpdateDialogFragment
1 | android hooking watch class xxx.ui.fragment.dialog.UpdateDialogFragment
|
可以看到调用栈 是从 xxx.ui.fragment.dialog.UpdateDialogFragment.b 过来的,
打印调用栈, 上级调用者.
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
|
根据上面的打印结果, 根据打印的结果看到
xxx.ui.fragment.dialog.UpdateDialogFragment.b是从xxx.ui.activity.MainActivity.a该类过来,然后定位该类,发现也是做了个条件判断。
如何快速smali 定位
接着我们进行修改代码去掉升级框并重打包,首先因为是带壳的APP,无法直接使用apktool进行反编译,不然壳也会被反编译为smali。所以我们使用apktool保留classes.dex文件进行解包,然后删除apk原有的classes.dex文件,并将脱壳后的classes.dex放入
修改源码重打包去强制升级
为两步走, 先替换脱壳的 dex, 再 修改 smali.
1 2 | apktool - s d xxx.apk
rm classes.dex
|
按照文件大小重命名后放入该文件夹中
搜索extends Application
测试可以成功运行后,我们接着反编译,搜索之前定位的类名含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
|
改完之后回编译、签名、运行
1 2 | apktool b xxxsigned2
jarsigner - verbose - keystore abc.keystore - signedjar xxxxxsigned - ok.apk xxxsigned2.apk abc.keystore
|
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2024-1-19 23:01
被calleng编辑
,原因: 改变成次结构