首页
社区
课程
招聘
[原创]梆梆&爱加密java反调试绕过
发表于: 2020-5-19 13:44 18092

[原创]梆梆&爱加密java反调试绕过

2020-5-19 13:44
18092

原文链接 梆梆&爱加密java反调试绕过

各位道友有没有在越过重重native反调试脱掉壳之后想要调试smali的过程中突然发现在使用AndroidStdio动态调试smali的时候只要一挂载APP就会崩溃,本篇主要整理一下在调试梆梆&爱加密过程中遇到的java层反调试以及绕过的方式

在将梆梆&爱加密脱壳之后通过AS调试APP遇到反调试挂载失败,只要debug便会杀掉APP进程

虽然Dalvik已经在逐步退出市场,但是这里还是由他开始,大家都知道Dalvik的核心库是libdvm.so,在调试的过程中与APP建立连接少不了对libdvm.so的引用,因此libdvm.so几乎是最有嫌疑的地方。

所谓获取libdvm.so需要获取APP未启动时libdvm.so源文件,这里只要去/system/lib目录下将其提取到本地即可。
其次需要加固APP运行时libdvm.so,这里我通过IDA动态挂载APP之后将其从内存中dump出来。

小小脚本,不成敬意

在获取到两个libdvm.so之后通过BeyondCompare进行比较

通过比较可以看出在加固的APP运行之后,libdvm.so被改了几部分数据,并不是所有修改的地方都和反调试有关,通过IDA对照便宜去看看都改了什么地方,最终发现与java调试相关的地址为0x423B0,当然其他地方也有一些小惊喜,比如梆梆&爱加密抽取函数所hook的函数什么的。

_Z12dvmDbgActivev是java调试相关函数,主要功能是啥我也不是很清楚,有清楚的大佬希望可以留言告知一下,万分感谢。

由此可见加固APP是通过hook _Z12dvmDbgActivev函数使其跳转到它自己构造的函数,并且在其中将进程kill掉防止调试。那么我们只要将Hook之后的libdvm.so再Hook修改为原始函数,让其正常运行_Z12dvmDbgActivev函数,就可以绕过反调试了。

这里通过frida hook _Z12dvmDbgActivev函数地址,打印内存,将原本函数正确内存数据写入对应地址中

frida hook之后结果

反调试已经绕过啦!!!

art虚拟机下的反调试绕过同上述的dalvik方法相同,只是关键的运行库libdvm.so替换为libart.so,同样要去/system/lib目录下将其提取到本地,这里需要注意的是在提取之前要确认运行的是libart.so还是libart64.so。

在获取到两个libart.so之后通过BeyondCompare进行比较

最终确认反调试Hook地址为0x10ABC4


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-5-19 15:59 被Night_elf编辑 ,原因:
收藏
免费 6
支持
分享
最新回复 (24)
雪    币: 145
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
学些了~
2020-5-19 14:13
0
雪    币: 239
活跃值: (552)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
感谢分享~
2020-5-19 14:21
0
雪    币: 15003
活跃值: (6213)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4

替换系统so,有这样的壳吗?按照你这个说法,没root的设备这个壳还运行不掉?梆梆和爱加密的壳都见识过没看到替换so只是hook

