首页
论坛
专栏
课程

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

2019-2-1 17:23 6403

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

2019-2-1 17:23
6403

前言:   

     首先,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  



[推荐]看雪企服平台,提供安全分析、定制项目开发、APP等级保护、渗透测试等安全服务!

最后于 2019-2-2 07:15 被刘彬编辑 ,原因:
上一主题 下一主题
打赏 + 11.00
打赏次数 2 金额 + 11.00
收起 
赞赏  陌上君   +10.00 2019/04/03 厉害,好东西,支持,#89要是有个所有一键断所有子程序就爽了
赞赏  Editor   +1.00 2019/02/01 精品文章~赞!果断收藏
最新回复 (40)
ming_ 2019-2-1 17:37
2
0
牛比
Editor 2019-2-1 17:58
3
0
感谢分享!
xJJuno 2019-2-1 18:33
4
0
必须支持...
Tennn 5 2019-2-1 18:43
5
0
支持一个 
唐某某 2019-2-1 19:23
6
0
这个要支持了。
wbzloveme 2019-2-1 22:26
7
0
支持一个.牛
无边 2019-2-2 00:36
8
0
QQ群 516805632 -- 查无此群。。。
刘彬 2019-2-2 04:51
9
0
无边 QQ群 516805632 -- 查无此群。。。
奇怪 群号没错,不知道怎么被屏蔽了
邓dg 2019-2-2 08:42
10
0
Vn小帆 2019-2-2 09:16
11
0
支持
tDasm 2019-2-2 10:02
12
0
看起来很强,年后测试一下怎么样。
谢谢提供这么好的东东
Zkeleven 2019-2-2 11:26
13
0
会飞的鱼油 4 2019-2-2 15:58
14
0
感谢分享
龙飞雪 2019-2-2 16:44
15
0
顶一个,想法不错
心如芷水 2019-2-2 18:03
16
0
厉害,支持!!
IceExt 2019-2-2 18:04
17
0
如果是基于libhoudini.so 可能是有局限性的。
刘彬 2019-2-2 18:33
18
0
IceExt 如果是基于libhoudini.so 可能是有局限性的。
比如呢?
冰雪冬樱 2019-2-2 19:00
19
0
很强
青蛙mage 2019-2-2 19:13
20
0
牛逼
IceExt 2019-2-2 19:36
21
0
刘彬 比如呢?
比如一开始是解释执行,然后会jit方式执行。jit后就不会再对应arm代码了。如果强制用解释执行,会很慢。所以暂时觉得这种方式就是个玩具。
堂前燕 2019-2-2 19:45
22
0
强的一批
刘彬 2019-2-2 19:51
23
0
IceExt 比如一开始是解释执行,然后会jit方式执行。jit后就不会再对应arm代码了。如果强制用解释执行,会很慢。所以暂时觉得这种方式就是个玩具。
可以区域强行解析
tDasm 2019-2-3 09:42
24
0
IceExt 比如一开始是解释执行,然后会jit方式执行。jit后就不会再对应arm代码了。如果强制用解释执行,会很慢。所以暂时觉得这种方式就是个玩具。
应该是你没有看懂?这个主要是用来调试ARM的so文件。在x86模拟器跑arm代码一般都是解释执行arm指令。
“基于libhoudini 技术开发的,可以在X86模拟器 动态调试 ARM Native层”
hhhaiai 2019-2-3 14:50
25
0
6666
爱吃菠菜 1 2019-2-3 21:48
26
0
看起来很牛逼
铭天星 2019-2-4 13:25
27
0
强的一逼
葫芦娃 1 2019-2-6 22:49
28
0
666啊,没想到真的有人花精力把这个实现了
天缺 2019-2-6 23:33
29
0
这个就厉害了
拜膜kx大佬 2019-2-8 02:42
30
0
无边 QQ群 516805632 -- 查无此群。。。
有啊
白菜大哥 2019-2-8 11:52
31
0
这意思,是不是支持硬件断点?
刘彬 2019-2-10 02:35
32
0
白菜大哥 这意思,是不是支持硬件断点?
支持硬件断点,有问题群里小窗
alphc 2019-3-3 09:10
33
0
太强了,感谢分享
cmputer 2019-3-3 10:42
34
0
牛逼啊,刚刚看到
koflfy 1 2019-3-3 18:51
35
0
mark
JoenChen 3 2019-3-3 20:50
36
0
往大里面搞啊, 搞成熟!!!
xxRea 2019-3-29 10:09
37
0
哇,真的是强大!!
ucantseeme 2019-4-2 16:02
38
0
太牛逼了,加个群向大佬学习一下
铭天星 2019-4-2 17:24
39
0
期待mac os x版
陌上君 2019-4-3 10:24
40
0
厉害,好东西,支持,#89要是有个所有一键断下某so所有子程序就爽了,那些动态注册JNI函数就比较好找了
coolsnake 2019-4-7 19:03
41
0
顶一个
游客
登录 | 注册 方可回帖
返回