返回

详解Unidbg模拟执行某段子so一:构建框架

Android

引言

Unidbg是一个功能强大的Android沙箱,可以模拟执行Android应用和so文件。它可以用于逆向分析、安全研究、漏洞挖掘等领域。

目标

本文的目标是使用Unidbg模拟执行某段子App的so文件,并分析其签名计算方法。

步骤

1. 环境准备

首先,你需要准备以下环境:

  • Unidbg
  • Android SDK
  • Java JDK
  • Android so文件

2. 搭建Unidbg框架

  1. 创建一个新的Unidbg项目。
  2. 导入Android SDK和Java JDK。
  3. 将Android so文件复制到项目的assets目录下。

3. 加载so文件

  1. 在Unidbg项目中创建一个类,用于加载so文件。
  2. 使用Unidbg提供的Emulator类加载so文件。

4. 调用so文件中的方法

  1. 在Unidbg项目中创建一个类,用于调用so文件中的方法。
  2. 使用Unidbg提供的Value类和Function类调用so文件中的方法。

5. 分析签名计算方法

  1. 使用Unidbg提供的Trace类跟踪so文件中的方法调用。
  2. 分析签名计算方法的逻辑,并找到签名计算的算法。

实例

下面以某段子App的签名计算方法为例,详细介绍如何使用Unidbg模拟执行so文件并分析签名计算方法。

1. 环境准备

首先,你需要准备以下环境:

  • Unidbg 0.9.1
  • Android SDK 29
  • Java JDK 11
  • 某段子App版本5.5.10的so文件

2. 搭建Unidbg框架

  1. 创建一个新的Unidbg项目。
  2. 导入Android SDK和Java JDK。
  3. 将某段子App的so文件复制到项目的assets目录下。

3. 加载so文件

在Unidbg项目中创建一个名为SoLoader的类,用于加载so文件。代码如下:

import com.github.unidbg.Emulator;
import com.github.unidbg.LibraryResolver;
import com.github.unidbg.Module;
import com.github.unidbg.Symbol;

public class SoLoader {

    public static Module loadLibrary(Emulator emulator, String soName) {
        LibraryResolver resolver = emulator.createLibraryResolver();
        Module module = resolver.loadLibrary(emulator, soName);
        Symbol symbol = module.findSymbolByName("Java_com_ss_android_ugc_aweme_lancet_signature_SignatureLancet_getSignature_1");
        if (symbol == null) {
            throw new IllegalStateException("Failed to find symbol: Java_com_ss_android_ugc_aweme_lancet_signature_SignatureLancet_getSignature_1");
        }
        return module;
    }

}

4. 调用so文件中的方法

在Unidbg项目中创建一个名为SignatureCalculator的类,用于调用so文件中的方法。代码如下:

import com.github.unidbg.Emulator;
import com.github.unidbg.Module;
import com.github.unidbg.Pointer;
import com.github.unidbg.Value;

public class SignatureCalculator {

    public static String getSignature(Emulator emulator, Module module) {
        Value value = emulator.getJNIEnv().callStaticObjectMethod(module, "Java_com_ss_android_ugc_aweme_lancet_signature_SignatureLancet", "getSignature", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", Value.pointerToUtfString(emulator, "123456"), Value.pointerToUtfString(emulator, "douyin"));
        return value.getString(emulator);
    }

}

5. 分析签名计算方法

使用Unidbg提供的Trace类跟踪so文件中的方法调用。代码如下:

import com.github.unidbg.Emulator;
import com.github.unidbg.Module;
import com.github.unidbg.Trace;

public class SignatureAnalyzer {

    public static void analyzeSignature(Emulator emulator, Module module) {
        Trace trace = emulator.attach().traceBasicBlock();
        SignatureCalculator.getSignature(emulator, module);
        trace.dump(System.out);
    }

}

分析签名计算方法的逻辑,并找到签名计算的算法。代码如下:

public static void main(String[] args) {
    Emulator emulator = Emulator.newBuilder().setProcessName("com.ss.android.ugc.aweme").build();
    Module module = SoLoader.loadLibrary(emulator, "libdouyin.so");
    SignatureAnalyzer.analyzeSignature(emulator, module);
}

运行以上代码,即可分析某段子App的签名计算方法。

总结

本文详细介绍了如何使用Unidbg模拟执行Android so文件,并以某段子App的签名计算方法为例进行实战演示。希望本文能够帮助读者掌握Unidbg的使用技巧,以便更好地进行逆向分析和安全研究。