SO逆向入门实战教程五:qxs

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

一、前言

久违了,这是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&timestamp=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
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值