首页
论坛
课程
招聘
[原创]Virtual Andriod Debug X86 模拟器专用调试器
2019-2-1 17:23 17044

[原创]Virtual Andriod Debug X86 模拟器专用调试器

2019-2-1 17:23
17044

最新版下载地址 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  


[看雪官方培训] Unicorn Trace还原Ollvm算法!《安卓高级研修班》2021年6月班开始招生!!

最后于 2020-4-20 01:51 被刘彬编辑 ,原因:
收藏
点赞11
打赏
分享
打赏 + 11.00
打赏次数 2 金额 + 11.00
 
赞赏  陌上君   +10.00 2019/04/03 厉害,好东西,支持,#89要是有个所有一键断所有子程序就爽了
赞赏  Editor   +1.00 2019/02/01 精品文章~赞!果断收藏
最新回复 (49)
雪    币: 178
活跃值: 活跃值 (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ming_ 活跃值 2019-2-1 17:37
2
0
牛比
雪    币: 15739
活跃值: 活跃值 (14113)
能力值: (RANK:75 )
在线值:
发帖
回帖
粉丝
Editor 活跃值 2019-2-1 17:58
3
0
感谢分享!
雪    币: 8900
活跃值: 活跃值 (310)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xJJuno 活跃值 2019-2-1 18:33
4
0
必须支持...
雪    币: 1210
活跃值: 活跃值 (388)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
Tennn 活跃值 5 2019-2-1 18:43
5
0
支持一个 
雪    币: 188
活跃值: 活跃值 (95)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
唐某某 活跃值 2019-2-1 19:23
6
0
这个要支持了。
雪    币: 3544
活跃值: 活跃值 (169)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wbzloveme 活跃值 2019-2-1 22:26
7
0
支持一个.牛
雪    币: 8362
活跃值: 活跃值 (305)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
无边 活跃值 2019-2-2 00:36
8
0
QQ群 516805632 -- 查无此群。。。
雪    币: 455
活跃值: 活跃值 (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
刘彬 活跃值 2019-2-2 04:51
9
0
无边 QQ群 516805632 -- 查无此群。。。
奇怪 群号没错,不知道怎么被屏蔽了
雪    币: 26
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
邓dg 活跃值 2019-2-2 08:42
10
0
雪    币: 1822
活跃值: 活跃值 (741)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Vn小帆 活跃值 2019-2-2 09:16
11
0
支持
雪    币: 7383
活跃值: 活跃值 (524)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tDasm 活跃值 2019-2-2 10:02
12
0
看起来很强,年后测试一下怎么样。
谢谢提供这么好的东东
雪    币: 53
活跃值: 活跃值 (69)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Zkeleven 活跃值 2019-2-2 11:26
13
0
雪    币: 14700
活跃值: 活跃值 (897)
能力值: ( LV12,RANK:389 )
在线值:
发帖
回帖
粉丝
会飞的鱼油 活跃值 5 2019-2-2 15:58
14
0
感谢分享
雪    币: 61
活跃值: 活跃值 (497)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
龙飞雪 活跃值 2019-2-2 16:44
15
0
顶一个,想法不错
雪    币: 14
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
心如芷水 活跃值 2019-2-2 18:03
16
0
厉害,支持!!
雪    币: 220
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
IceExt 活跃值 2019-2-2 18:04
17
0
如果是基于libhoudini.so 可能是有局限性的。
雪    币: 455
活跃值: 活跃值 (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
刘彬 活跃值 2019-2-2 18:33
18
0
IceExt 如果是基于libhoudini.so 可能是有局限性的。
比如呢?
雪    币: 129
活跃值: 活跃值 (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
冰雪冬樱 活跃值 2019-2-2 19:00
19
0
很强
雪    币: 2393
活跃值: 活跃值 (58)
能力值: ( LV9,RANK:145 )
在线值:
发帖
回帖
粉丝
青蛙mage 活跃值 2019-2-2 19:13
20
0
牛逼
雪    币: 220
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
IceExt 活跃值 2019-2-2 19:36
21
0
刘彬 比如呢?
比如一开始是解释执行,然后会jit方式执行。jit后就不会再对应arm代码了。如果强制用解释执行,会很慢。所以暂时觉得这种方式就是个玩具。
雪    币: 4188
活跃值: 活跃值 (620)
能力值: ( LV11,RANK:194 )
在线值:
发帖
回帖
粉丝
堂前燕 活跃值 1 2019-2-2 19:45
22
0
强的一批
雪    币: 455
活跃值: 活跃值 (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
刘彬 活跃值 2019-2-2 19:51
23
0
IceExt 比如一开始是解释执行,然后会jit方式执行。jit后就不会再对应arm代码了。如果强制用解释执行,会很慢。所以暂时觉得这种方式就是个玩具。
可以区域强行解析
雪    币: 7383
活跃值: 活跃值 (524)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tDasm 活跃值 2019-2-3 09:42
24
0
IceExt 比如一开始是解释执行,然后会jit方式执行。jit后就不会再对应arm代码了。如果强制用解释执行,会很慢。所以暂时觉得这种方式就是个玩具。
应该是你没有看懂?这个主要是用来调试ARM的so文件。在x86模拟器跑arm代码一般都是解释执行arm指令。
“基于libhoudini 技术开发的,可以在X86模拟器 动态调试 ARM Native层”
雪    币: 16
活跃值: 活跃值 (72)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hhhaiai 活跃值 2019-2-3 14:50
25
0
6666
游客
登录 | 注册 方可回帖
返回