shihuo sh-sign字段unidbg逆向
环境
app:6891
Java层
GDA搜索sh-sign
,
com.shizhi.shihuoapp.module.framework.b.a.h
cn.shihuo.modulelib.utils.bd.a
com.shihuo.shsecsdk.Enviroment.generateSign
可以看到是在libsh_security.so
入口分析
ida搜索java
,
没有我们要的generateSign
函数。搜索jni
,没有结果,说明没有动态注册。那就用frida_hook_libart
对libsh_security.so
的NewStringUTF
进行hook。
发现是在nativeParam
函数中生成的,说明最终是调用了nativeParam
函数。
固定参数
frida看看输入输出
function hook() {
var Env = Java.use("com.shihuo.shsecsdk.Enviroment");
Env.nativeParam.implementation = function(str) {
console.log(str);
var ret = this.nativeParam(str);
console.log(ret);
return ret;
}
}
function call_sign() {
var Env = Java.use("com.shihuo.shsecsdk.Enviroment");
var inst = Env.$new();
var str = "{name=everhu}";
inst.nativeParam(str);
}
unidbg实现
public class Shihuo extends AbstractJni {
private final AndroidEmulator emulator;
private final VM vm;
private final Module module;
public static String pkgName = "com.hupu.shihuo";
public static String apkPath = "unidbg-android/src/test/java/com/shihuo/shihuo6891.apk";
public static String soName = "sh_security";
public Shihuo() {
emulator = AndroidEmulatorBuilder.for32Bit().setProcessName(pkgName).build();
Memory memory = emulator.getMemory();
memory.setLibraryResolver(new AndroidResolver(23));
vm = emulator.createDalvikVM(new File(apkPath));
vm.setJni(this);
vm.setVerbose(true);
DalvikModule dm = vm.loadLibrary(soName, true);
module = dm.getModule();
}
public void call_sign() {
DvmClass clz = vm.resolveClass("com/shihuo/shsecsdk/Enviroment");
String methodSign = "nativeParam(Ljava/lang/String;)Ljava/lang/String;";
clz.callStaticJniMethodObject(emulator, methodSign, new StringObject(vm, "{name=everhu}"));
}
public static void main(String[] args) {
Shihuo test = new Shihuo();
test.call_sign();
}
}
直接出结果了。
逆向
看看nativeParam
看看汇编
emm,一时间不知道怎么修复。
从nativeParam
的汇编从上往下看,调用了哪些函数
sub_60D7C
看不出什么,继续往下翻
a1
应该是JNIEnv
,改改
继续看看
看起来是个关键的函数,搜索一下上面的magic number
,
看来应该是国密3算法了。下个断点看看输入
emulator.attach().addBreakPoint(module.base + 0x4F7C9);
没有拼接其他东西,找个在线SM3测一下
可以看到前32位就是sh-sign