1. 安卓程序动态调试条件

安卓程序动态调试条件 ( 2个满足1个即可 ):

  • 1. 在 AndroidMainfest.xml ---> application 标签下,设置或者添加属性 android:debuggable="true"

  • 2. 系统默认模式,在 build.prop(boot.img),ro.debuggable=1

Android SDK 中有 android.os.debug 类提供了一个 isDebuggerConnected方法,用于判断 JDWP 调试器是否正在工作

2. Java层 的 反调试

示例:手动绕过百度加固 Debug.isDebuggerConnected 反调试的方法:
https://blog.csdn.net/QQ1084283172/article/details/78237571

**************************************************************************************************************

AndroidStudio调试smali 和 java 都是用的 jdwp 进行转发, IDA调试 so 用的是 tcp 转发

**************************************************************************************************************

JDWP 协议介绍

JDWP 是 Java Debug Wire Protocol 的缩写,它定义了调试器(debugger)和 被调试的 Java 虚拟机(target vm)之间的通信协议。JDWP 协议可以 远程 动态调试 Java 程序

JVM 自带有对这个协议相应的支持,通过命令 java -agentlib:jdwp=help 可以查看help文档。

说明一下 debuggertarget vm

  • Target vm 中运行着我们想要调试的程序,它与一般运行的 Java 虚拟机没有什么区别,只是在启动时加载了 Agent JDWP 从而具备了调试功能。
  • debugger 就是我们熟知的调试器,它向运行中的 target vm 发送命令来获取 target vm 运行时的状态和控制 Java 程序的执行。
  • Debuggertarget vm 分别在各自的进程中运行,他们之间的通信协议就是 JDWP

JDWP 与其他许多协议不同,它仅仅定义了数据传输的格式,但并没有指定具体的传输方式。这就意味着一个 JDWP 的实现可以不需要做任何修改就正常工作在不同的传输方式上(在 JDWP 传输接口中会做详细介绍)。

JDWP 是语言无关的。理论上我们可以选用任意语言实现 JDWP。然而我们注意到,在 JDWP 的两端分别是 target vm 和 debugger。Target vm 端,JDWP 模块必须以 Agent library 的形式在 Java 虚拟机启动时加载,并且它必须通过 Java 虚拟机提供的 JVMTI 接口实现各种 debug 的功能,所以必须使用 C/C++ 语言编写。而 debugger 端就没有这样的限制,可以使用任意语言编写,只要遵守 JDWP 规范即可。JDI(Java Debug Interface)就包含了一个 Java 的 JDWP debugger 端的实现(JDI 将在该系列的下一篇文章中介绍),JDK 中调试工具 jdb 也是使用 JDI 完成其调试功能的。

JDWP agent 在调试中扮演的角色

使用 JDWP 远程调试 java 程序:https://www.jianshu.com/p/4b322505087f

使用 JDWP 进行远程调试:https://blog.csdn.net/renfufei/article/details/52756556

3. so层 的 反调试(  JNI_OnLoad )

拿到一个 apk 分析步骤:首先先分析有没有加壳,如果没有加壳,使用 jadx-gui 打开自动反编译,并进行分析,如果有加壳,需要先脱壳,然后在进行分析。找到 入口点 或者 入口页面 进去查看分析。

IDA Pro 分析 so 库 JNI_OnLoad:https://www.bilibili.com/video/BV1UE411A7rW?p=69

AntiDebug 源码:https://github.com/weikaizhi/AntiDebug 。

github 下载完直接编译报错 ,所以使用 AndroidStudio 打开项目后需要做如下修改

  • 在 antidebug.cpp 中添加 #include <pthread.h>

  • AndroidManifest.xml 的 application 节点添加 android:debuggable=true

然后编译生成 apk,但是生成的 apk 是没有签名的,没法安装到手机或者模拟器上。

可以使用 AndroidStudio、apk上上签、AndroidKiller、安卓逆向助手等进行签名。这里使用 AndroidKiller 进行签名。。。

签名后就可以在手机或者模拟器上安装 apk 了。。。

源码中的反调试函数( 可以看到只检测了三个:状态、IsHookByXPosed、isBeDebug )

//反调试检测
MACRO_HIDE_SYMBOL void* AntiDebug::antiDebugCallback(void *arg)
{if(arg == NULL)return NULL;AntiDebug* pAntiDebug = (AntiDebug*)arg;while (true){try{bool bRet1 = pAntiDebug->readStatus();bool bRet2 = pAntiDebug->IsHookByXPosed();bool bRet3 = pAntiDebug->isBeDebug();if(bRet1 || bRet2 || bRet3){if(g_callbackRef != 0 && g_MethodCallback != 0){JNIEnv* env = GetEnv();if(env != NULL){env->CallVoidMethod(g_callbackRef, g_MethodCallback);}}}} catch (...){}sleep(1);}
}

当反调试被触发时,会出现一个弹窗,如图所示:

静态分析

下面使用 IDA Pro 进行 so 库的分析,解压 apk ,找到 so 文件

使用 IDA 打开,首先 Ctrl + s 搜索 段,看下 init_array 里面有没有函数,发现没什么有用的东东,继续在 Exports 里面搜索 java_ 和 jni,分析后发现 java_ 开头的静态注册函数也没有啥东东,所以分析 JNI_OnLoad 函数

源码中 JNI_OnLoad 函数

继续分析 sub_9C9C 这个函数。。。

方法 2:通过 IDA Pro 的 String 查看,看看有没有可疑的字符串。这种方法信息量比较多,还是推荐直接分析 JNI_OnLoad

源码中的反调试函数( 可以看到只检测了三个:状态、IsHookByXPosed、isBeDebug )

可以参看源码 和 so 理解反调试。。。。。

动态分析

参考:安卓逆向_17 --- 动态调试【 环境搭建、so库调试【动态普通、动态debug模式】、JNI_OnLoad调试分析、java_ 开头函数分析】:https://blog.csdn.net/freeking101/article/details/106701908

4. 示例

4.1 FindTracer.apk 过反调试 (  动态调试 JNI_OnLoad )

反调试:https://www.bilibili.com/video/BV1UE411A7rW?p=70

FindTracer 破解反调试:https://www.jianshu.com/p/a2b3517d4815

安装 apk,然后打开 app,没有被调试时,显示 Everything fine 。

首先看下 Java 层,使用 jadx-gui 反编译 apk,看下 Java 代码,查看 入口点、入口页面

可以看到 FindTracer.getInstance().findTracer()  就是检测反调试的代码,双击 findTracer() 函数,进入查看函数

可以看到是 native 函数,所以需要从 so 库入手。。。

IDA 打开 so 后( init_array 执行时间比 JNI_OnLoad 早,所以先分析 init_array,再分析 java_ 或者 jni_onload):

  • Ctrl + s ,找到 init_array,看下 init_array 里面有没有检测函数 ( 本例没有 )
  • 搜索 java_ 和 jni_onload,进行分析

4.2 自毁程序密码.apk (  动态调试 JNI_OnLoad )

APK文件下载链接: http://pan.baidu.com/s/1ntiKXg1 密码: 37xw

其中  AliCrackme_2.apk 是原安装包, signed.apk 是包含修改后so文件的安装包。

自毁程序密码(第二题)》分析( IDA 动态调试so ):https://www.pd521.com/thread-291-1-1.html

:https://www.bilibili.com/video/BV1UE411A7rW?p=71

安装 apk,然后打开 app 如图所示:

打开 app 后,直接出现如上图界面,这个就是 "入口页面"。首先还是从 Java 层开始,使用 jadx-gui 反编译 apk,看下 Java 代码,查看 入口点、入口页面。

入口页面代码:

可以看到如果 if 条件满足,则直接打开 ResultActivity 页面,通过查看 ResultActivity 页面的代码可知这个是成功后的页面

如果不满足,则弹出 "验证码校验失败",所以 if 里面的 securityCheck 函数就是检测反调试的。securityCheck 函数被 native 修饰,所以是在 so 里面实现的。同时 securityCheck 没有被 static 修饰。

使用 IDA 打开 crackme.so ---> Exports ---> 搜索 java_jni_onload ---> 分析C++ 函数

搜索 java_ 

securityCheck 函数只有一个 String 类型的参数,所以securityCheck对应的 java_ 开头的函数的第三个参数类型修改为 jstring

通过分析,没找到有用的东东,然后再 分析 jni_onload

搜索 jni_onload,发现也看不出什么有用的东东,