最后于 2020-5-19 14:39 被tDasm编辑 ,原因:
2020-5-19 14:37
0
雪    币: 1818
活跃值: (1321)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
5
tDasm 替换系统so,有这样的壳吗?按照你这个说法,没root的设备这个壳还运行不掉?梆梆和爱加密的壳都见识过没看到替换so只是hook
额,我没说是替换吧,so确实是被hook修改的,art那里所说的替换只是指Dalvik和Art核心so发生了改变,可能是我这边描述的不够清楚,抱歉
2020-5-19 14:59
0
雪    币: 15003
活跃值: (6213)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
Night_elf 额,我没说是替换吧,so确实是被hook修改的,art那里所说的替换只是指Dalvik和Art核心so发生了改变,可能是我这边描述的不够清楚,抱歉
那你就自相矛盾了。(在将梆梆&爱加密脱壳之后通过AS调试APP遇到反调试挂载失败)
如果只是hook,壳脱掉了反调试的hook就不存在了。除非该程序在加壳前就存在反调试,换句话说,这个反调试与壳无关。
2020-5-19 15:16
0
雪    币: 1818
活跃值: (1321)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
7
tDasm 那你就自相矛盾了。(在将梆梆&爱加密脱壳之后通过AS调试APP遇到反调试挂载失败) 如果只是hook,壳脱掉了反调试的hook就不存在了。除非该程序在加壳前就存在反调试,换句话说,这个反调试 ...
你说的那个意思是在脱壳并修复之后调试的情况吧,我这里调试的确实是未脱壳的APP,我说的脱壳只是说将dex还原出来在本地调试,并未修复整个APP,确实是描述有问题
2020-5-19 15:22
0
雪    币: 15003
活跃值: (6213)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
1、你文章中都是写修改libart.so、修改libdvm.so,任何人看了都以为你是替换so。你应该写hook libart.so或hook libdvm.so
2、脱壳后的dex,除非不需要修复否则都要修复才能运行的。即便不修复dex,也必须加载一个so才能hook系统so,你不至于还保留壳的so在apk里面吧?而且壳的so都是在壳的dex中加载,还没看到脱壳后dex中有加载壳的so的。
2020-5-19 15:41
0
雪    币: 42
活跃值: (286)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
修复个鬼呀,只是hook未脱壳之前的App,进行动态调试而已。frida native hook 用过没?
2020-5-19 15:45
0
雪    币: 1818
活跃值: (1321)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
10
tDasm 1、你文章中都是写修改libart.so、修改libdvm.so,任何人看了都以为你是替换so。你应该写hook libart.so或hook libdvm.so 2、脱壳后的dex,除非不需要修复 ...
1、你说的太对了,我准备去改改,接受批评
2、我只是hook未脱壳的APP,手机上安装的也是未脱壳的原始APP,dex脱出来之后直接反编译成samli通过AS动态调试是可行的,现在只是通过frida hook native修改被壳hook之后的libdvm&libart绕过反调试,感觉没啥毛病吧,表述的很清楚了
2020-5-19 15:52
0
雪    币: 7
活跃值: (268)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
这种思路不错呀,dump内存的数据进行对比就知道改动点
2020-5-19 21:55
0
雪    币: 977
活跃值: (435)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
12
get 新知识
2020-5-20 14:22
0
雪    币: 1467
活跃值: (626)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
get 新技能
2020-5-21 13:30
0
雪    币: 281
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
14
有个疑问?你这AS调试遇反调试挂载失败,app进程直接杀死。  IDA挂载同样的道理啊,也会反调,app进程直接杀死,你怎么能dump出app运行时的libart.so的呢
2020-5-21 14:06
0
雪    币: 3712
活跃值: (1441)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
15
作者的思路挺不错的,利用hook 原理。指向正确的加载流程地址,反调试原理其实就是判断“全局变量gDebuggerActive”的值,这个值正是文中_Z12dvmDbgActivev函数来设置的,至于原理看一下源码就很清楚了。
2020-5-21 18:55
0
雪    币: 924
活跃值: (120)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
16
大佬咨询一个问题,我用IDA调试的时候没法断在DexHelper.so加载的位置,一个线程一直异常got SIGABRT signal (Abort) (exc.code 6, tid 14289)。大佬知道是啥原因嘛
2020-5-22 15:52
0
雪    币: 1818
活跃值: (1321)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
17
机械皇帝 有个疑问?你这AS调试遇反调试挂载失败,app进程直接杀死。 IDA挂载同样的道理啊,也会反调,app进程直接杀死,你怎么能dump出app运行时的libart.so的呢
ida调试和这个反调试无关,可以正常挂载
2020-5-23 17:03
0
雪    币: 1818
活跃值: (1321)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
18
ghostfevil 大佬咨询一个问题,我用IDA调试的时候没法断在DexHelper.so加载的位置,一个线程一直异常got SIGABRT signal (Abort) (exc.code 6, tid 14289)。 ...
你加载so的过程中清空那些信号,应该不会崩了
2020-5-23 17:05
0
雪    币: 924
活跃值: (120)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
19
大佬  jnibind1 = f.add(0x00115BC4);这个里面的数值是ZN3art3Dbg8GoActiveEv这个函数的偏移嘛
2020-5-23 21:58
0
雪    币: 1818
活跃值: (1321)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
20
ghostfevil 大佬 jnibind1 = f.add(0x00115BC4);这个里面的数值是ZN3art3Dbg8GoActiveEv这个函数的偏移嘛
对,但是也要看你手机里libart实际便宜
2020-5-24 10:13
0
雪    币: 0
活跃值: (364)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
梆梆没脱壳之前frida的attach都会崩,这个咋hook - -
2020-6-1 15:56
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
22
大神,试试绕过娜迦加固的防反调。
2020-6-1 17:12
0
雪    币: 1365
活跃值: (3659)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
23
var vArray = [0x2D, 0xE9, 0xF0, 0x4F, 0x9B, 0xB0, 0xDF, 0xF8, 0xBC, 0x0D, 0xDF, 0xF8, 0xBC, 0x1D];
被hook前的函数地址是怎么找到的?
是这样? Module.getExportByName('libart.so','_ZN3art3Dbg8GoActiveEv');
2020-6-22 14:31
0
雪    币: 1818
活跃值: (1321)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
24
lanoche var vArray = [0x2D, 0xE9, 0xF0, 0x4F, 0x9B, 0xB0, 0xDF, 0xF8, 0xBC, 0x0D, 0xDF, 0xF8, 0xBC, 0x1D]; ...
对的
2020-6-23 08:43
0
雪    币: 1
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
25
黑色刺客 梆梆没脱壳之前frida的attach都会崩,这个咋hook - -
3年过去了,你是怎么解决这个问题的呢
2023-4-11 14:37
0
游客
登录 | 注册 方可回帖
返回
//