分析sign
查壳
frida -U --no-pause -f com.sina.oasis -l frida_fart_hook.js
fart脱壳
dex拖入gda,搜索sign
可疑处
objection -g com.sina.oasis explore
android hooking watch class_method g.a.c.g.c.a --dump-args --dump-return --dump-backtrace
hook后确定
查看b.c方法
unidbg分析s
得到s地址
Java.perform(function(){
console.log('dddd')
// frida有个类加载器,遍历
Java.enumerateClassLoaders({
onMatch: function(loader){
// 每次匹配到,都要把匹配到的赋值给java默认的loader
Java.classFactory.loader = loader;
var TestClass;
// 没报错就hook到了,报错了就hook下一个,如果全都报错了,没打印东西,那可能就是hook错了。
try{
var ByteString=Java.use("com.android.okhttp.okio.ByteString");
TestClass = Java.use("com.weibo.xvideo.NativeApi");
TestClass.s.implementation = function(p1,p2){
console.log('decrypt p1:'+ByteString.of(p1).utf8())
//console.log('decrypt p1:'+ByteString.of(p1).hex())
var ret = this.s(p1, p2);
console.log(' ret value is ' + ret);
return ret;
}
}catch(error){
if(error.message.includes("ClassNotFoundException")){
console.log(" You are trying to load encrypted class, trying next loader");
}
else{
console.log(error.message);
}
}
},
onComplete: function(){
}
})
})
hook得到s方法的参数
package com.lession1;
// 导入通用且标准的类库
import com.github.unidbg.linux.android.dvm.AbstractJni;
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.linux.android.dvm.array.ByteArray;
import com.github.unidbg.memory.Memory;
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
// 继承AbstractJni类
public class oasis extends AbstractJni{
private final AndroidEmulator emulator;
private final VM vm;
private final Module module;
oasis() {
// 创建模拟器实例,进程名建议依照实际进程名填写,可以规避针对进程名的校验
emulator = AndroidEmulatorBuilder.for32Bit().setProcessName("com.sina.oasis").build();
// 获取模拟器的内存操作接口
final Memory memory = emulator.getMemory();
// 设置系统类库解析
memory.setLibraryResolver(new AndroidResolver(23));
// 创建Android虚拟机,传入APK,Unidbg可以替我们做部分签名校验的工作
vm = emulator.createDalvikVM(new File("unidbg-android\\src\\test\\java\\com\\lession1\\lvzhou.apk"));
//
// vm = emulator.createDalvikVM(null);
// 加载目标SO
DalvikModule dm = vm.loadLibrary(new File("unidbg-android\\src\\test\\java\\com\\lession1\\liboasiscore.so"), true); // 加载so到虚拟内存
//获取本SO模块的句柄,后续需要用它
module = dm.getModule();
vm.setJni(this); // 设置JNI
vm.setVerbose(true); // 打印日志
dm.callJNI_OnLoad(emulator); // 调用JNI OnLoad
};
public static void main(String[] args) {
oasis test = new oasis();
System.out.println(test.getS());
}
public String getS(){
// args list
List<Object> list = new ArrayList<>(10);
// arg1 env
list.add(vm.getJNIEnv());
// arg2 jobject/jclazz 一般用不到,直接填0
list.add(0);
// arg3 bytes
String input = "aid=01A473pZlavYi9CJI6IMLY4L-xUQYEu73CSOa3IRh9wMRCLN8.&cfrom=28B5295010&cuid=0&noncestr=95pe1F1Ut3BAbZ4yDf34v997NMb14d&phone=17826073456&platform=ANDROID×tamp=1695886023318&ua=vivo-V1916A__oasis__3.5.8__Android__Android9&version=3.5.8&vid=1021604472715&wm=20004_90024";
byte[] inputByte = input.getBytes(StandardCharsets.UTF_8);
ByteArray inputByteArray = new ByteArray(vm,inputByte);
list.add(vm.addLocalObject(inputByteArray));
// arg4 ,boolean false 填入0
list.add(0);
// 参数准备完成
// call function
Number number = module.callFunction(emulator, 0xC365, list.toArray());
String result = vm.getObject(number.intValue()).getValue().toString();
return result;
}
}
运行unidbg,与hook得到结果一致