最新版下载地址 www.vadebug.cn
如果使用中遇到问题请加群联系群主!
欢迎反馈bug
前言:
首先,android系统 权限分为3级
1.普通权限:通过捆绑进程,把目标APP跟自己的程序 捆绑为一个进程,实现进程内 内存读写 例:VirtualAPP
2.ROOT 权限:可以通过 Ptrace 远程读写内存,调试等。
3.R0权限(驱动权限或内核权限),android内核驱动可以直接编译进内核,也可以动态加载。获得这个权限后,R3 的反调试基本等于纸。不过成本也是极高的,首先需要手机厂商提供BOOTLOAD 解锁,并提供内核源码。据我所知,好像就只有google 跟 小米(老款) 提供。源码有120G左右(科学上网下120G,哎,都是泪,最初我以为只有十几G扩充了4次虚拟机),对应型号找驱动,编译,然后再刷入。所以 这个方法 通用性很差,可能刷成砖,可能找不到源码,可能无法编译。
随着手机越来越私密化,用户对手机安全性的需求极高,这就导致了厂家根本不给 root 权限。更不要说内核源码。
关于ARM 硬件断点
首先ARM是支持硬件断点的,之所以IDA GDB 硬件断点无效的原因,是因为 内核编译默认只有X86 可以使用,原因未知,修改内核代码确实可以实现支持硬件断点。GDB可以断下,IDA 的AS 依旧没法使用。
那么有没有一种简单的方法解决这些问题,可以直接拿到R0 权限去调试呢。之前没有,今天开始有了。。感觉颠覆了什么,很厉害的样子。。。
关于Virtual Andriod Debug
VAD 是基于libhoudini 技术开发的,可以在X86模拟器 动态调试 ARM Native层。跟真机没有任何区别,并且支持硬件断点。调试过程没有使用 ptrace函数。所以可以无脑过一些检测。(目前只支持雷电3.28,安装包在附件)
1.相比于真机调试,模拟器更为方便,不担心中毒、据金钱泄露,中毒几秒即可恢复。
2.修改空间大,可以轻松的hook内核。反反调试。
3.省钱,至少省去了一部调试手机的钱。
这个软件是完全免费的,没有加任何验证。现在也只是一个雏形,离我心中的东西差的挺远的。
我测试调试的软件并不多,对于需求也在摸索,很多BUG估计也没测试出来。欢迎大家随时反馈。
邮箱:1035933881@qq.com
测试环境 win7x64
后续,打算逐步开放插件,脚本等 功能呢 以及一些资料。
java 动态调试也在日程。
是个很大的工程,但是觉得很有意义,我会拿出业余时间长期更新。
程序是我个人开发的,
作者 清纯的蜡笔小新
QQ群 516805632
参考使用前辈的文章和源码。 以下是名单
CSDN 作者 ariesjzj
github 作者 ele7enxxh
反汇编引擎 capstone
汇编引擎 keystone
调试例子
1.打开雷电模拟器,安装2048小程序(程序在附件),打开VAD ,点启动服务
2.弹窗点确定
下面是动态调试部分。。数据可以动态修改。
例2
调试一个U3D 游戏并拿到解密后的脚本,游戏 lmcn_v1.87(名字不能说,程序在附件,为什么调试它,因为他很流氓的自己安装到我的模拟器上了,报复的就是这么赤裸)
解压
lmcn_v1.87 打开 lib 。看到libmono.so 典型性的U3D游戏。
拖入IDA 在导出函数 搜索 mono_image_open_from_data_with_name
.text:0010F988 EXPORT mono_image_open_from_data_with_name
.text:0010F988 mono_image_open_from_data_with_name ; CODE XREF: mono_assembly_open_from_bundle+94↑p
.text:0010F988 ; mono_image_open_from_data_full+14↓p
.text:0010F988 ; DATA XREF: ...
.text:0010F988 ; __unwind {
.text:0010F988 STMFD SP!, {R4-R10,LR}
.text:0010F98C MOV R7, R0
.text:0010F990 LDR R5, [SP,#0x24]
.text:0010F994 MOV R6, R1
.text:0010F998 MOV R9, R2
.text:0010F99C MOV R8, R3
.text:0010F9A0 CMP R5, #0
.text:0010F9A4 LDR R10, [SP,#0x20]
.text:0010F9A8 BEQ loc_10F9E8
.text:0010F9AC LDR R1, =(aAssemblyCsharp - 0x10F9BC)
.text:0010F9B0 MOV R0, R5
.text:0010F9B4 ADD R1, PC, R1 ; "Assembly-CSharp.dll" <如果加载函数为 csharp 就解密 下面是解密流程
.text:0010F9B8 BL strstr
.text:0010F9BC CMP R0, #0
.text:0010F9C0 BEQ loc_10F9E8
.text:0010F9C4 MOV R1, R6
.text:0010F9C8 MOV R0, R7
.text:0010F9CC BL getKey
.text:0010F9D0 LDR R2, =(aMomoKeyD - 0x10F9E0)
.text:0010F9D4 MOV R1, #0x20 ; ' '
.text:0010F9D8 ADD R2, PC, R2 ; "momo: key = %d\n"
.text:0010F9DC MOV R3, R0
.text:0010F9E0 MOV R0, #0
.text:0010F9E4 BL g_log
.text:0010F9E8
.text:0010F9E8 loc_10F9E8 ; CODE XREF: mono_image_open_from_data_with_name+20↑j
.text:0010F9E8 ; mono_image_open_from_data_with_name+38↑j
.text:0010F9E8 CMP R6, #0
.text:0010F9EC CMPNE R7, #0
.text:0010F9F0 BNE loc_10FA08
.text:0010F9F4 CMP R8, #0
.text:0010F9F8 MOVNE R3, #3
.text:0010F9FC STRNE R3, [R8]
.text:0010FA00
.text:0010FA00 loc_10FA00 ; CODE XREF: mono_image_open_from_data_with_name+F0↓j
.text:0010FA00 ; mono_image_open_from_data_with_name+12C↓j
.text:0010FA00 MOV R0, #0
.text:0010FA04 LDMFD SP!, {R4-R10,PC}
.text:0010FA08 ; ---------------------------------------------------------------------------
.text:0010FA08
.text:0010FA08 loc_10FA08 ; CODE XREF: mono_image_open_from_data_with_name+68↑j
.text:0010FA08 CMP R9, #0
.text:0010FA0C BNE loc_10FA84
.text:0010FA10
.text:0010FA10 loc_10FA10 ; CODE XREF: mono_image_open_from_data_with_name+11C↓j
.text:0010FA10 MOV R0, #0x368
.text:0010FA14 BL g_malloc0
.text:0010FA18 CMP R5, #0
.text:0010FA1C LDRB R3, [R0,#0x10]
.text:0010FA20 MOV R4, R0
.text:0010FA24 STR R7, [R0,#8]
.text:0010FA28 BFI R3, R9, #1, #1
.text:0010FA2C STR R6, [R0,#0xC]
.text:0010FA30 STRB R3, [R0,#0x10]
.text:0010FA34 BEQ loc_10FAB8
.text:0010FA38 MOV R0, R5
.text:0010FA3C BL g_strdup
.text:0010FA40
.text:0010FA40 loc_10FA40 ; CODE XREF: mono_image_open_from_data_with_name+140↓j
.text:0010FA40 STR R0, [R4,#0x14]
.text:0010FA44 MOV R0, #0x18C
.text:0010FA48 BL g_malloc0
.text:0010FA4C LDRB R12, [R4,#0x10]
.text:0010FA50 MOV R3, #1
.text:0010FA54 MOV R1, R8
.text:0010FA58 BFI R12, R10, #3, #1
.text:0010FA5C MOV R2, R3
.text:0010FA60 STR R3, [R4]
.text:0010FA64 STRB R12, [R4,#0x10]
.text:0010FA68 STR R0, [R4,#0x2C]
.text:0010FA6C MOV R0, R4
.text:0010FA70 BL do_mono_image_load <解密完成后加载编译
.text:0010FA74 CMP R0, #0
.text:0010FA78 BEQ loc_10FA00
.text:0010FA7C LDMFD SP!, {R4-R10,LR}
.text:0010FA80 B register_image
思路
.text:0010F9B4 ADD R1, PC, R1 ; "Assembly-CSharp.dll"
.text:0010F9B8 BL strstr <断这里 看加载数据名字,找到后
.text:0010FA70 BL do_mono_image_load 断这里
打开 模拟器 ->打开VAD->启动服务-.勾选调试启动->打开游戏->链接
游戏启动黑屏,证明中断正常
找到 MONO 地址
text:0010F9B8 BL strstr 偏移
C800000+10F9B8 =C90F9B8 STR要中断的地址
在IDA 代码段 按ALT+G value =0 是arm 模式 value=1 是 thumb 模式
在VAD 代码段 按G
然后 F10 让程序跑起来(启动中断F10,自己中断按F9)
中断成功。然后复制R0 到数据段按G跳转 。看到加载的数据 。发现并不是目标。
然后在C90FB8 的位置 按F4.直到找到目标
目标找到 然后我们让他 解密,运行到 加载编译的地址
.text:0010FA6C MOV R0, R4
.text:0010FA70 BL do_mono_image_load <F4 到这里
ARM 是通过寄存器传入参数的,所以R0 就是第一个结构参数,参数是 image* 这个结构体 可以参照 MONO 源码。
换算一下就是
PTR=0x9C800000
LEN=0x0064A000
然后我们在代码段 右键 dump
等待进度条跑完
把dump 下来的文件 直接拖入 dnspy
解密OK……
提前给大家拜个年!!!
链接: https://pan.baidu.com/s/1bmQ9BbBwRf8SwgDwEYi9sg 提取码: 7fbs
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界
最后于 2020-4-20 01:51
被刘彬编辑
,原因: