梆梆&爱加密java反调试绕过

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

在将梆梆&爱加密脱壳之后通过AS调试APP遇到反调试挂载失败(只是hook未脱壳的APP,手机上安装的也是未脱壳的原始APP,hook dump dex出来之后直接反编译成smali通过AS动态调试是可行的),只要debug便会杀掉APP进程

Dalvik虚拟机下的反调试绕过

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

 

获取libdvm.so

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

static main(void)
{
  auto fp, begin, end, dexbyte;
  fp = fopen("D:\\dump.so", "wb");
  begin = 0x786A0000;
  end = begin + 0x67000 ;
  for ( dexbyte = begin; dexbyte < end; dexbyte ++ )
      fputc(Byte(dexbyte), fp);
}

小小脚本,不成敬意

比较libdvm.so

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

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

_Z12dvmDbgActivev是java调试相关函数,主要功能是啥我也不是很清楚,有清楚的大佬希望可以留言告知一下,万分感谢。dvmDbgActive(_Z12dvmDbgActivev),Java附加调试,就会触发调用此函数,“全局变量gDebuggerActive”的值,这个值正是_Z12dvmDbgActivev函数来设置的

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

Hook libdvm.so

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

# -*- coding: utf-8 -*-
import frida
import sys

def on_message(message, data):
    print(message)

redv = frida.get_remote_device()
session = redv.attach("com.sf.activity")

src = """
    var jnibind1 = undefined;
    var jnibind2 = undefined;
    var jnibind3 = undefined;
    var jnibind4 = undefined;
    var jnibind5 = undefined;
    var jnibind6 = undefined;
    var jnibind7 = undefined;
    var f = Module.findBaseAddress("libdvm.so");
    console.log("address: " + f);
    jnibind1 = f.add(0x000423C0);
    var p1P = new NativePointer(jnibind1);
    aryBuffer1 = Memory.readByteArray(p1P, 16);
    console.log(aryBuffer1);
    var vArray = [0x0D,0x4B,0x0E,0x4A,0x7B,0x44,0x10,0xB5,0x9C,0x58,0x94,0xF8,0xC6,0x33];
    Memory.writeByteArray(p1P, vArray);
    var p1P = new NativePointer(jnibind1);
    aryBuffer1 = Memory.readByteArray(p1P, 16);
    console.log(aryBuffer1);

"""
script = session.create_script(src)
script.on("message", on_message)
script.load()
sys.stdin.read()

frida hook之后结果

反调试已经绕过啦!!!

 

Art虚拟机下的反调试绕过

获取libart.so

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

比较libart.so

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

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

_ZN3art3Dbg8GoActiveEv函数功能同Dalvik中_Z12dvmDbgActivev函数功能类似,绕过方法与Dalvik保持一致。

Hook libart.so

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

# -*- coding: utf-8 -*-
import frida
import sys

def on_message(message, data):
    print(message)

redv = frida.get_remote_device()
session = redv.attach("com.sf.activity")

src = """
    var jnibind1 = undefined;
    var jnibind2 = undefined;
    var jnibind3 = undefined;
    var jnibind4 = undefined;
    var jnibind5 = undefined;
    var jnibind6 = undefined;
    var jnibind7 = undefined;
    var f = Module.findBaseAddress("libart.so");
    console.log("address: " + f);
    jnibind1 = f.add(0x00115BC4);
    var p1P = new NativePointer(jnibind1);
    aryBuffer1 = Memory.readByteArray(p1P, 16);
    console.log(aryBuffer1);
    var vArray = [0x2D, 0xE9, 0xF0, 0x4F, 0x9B, 0xB0, 0xDF, 0xF8, 0xBC, 0x0D, 0xDF, 0xF8, 0xBC, 0x1D];
    Memory.writeByteArray(p1P, vArray);
    var p1P = new NativePointer(jnibind1);
    aryBuffer1 = Memory.readByteArray(p1P, 16);
    console.log(aryBuffer1);

"""
script = session.create_script(src)
script.on("message", on_message)
script.load()
sys.stdin.read()

#总结


这里再简述一下反调试的原理,壳APP通过Hook libdvm.so&libart.so中的_Z12dvmDbgActivev&_ZN3art3Dbg8GoActiveEv函数,使其跳转到自己写的函数中执行kill操作导致无法调试。Java附加调试,就会触发调用此函数,“全局变量gDebuggerActive”的值,这个值正是_Z12dvmDbgActivev函数来设置的。目前在脱壳之后遇到java反调试,皆可用对比libdvm.so&libart.so寻找差异点将其修复绕过反调试,感兴趣的大佬可以通过其他被hook的函数研究加固或者函数抽取的原理。

注意不同的机器,对应的字节码是不一样的。

&lt;think&gt;好的,用户想了解如何对Android Studio中的应用进行脱壳处理,需要教程、方法和工具。首先,我得回忆一下之前提供的引用内容,特别是引用1到3提到的内容,里面提到了动态调试apk的条件、Smalidea插件、Smali Support、FRIDA脱壳工具,以及一些加壳工具的信息。 用户的问题是关于脱壳的,所以需要先解释什么是脱壳。然后,分步骤讲解如何配置环境,比如安装Android Studio、相关插件,以及使用工具如FRIDA。可能需要详细说明每一步的操作,比如如何反编译apk,如何定位脱壳点,以及具体使用哪些工具进行脱壳。 还要注意引用中的前提条件,比如需要懂Smali语法,知道如何下断点,以及处理签名校验的问题。这些都需要在回答中提到,提醒用户需要注意的事项。此外,引用3提到市面上有各种加壳工具,所以脱壳方法可能因加壳方式不同而有所差异,可能需要说明常见的脱壳手段。 需要确保回答结构清晰,分步骤讲解,并推荐相关工具。同时,生成相关问题时要围绕脱壳的可能后续问题,比如工具比较、常见错误处理、加壳类型识别等。还要检查是否符合格式要求,比如行内公式用$...$,独立公式单独成段,但这个问题可能涉及较少数学公式,所以可能不需要太多LaTeX内容,但需要确保中文回答和正确引用标识。&lt;/think&gt;### Android Studio应用脱壳处理教程 #### 一、脱壳基本原理 Android应用脱壳指从加密(加壳)的APK中提取原始代码,常见加壳工具如梆梆加密等通过代码混淆、动态加载等技术保护核心逻辑[^3]。脱壳核心在于定位内存中解密后的DEX文件或SO库。 #### 二、环境配置 1. **工具准备**: - Android Studio(最新版) - Smalidea插件(用于Smali调试)[^1] - FRIDA框架(动态注入脱壳)[^2] - Apktool/Jadx(反编译工具) 2. **模拟器配置**: - 使用Android Studio创建x86架构模拟器(兼容性更好) - 关闭SELinux:`adb shell setenforce 0` #### 三、操作步骤 1. **反编译APK** 使用Apktool解包: ```bash apktool d target.apk -o output_dir ``` 通过`Jadx`查看初步反编译代码,识别加壳特征(如`ProxyApplication`类)。 2. **动态调试配置** - 导入反编译的Smali代码到Android Studio - 在`AndroidManifest.xml`入口类下断点 - 使用`adb forward tcp:8700 jdwp:&lt;pid&gt;`连接进程 3. **内存Dump脱壳** 通过FRIDA注入脚本捕获解密后的DEX: ```javascript Java.perform(() =&gt; { const DexFile = Java.use(&#39;dalvik.system.DexFile&#39;); DexFile.$init.overload(...).implementation = function(...) { const result = this.$init(...); dumpMemory(this.mCookie); // 自定义内存导出函数 return result; } }); ``` 此方法可绕过部分动态加载壳[^2]。 4. **修复与验证** - 使用`dexfixer`修复DEX头 - 通过`Jadx`验证脱壳后代码可读性 #### 四、工具对比 | 工具 | 适用场景 | 优缺点 | |------------|--------------------------|--------------------------| | FRIDA | 动态脱壳/高级对抗壳 | 需编写脚本,灵活性高 | | Xposed | 静态Hook脱壳 | 兼容性差,易被检测 | | DumpDex | 内存抓取通用DEX | 简单但对抗新壳能力弱 | #### 五、注意事项 - **签名校验处理**:部分APK会校验签名,需先使用`SignApk`重签名 - **反调试检测**:通过`ptrace`或`frida-server`改名绕过 - **多DEX处理**:关注`MultiDex.install()`加载点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值