首页
社区
课程
招聘
[原创]【从源码过反调试】一、安卓12过IsDebuggerConnected检测
2022-10-9 15:47 9855

[原创]【从源码过反调试】一、安卓12过IsDebuggerConnected检测

2022-10-9 15:47
9855

初学安卓安全,记一次android 12的过isDebuggerConnected反调试过程。

 

函数在native层有两处实现,未附加调试器时用的是这个函数
图片描述
附加jdb后被替换为这个函数
图片描述

 

所以在ida 调试的时候,在libart.so中找到的是图1的函数,实际上在jdb附加后并不会走。我没找到图2的符号......
理论上方法挺多的
1:frida在java层劫持这个android.os.Debug.isDebuggerConnected,返回false。应该是最方便的方法了,但是每次重新调试都要改,还要依赖frida。
2:找到java方法对应的native函数地址,或者映射关系。找到实际的函数地址下断点。
3:修改源码过反调试。
其实还有静态patch,写artloader劫持jni的方式

 

我最后还是选择了3,修改源码。编译源码,刷机搞了好久...

 

失败的尝试
先是直接改了 external/oj-libjdwp/src/share/back/vmDebug.c 的
VMDebug_isDebuggerConnected(JNIEnv* env, jclass klass)
让其返回false,但是发现waiting for debugger窗口关不掉。后来发现原因是waitForDebugger函数也是会调用isDebuggerConnected检测调试器是否附加, 因为让其永远返回false,所以这里不会return,它会认为一直没附加调试器,所以等待调试窗口关不掉。
图片描述

 

成功的方式
修改安卓sdk调用的isDebuggerConnected 函数的实现,让其直接返回false,并且伪造一个真正的isDebuggerConnectedReal函数提供给waitForDebugger函数使用。
图片描述
再修改下引用这个函数的地方:
图片描述

 

重新编译、刷机,发现调试恢复正常了,反调试也过了。虽然这种反调试比较好过,但是牵扯的东西还是不少的。再往外延伸思考下,frida提供动态hook的平台,伪装sdk接口实现 做的事情其实是相同的。

 

初学安卓,花费时间比较多在环境搭建、源码编译上。过isDebuggerConnected反调试网上说的很多方法都比较老或者不适用高版本安卓了。原理不怎么复杂,看没人发过,就记录下。


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

最后于 2022-10-10 16:50 被xxxlion编辑 ,原因:
收藏
点赞7
打赏
分享
最新回复 (7)
雪    币: 130
活跃值: (2051)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
FANGG3 2022-10-10 09:32
2
0
学习了
雪    币: 1657
活跃值: (924)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
夜航星 2022-10-21 12:36
3
0
学习了
雪    币: 15
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_毛 球♐️ 2022-10-21 15:33
4
0
活到老学到老
雪    币: 633
活跃值: (4630)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
三一米田 2 2022-10-21 15:54
5
0
夜航星 学习了
活捉大佬
雪    币: 1720
活跃值: (8676)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
你瞒我瞒 2023-1-10 14:32
6
0
我发现很多修改源码的帖子,都不会告诉读者他们修改的是那个系统版本的源码。头疼。
雪    币: 488
活跃值: (1146)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
xxxlion 2023-5-31 17:02
7
0
你瞒我瞒 我发现很多修改源码的帖子,都不会告诉读者他们修改的是那个系统版本的源码。头疼。
我改的是安卓12,内核5.10-168
雪    币: 2222
活跃值: (2609)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
gaoweb 2023-5-31 17:45
8
0
游客
登录 | 注册 方可回帖
返回