版本:我测试过 10.0.0到11.0.2都是可以的,应该再高一些版本也是通用的
本文主要记录unidbg的搭建可以打包jar,如果后期有时间再出一版加密分析&定位
现在很多APP的加密逻辑都是在so层了,大大提高了逆向的难度,如果要在so层还原出纯加密代码难度还是不小的(当然一些传统的加密算法且特征比较明显的是比较简单的)。unidbg其中的作用之一就可以模拟调用so,也就是模拟 JNI 调用 API,以便可以调用 JNI_OnLoad。unidbg还有其他很多特色,是一个非常不错的逆向利器,具体这里就不展开,本人目前研究也不深
搭建Unidbg
把demo跑通
把https://github.com/zhkl0228/unidbg/tree/master 把这个项目代码clone下来,跑通如下例子,就说明没问题了
我是在这个项目的基础上修改了一些结构的,也增加了不少其他APP
建立模拟环境
public xxSign() {
emulator = AndroidEmulatorBuilder.for32Bit().setProcessName("com.xxx.app").build();
Memory memory = emulator.getMemory(); // 模拟器的内存操作接口
memory.setLibraryResolver(new AndroidResolver(23));// 设置系统类库解析
vm = emulator.createDalvikVM(new File("加载apk文件")); // 创建Android虚拟机
new AndroidModule(emulator,vm).register(memory);
vm.setJni(this);
vm.setVerbose(true);// 设置是否打印Jni调用细节
// 自行修改文件路径,loadLibrary是java加载so的方法
DalvikModule dm = vm.loadLibrary(new File("加载so文件"), false); // 加载libcms.so到unicorn虚拟内存,加载成功以后会默认调用init_array等函数
dm.callJNI_OnLoad(emulator);// 手动执行JNI_OnLoad函数
module = dm.getModule();// 加载好的libcms.so对应为一个模块
}
以上是建立模拟器、加载apk和so,这基本都是一样的
参照其中的demo在项目自己新建一个java文件,先把模拟环境这一步跑起来,确认没问题。(很多时候都是从模仿开始的,模仿多了自然就会)
调用 JNI,获取方法的返回值
ublic String getSign(String functionId, String uuid, String body,String version) {
DvmClass cBitmapkitUtils = vm.resolveClass("com/xxxxx");
StringObject ret = cBitmapkitUtils.callStaticJniMethodObject(emulator, methodSign,
vm.resolveClass("android/content/Context").newObject(null),
functionId,
body,
uuid,
"android",
version);
return ret.getValue();
}
补环境
接下来就补环境,缺啥补啥
搭建Api-Server
我在前面提到这个项目增加了Spring Boot,以便爬虫可以直接调用
项目结构:
增加路由
测试api
没问题!
打包jar
参考:https://blog.youkuaiyun.com/weixin_51111267/article/details/131610580
如果安装jpype失败,可以在这里下载whl文件来安装,https://github.com/jpype-project/jpype/releases
测试jar包
测试搜索接口
两种方式都是可以的