第八课、真实app去壳、去升级
1、去壳
- 1
frida-dexdump -U -f com.hello.qqc
全自动去壳 - 2
grep -ril "MainActivity"
搜索MainActivity
在哪个dex中
2、快速定位
- 1 objection hook弹窗的几种方式
- window
- dialog
- 2
android hooking watch class android.app.Dialog
查看源码进行尝试hook - 3 随便点击后发现被调用 大概是这个类 下面就是回溯调用栈
(agent) Hooking android.app.Dialog.setCancelable(boolean)
设置不可取消的api
- 4
hook
这个方法看看调用栈android hooking watch class_method android.app.Dialog.setCancelab
le --dump-args --dump-backtrace --dump-return
- 结合静态jadx代码进行分析
3、内存可视化漫游
-
不确定找到的位置是不是要找的地方
- 加载wallbreaker 回溯代码
plugin load /root/.objection/plugins/Wallbreaker
-
plugin wallbreaker classdump 看一个类的结构 plugin wallbreaker classsearch 根据一个名字找一个接近的类 plugin wallbreaker objectdump 看对象的实例的内容 plugin wallbreaker objectsearch 找一个对象实例
-
plugin wallbreaker objectsearch cn.net.tokyo.ccg.ui.fragment.dialog.Update DialogFragment [0x1dca]: UpdateDialogFragment{372b25e #1 UpdateDialogFragment}
-
可见即可得 得到内存地址
-
-
dump出这个实例
plugin wallbreaker objectdump --fullname 0x1dca
- 继续dump
cn.net.tokyo.ccg.bean.VersionBean$Version a
这个实例对象 - 找到确定就是这个代码的位置
-
android hooking watch class cn.net.tokyo.ccg.ui.fragment.dialog.UpdateDial
ogFragment
看看调用栈- 调用了b
-
目标是不要让这个窗口起来 就是看b代码逻辑让窗口不起来
-
查看b的调用栈代码
-
android hooking watch class_method cn.net.tokyo.ccg.ui.fragment.dialog.Upd
ateDialogFragment.b --dump-args --dump-backtrace --dump-return
-
发现是从MainActivity过来的
-
找到这个参数是versionbean的重载
-
@Override // b.a.a.a.d.b.z public void a(VersionBean.Version version, boolean z) { this.f1696a = version.url; if (version != null) { UpdateDialogFragment.b(version, z).show(getSupportFragmentManager(), UpdateDialogFragment.class.getSimpleName()); } }
-
修改这部分代码即可
-
4、定位代码思路
5、修改源码实现
- 1、apktool 解包
- 2、替换dex 修改文件名
- 3、重打包 签名
- 4、apktool 再次解包 修改smile代码
- 5、重打包 签名