# 美图秀秀
直接用 charles 抓包,加密参数就应该是这个 sig
直接搜 sig 返回太多参数,不利于分析,搜 sigVersion
看到这里有 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) |
参数解释
- a: 可以写死
- b: 时间戳,日期,ip,设备信息等
- c: 固定字符串
- d: 固定信息 (应该是决定数据来源的)
通过观察,这个结果很像 md5,接下来就进去 so 中看逻辑
这里有点骚的是,它把 so 包名隐藏了一下
这里有个 generatorSIG,点进去看,发现有 md5
估计大差不差是 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 文件的错误。
直接在构造函数中补上另一个 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 方法
点进去,发现其实是少了很多
@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); | |
} |
直接方法里加入上述代码,接着运行,又抛出错误,从堆栈中看
这里发现,他是这个 dvmClass 类缺少 getSuperclass 方法所导致,点进去
可以看到,这里其实是初始化的时候缺少的 (vm.resolveClass
这里看到,对于传递多个参数,那么这个 superClass 就对应的是 interfaceClasses 中第 0 个
然后根据调用顺序,这里 GetSuperClass
出问题,归根到底,是上面的 GetStaticObjectField
调用,导致的原生 superClass 不存在所引出的问题,其实也就是我们上一步补的返回值出了点问题。
return vm.resolveClass("android/content/pm/IPackageManager", vm.resolveClass("Landroid/content/pm/IPackageManager")).newObject(null) |
接下来运行,发现报了个 UnsupportedOperationException 的异常