所以 动态调试 看下。(自毁程序密码:( IDA 动态调试so ):https://www.pd521.com/thread-291-1-1.html)

4.3 crackme (  动态调试 JNI_OnLoad )

分析类似 4.2 ,导入 jni.h 识别函数

:https://www.bilibili.com/video/BV1UE411A7rW?p=72

5. init_array 下断

:https://www.bilibili.com/video/BV1UE411A7rW?p=74

安卓逆向_21 --- Java层和so层的反调试( IDA 动态调试 JNI_OnLoad、init_array下断)相关推荐

  1. 安卓逆向之JAVA层静态分析(愤怒的小鸟去广告,充值破解)

    安卓逆向之JAVA层静态分析(愤怒的小鸟去广告,充值破解) 前言 今天女票跟我吐槽,自己闲来无事下个愤怒的小鸟玩玩,结果又是实名认证,又是广告啥的,瞬间没心情玩了,我听后大惊,还有这种事.跟女票说:& ...

  2. 安卓逆向_15( 三 ) --- Android NDK 开发【 jni 静态注册、JNI_OnLoad 动态注册】

    Android Studio开发JNI示例:https://blog.csdn.net/wzhseu/article/details/79683045 JNI_动态注册_静态注册.zip : http ...

  3. Android逆向之旅---Android中分析抖音和火山小视频的数据请求加密协议(IDA动态调试SO)

    一.前言 最近萌发了一个做app的念头,大致什么样的app先暂时不说,后面会详细介绍这个app的开发流程和架构,不过先要解决一些技术前提问题,技术问题就是需要分析解密当前短视频四小龙:抖音,火山,秒拍 ...

  4. 安卓逆向——初试动态调试apk_JEB动态调试

    文章目录 前言 一.工具 二.配置动态调试环境 Ⅰ.adb工具方面 Ⅱ.模拟器方面 三.审计代码.动态调试 Ⅰ.主代码审计 Ⅱ.追踪函数运行 完 前言 本文内容仅用于个人学习.研究或欣赏.通过使用本文 ...

  5. 未root手机 ida动态调试安卓so文件—— 学习实践 《教我兄弟学Android逆向09 IDA动态破解登陆验证》

    参考: https://www.52pojie.cn/thread-742686-1-1.html https://www.pianshen.com/article/6759779793 本文基本为h ...

  6. arm ida 伪代码 安卓 符号表_使用IDA动态调试及ARM指令学习笔记

    本文介绍如何用IDA进行动态调试及部分ARM指令的学习. 环境:已root的安卓手机一部,IDA pro 6.8,win7系统. 下载样本app,并已确认可调试(debuggable = true), ...

  7. 安卓逆向_4 --- Java 学习

    菜鸟教程 ----- Java 教程:https://www.runoob.com/java/java-tutorial.html 廖雪峰 ----- Java 教程:https://www.liao ...

  8. 安卓逆向-new-sec6-4 Java反射相关知识以及平头哥框架hook构造函数 | App发布测试版本感染

    反射机制 app加上这个属性,也能发布测试版本,被成功感染,无需签名和发布那个release版本 APP是E:\1A_androidstudio_project\course4 插件是E:\1A_an ...

  9. ida动态调试apk(so层)

    文章目录 查看所有设备 在IDA里面找到android_server(dbgsrv目录) 提权 运行android_server服务端进行监听 端口转发 打开DDMS:观察程序的端口号 打不开moni ...

最新文章

  1. 成功解决TypeError: ‘float’ object cannot be interpreted as an index
  2. 有理数的小数表示若无限,则必为无限循环的
  3. JavaFX给控件添加css样式
  4. 【Linux】一步一步学Linux——id命令(94)
  5. ubuntu 开启ssh_CS学习笔记 | 22、通过SSH开通通道
  6. 几种字符串到byte[] 数组转化为String 的方法
  7. java synchronized静态同步方法与非静态同步方法,同步语句块
  8. 如何感性地理解EM算法?
  9. ndk c调用java_使用NDK将Android转换为C,然后在C中调用Java函数
  10. 时钟分频中的计数值问题
  11. 【Python123】汽车迷
  12. 35岁后你的职场危机,你该何去何从
  13. 阿里工程师的1心1役!带你看遍“五彩斑斓的黑科技”
  14. 手写识别文字软件有哪些?看完你就知道了
  15. windows7、10磁盘分区以及磁盘扩展(详细教程以及注意事项)
  16. 红米note10和红米k40的区别 哪个好
  17. VS2010/VS 2008 代码界面设置护眼色豆沙绿
  18. python标签打印_Python 实现自动完成A4标签排版打印功能
  19. 鸿蒙实力等级划分,圣墟:三部曲中的等级划分下,荒天帝是否是全文最强者?...
  20. 百度联盟原负责人周品创办B2C网站

热门文章

  1. 论文浅尝 | 通过学习中间步骤的监督信号改进多跳知识库问答
  2. 论文浅尝 | 利用冻结语言模型的多模态少样本学习
  3. Windows上pip install kenlm报错解决
  4. 看完这篇Linux基本的操作就会了
  5. transformer 中的注意力机制和胶囊网络中的动态路由:它们在本质上或许具有相似性
  6. 论文学习14-End-to-End Relation Extraction using LSTMs on Sequences and Tree Structures(端到端实体关系抽取)
  7. SVN:安装svn进行上传和检出文件的常用命令
  8. CSS每日学习笔记(2)
  9. CreateFile
  10. sublime学习笔记