文章目录
一、前言
久违了,这是SO逆向实战教程的第五篇,最近忙于即将开讲的Unidbg课程内容的设计,所以疏忽了博客的更新,这篇的重点是一个MD5的炫技操作,需要对哈希算法原理有较深理解,本篇中不讲算法原理(可以自己看文档,或者看我在SO基础课里对MD5算法的手算),不懂算法原理的话,看起来一头雾水。
- 侧重新工具、新思路、新方法的使用,算法分析的常见路子是Frida Hook + IDA ,在本系列中,会淡化Frida 的作用,采用Unidbg Hook + IDA 的路线。
- 主打入门,但并不限于入门,你会在样本里看到有浅有深的魔改加密算法、以及OLLVM、SO对抗等内容。
- 对样本的分析仅限于学习和研究,坚决抵制黑灰产。
- 一共十三篇,1-2天更新一篇。每篇的资料放在文末的百度网盘中。
二、准备

只有两个参数,context和明文,结果是一长串。
例:
input1:context
input2:r0ysue
输出:nonce=32DAB5DB-A036-4B83-8884-1E95A552C4B2×tamp=1623412271283&devicetoken=r0ysue&sign=5B0FF50A89C8704E3B3149A9E0EF2679
可以发现,输出的就是devicetoken,在输出中,有nonce和sign两个未知的键值对,timestamp应该就只是时间戳。
三、Unidbg模拟执行
package com.lession5;
import com.github.unidbg.AndroidEmulator;
import com.github.unidbg.Module;
import com.github.unidbg.linux.android.AndroidEmulatorBuilder;
import com.github.unidbg.linux.android.AndroidResolver;
import com.github.unidbg.linux.android.dvm.*;
import com.github.unidbg.memory.Memory;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;
public class qxs extends AbstractJni{
private final AndroidEmulator emulator;
private final VM vm;
private final Module module;
qxs() throws FileNotFoundException {
emulator = AndroidEmulatorBuilder.for32Bit().setProcessName("com.qxs").build(); // 创建模拟器实例,要模拟32位或者64位,在这里区分
final Memory memory = emulator.getMemory(); // 模拟器的内存操作接口
memory.setLibraryResolver(new AndroidResolver(23)); // 设置系统类库解析
vm = emulator.createDalvikVM(new File("unidbg-android\\src\\test\\java\\com\\lession5\\轻小说.apk")); // 创建Android虚拟机
vm.setVerbose(true); // 设置是否打印Jni调用细节
DalvikModule dm = vm.loadLibrary(new File("unidbg-android\\src\\test\\java\\com\\lession5\\libsfdata.so"), false); // 加载libttEncrypt.so到unicorn虚拟内存,加载成功以后会默认调用init_array等函数
module = dm.getModule(); //
// 先把JNI Onload跑起来,里面做了大量的初始化工作
vm.setJni(this);
dm.callJNI_OnLoad(emulator);
}
public static void main(String[] args) throws Exception {
qxs test = new qxs();
System.out.println(test.getSFsecurity());
}
public String getSFsecurity(){
List<Object> list = new ArrayList<>(10);
list.add(vm.getJNIEnv()); // 第一个参数是env
list.add(0); // 第二个参数,实例方法是jobject,静态方法是jclazz,直接填0,一般用不到。
Object custom = null;
DvmObject<?> context = vm.resolveClass("android/content/Context").newObj

本文介绍了一种使用Unidbg模拟执行来逆向分析Android SO文件中MD5加密算法的方法。通过Unidbg的hook和指令追踪功能,作者详细展示了如何从汇编指令中解析出MD5的输入和输出,从而还原整个加密过程。文章强调了这种方法在面对混淆和保护措施时的强大之处,并提供了资源链接供进一步学习。

1070

被折叠的 条评论
为什么被折叠?



