目前不少 App 的加密签名算法都在so文件中,强行逆向so的话可能会消耗大量时间和资源。<br>以前用 xposed 采用 hook 的方法从程序计算签名,可是须要模拟器或者真机运行这个应用,使用效率不高。<br>也用过 jtype 启动JVM,而后经过 native 对so文件进行调用,由于每次都须要启动JVM,因此效率也不高。<br>unidbg 他不须要运行 app,也无需逆向 so 文件,经过在 app 中找到对应的 JNI 接口,而后用 unicorn 引擎直接调用 so 文件,因此效率相对要高很多。java
unidbg特色
- 模拟JNI调用API,能够调用JNI_OnLoad
- 支持JavaVM,JNIEnv
- 模拟系统调用
- 支持ARM32和ARM64
- 内联钩子(Inline Hook)
- Android import hook
- iOS 的一些hook工具 fishhook and substrate and whale hook
- 支持简单的控制台调试器,gdb存根,实验性IDA android调试器服务器,指令跟踪,内存读/写跟踪
- 支持iOS objc和Swift
unidbg环境配置
unidbg下载连接: https://github.com/zhkl0228/unidbg<br>IntelliJ IDEA可用于编辑unidbg源<br><br>下载完成以后示导入到 IDEA 中,固然你须要准备好java环境(jdk、maven)<br>
<br>选择Maven<br>
<br>等待加载完成以后,运行src/…/encrypt 中的TTEncrypt测试用例<br>
<br>若是控制台打印相关调用信息,说明已经导入成功。<br>
python
加载libcms.so
<br>下面准备调用libcms.so文件中的 leviathan 函数<br>首先在 src/test/resources 目录下新建文件夹dylib,放入libcms.so文件<br>libcms.so 下载地址: https://download.csdn.net/download/weixin_43582101/12713664<br><br>而后我在 /unidbg/unidbg-android/src/test/java/com/sun/jna/ 目录下新建了 JniDispatch128.java文件<br>
<br>JniDispatch128.java文件内容以下:linux
备注 | |
---|---|
“com/ss/sys/ces/a” | 须要调用函数所在的Java类完整路径,好比 a/b/c/d 等等,注意须要用/代替. |
“leviathan(II[B)[B” | 须要调用的函数名,名字是smali语法,可经过jadx等工具查看 |
“vm.loadLibrary(new File)” | so文件的路径,须要自行修改,最好为绝对路径 |
package com.sun.jna; import com.github.unidbg.*; import com.github.unidbg.linux.android.AndroidARMEmulator; import com.github.unidbg.linux.android.AndroidResolver; import com.github.unidbg.linux.android.dvm.*; import com.github.unidbg.memory.Memory; import com.github.unidbg.memory.MemoryBlock; import com.github.unidbg.linux.android.dvm.array.ByteArray; import java.io.File; import java.io.IOException; public class JniDispatch128 extends AbstractJni { private static LibraryResolver createLibraryResolver() { return new AndroidResolver(23); } private static AndroidEmulator createARMEmulator() { return new AndroidARMEmulator("com.sun.jna"); } private final AndroidEmulator emulator; private final Module module; private final VM vm; private final DvmClass Native; private JniDispatch128() { emulator = createARMEmulator(); final Memory memory = emulator.getMemory(); memory.setLibraryResolver(createLibraryResolver()); vm = emulator.createDalvikVM(null); vm.setJni(this); vm.setVerbose(true); // 自行修改文件路径 DalvikModule dm = vm.loadLibrary(new File("/Users/Desktop/unidbg/unidbg-android/src/test/resources/dylib/libcms.so"), false); dm.callJNI_OnLoad(emulator); module = dm.getModule(); Native = vm.resolveClass("com/ss/sys/ces/a"); } private void destroy() throws IOException { emulator.close(); System.out.println("destroy"); } public static void main(String[] args) throws Exception { JniDispatch128 test = new JniDispatch128(); test.test(); test.destroy(); } public static String xuzi1(byte[] bArr) { if (bArr == null) { return null; } char[] charArray = "0123456789abcdef".toCharArray(); char[] cArr = new char[(bArr.length * 2)]; for (int i = 0; i < bArr.length; i++) { int b2 = bArr[i] & 255; int i2 = i * 2; cArr[i2] = charArray[b2 >>> 4]; cArr[i2 + 1] = charArray[b2 & 15]; } return new String(cArr); } private void test() { String methodSign = "leviathan(II[B)[B"; byte[] data = "暂时随便写的,这里是url通过处理后的data".getBytes(); int time = (int) (System.currentTimeMillis() / 1000); Native.callStaticJniMethod(emulator, methodSign, -1,time,new ByteArray(vm,data)); Object ret = Native.callStaticJniMethodObject(emulator, methodSign, -1,time,new ByteArray(vm,data)); System.out.println("callObject执行结果:"+((DvmObject) ret).getValue()); byte[] tt = (byte[]) ((DvmObject) ret).getValue(); System.out.println(new String(tt)); String s = xuzi1(tt); System.out.println(s); } }
运行main方法便可查看生成出来的xgorgon了<br><br> <br>android
TiToData:专业的短视频、直播数据接口服务平台git
更多信息请联系: TiToDatagithub
覆盖主流平台:抖音,快手,小红书,TikTok,YouTube算法