返回
详解Unidbg模拟执行某段子so一:构建框架
Android
2023-12-31 18:56:46
引言
Unidbg是一个功能强大的Android沙箱,可以模拟执行Android应用和so文件。它可以用于逆向分析、安全研究、漏洞挖掘等领域。
目标
本文的目标是使用Unidbg模拟执行某段子App的so文件,并分析其签名计算方法。
步骤
1. 环境准备
首先,你需要准备以下环境:
- Unidbg
- Android SDK
- Java JDK
- Android so文件
2. 搭建Unidbg框架
- 创建一个新的Unidbg项目。
- 导入Android SDK和Java JDK。
- 将Android so文件复制到项目的assets目录下。
3. 加载so文件
- 在Unidbg项目中创建一个类,用于加载so文件。
- 使用Unidbg提供的
Emulator
类加载so文件。
4. 调用so文件中的方法
- 在Unidbg项目中创建一个类,用于调用so文件中的方法。
- 使用Unidbg提供的
Value
类和Function
类调用so文件中的方法。
5. 分析签名计算方法
- 使用Unidbg提供的
Trace
类跟踪so文件中的方法调用。 - 分析签名计算方法的逻辑,并找到签名计算的算法。
实例
下面以某段子App的签名计算方法为例,详细介绍如何使用Unidbg模拟执行so文件并分析签名计算方法。
1. 环境准备
首先,你需要准备以下环境:
- Unidbg 0.9.1
- Android SDK 29
- Java JDK 11
- 某段子App版本5.5.10的so文件
2. 搭建Unidbg框架
- 创建一个新的Unidbg项目。
- 导入Android SDK和Java JDK。
- 将某段子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的使用技巧,以便更好地进行逆向分析和安全研究。