# 美图秀秀

直接用 charles 抓包,加密参数就应该是这个 sig

image-20220804190817096

直接搜 sig 返回太多参数,不利于分析,搜 sigVersion

image-20220804191944318

看到这里有 generator 的字段,猜测跟生成有关,进一步点进去看,发现最后调用了个 native 方法

hook 一下,看里面都是些什么东西

/*
    hook java 
    frida -U -l hook.js com.mt.mtxx.mtxx
*/
function hookso () {
    Java.perform(function(){
        console.log('hook start');
        var SigEntity = Java.use("com.meitu.secret.SigEntity");
		// 对应 string, byte [] ,string, object
        SigEntity.generatorSig.overload('java.lang.String', '[Ljava.lang.String;', 'java.lang.String', 'java.lang.Object').implementation = function (a, b, c, d) {
            console.log('SigEntity.generatorSig.a: ', a);
            console.log('SigEntity.generatorSig.b: ', b);
            console.log('SigEntity.generatorSig.c: ', c);
            console.log('SigEntity.generatorSig.d: ', d);
            var res = this.generatorSig(a, b, c, d);
            console.log('SigEntity.generatorSig.res: ', res.sig.value);
            return res;
        }
    })
}
setImmediate(hookso)

image-20220804212317793

参数解释

  • a: 可以写死
  • b: 时间戳,日期,ip,设备信息等
  • c: 固定字符串
  • d: 固定信息 (应该是决定数据来源的)

通过观察,这个结果很像 md5,接下来就进去 so 中看逻辑

image-20220804213410042

这里有点骚的是,它把 so 包名隐藏了一下

image-20220804215414627

这里有个 generatorSIG,点进去看,发现有 md5

image-20220804215445419

估计大差不差是 md5 加密了,也可以上 frid

# unidbg

直接先跑一下模板

package com.xiayu.meituxiuxiu;
import com.github.unidbg.AndroidEmulator;
import com.github.unidbg.Emulator;
import com.github.unidbg.Module;
import com.github.unidbg.debugger.BreakPointCallback;
import com.github.unidbg.debugger.Debugger;
import com.github.unidbg.debugger.DebuggerType;
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.linux.android.dvm.array.ArrayObject;
import com.github.unidbg.linux.android.dvm.array.ByteArray;
import com.github.unidbg.memory.Memory;
import unicorn.ArmConst;
import java.io.File;
import java.io.IOException;
import java.security.MessageDigest;
public class GetSig_v9080Test extends AbstractJni {
    private final AndroidEmulator emulator;
    private final Module module;
    private final VM vm;
    public String apkPath = "F:\\unidbg\\unidbg-android\\src\\test\\java\\com\\mtxx\\meitu.apk";
    public String soPath2 = "F:\\unidbg\\unidbg-android\\src\\test\\java\\com\\mtxx\\librelease_sig.so";
    GetSig_v9080Test() {
        emulator = AndroidEmulatorBuilder.for32Bit().build();
        final Memory memory = emulator.getMemory();
        memory.setLibraryResolver(new AndroidResolver(23));
        vm = emulator.createDalvikVM(new File(apkPath));
        vm.setVerbose(true);
        vm.setJni(this);
        DalvikModule dm2 = vm.loadLibrary(new File(soPath2), true);
        dm2.callJNI_OnLoad(emulator);
        module = dm2.getModule();
    }
    public static void main(String[] args) {
        GetSig_v9080Test getSig = new GetSig_v9080Test();
        getSig.destroy();
    }
    private void destroy() {
        try {
            emulator.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

发现抛出缺少 so 文件的错误。

image-20220805134939256

直接在构造函数中补上另一个 so

DalvikModule dm1 = vm.loadLibrary(new File(soPath1), true);
 dm1.callJNI_OnLoad(emulator);
 DalvikModule dm2 = vm.loadLibrary(new File(soPath2), true);
 dm2.callJNI_OnLoad(emulator);
 module = dm2.getModule();

接下来直接调用 call 方法

image-20220807212448966

点进去,发现其实是少了很多

@Override
    public DvmObject<?> getStaticObjectField(BaseVM vm, DvmClass dvmClass, String signature) {
        switch (signature) {
            case "android/app/ActivityThread->sPackageManager:Landroid/content/pm/IPackageManager;":{
                return vm.resolveClass("android/content/pm/IPackageManager").newObject(null);
            }
        };
        return super.getStaticObjectField(vm, dvmClass, signature);
    }

直接方法里加入上述代码,接着运行,又抛出错误,从堆栈中看

image-20220807212842407

这里发现,他是这个 dvmClass 类缺少 getSuperclass 方法所导致,点进去

image-20220807213020044

可以看到,这里其实是初始化的时候缺少的 (vm.resolveClass

image-20220807215451155

这里看到,对于传递多个参数,那么这个 superClass 就对应的是 interfaceClasses 中第 0 个

然后根据调用顺序,这里 GetSuperClass 出问题,归根到底,是上面的 GetStaticObjectField 调用,导致的原生 superClass 不存在所引出的问题,其实也就是我们上一步补的返回值出了点问题。

return vm.resolveClass("android/content/pm/IPackageManager",   vm.resolveClass("Landroid/content/pm/IPackageManager")).newObject(null)

接下来运行,发现报了个 UnsupportedOperationException 的异常

Edited on

Give me a cup of [coffee]~( ̄▽ ̄)~*

Mr2 WeChat Pay

WeChat Pay