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

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

2022-10-9 15:47
11130

初学安卓安全,记一次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反调试网上说的很多方法都比较老或者不适用高版本安卓了。原理不怎么复杂,看没人发过,就记录下。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2022-10-10 16:50 被xxxlion编辑 ,原因:
收藏
免费 7
支持
分享
最新回复 (7)
雪    币: 435
活跃值: (2641)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
2
学习了
2022-10-10 09:32
0
雪    币: 1657
活跃值: (924)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
学习了
2022-10-21 12:36
0
雪    币: 15
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
活到老学到老
2022-10-21 15:33
0
雪    币: 763
活跃值: (4923)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
5
夜航星 学习了
活捉大佬
2022-10-21 15:54
0
雪    币: 2334
活跃值: (10386)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我发现很多修改源码的帖子,都不会告诉读者他们修改的是那个系统版本的源码。头疼。
2023-1-10 14:32
0
雪    币: 486
活跃值: (1227)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
你瞒我瞒 我发现很多修改源码的帖子,都不会告诉读者他们修改的是那个系统版本的源码。头疼。
我改的是安卓12,内核5.10-168
2023-5-31 17:02
0
游客
登录 | 注册 方可回帖
返回
//