【APP逆向40】unidbg小试牛刀
-
1.需求
- 当我们逆向某APP时,找打加密在so文件中,如图所示
![]()
- 当我们逆向某APP时,找打加密在so文件中,如图所示
-
2.目录结构
![]()
-
3.基本流程
-
3.1:创建类
![]()
-
3.2:根据unidbg规则设备+so初始化
![]()
-
package com.nb.demo;
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.jni.ProxyClassFactory;
import com.github.unidbg.memory.Memory;
import java.io.File;
public class che extends AbstractJni {
public static AndroidEmulator emulator;
public static Memory memory;
public static VM vm;
public static DalvikModule dm;
public static Module module;
che() {
// 1.创建设备(32位或64位模拟器), 具体看so文件在哪个目录。 在armeabi-v7a就选择32位
emulator = AndroidEmulatorBuilder.for32Bit().setProcessName("com.che168.autotradercloud").build();
// 2.获取内存对象(可以操作内存)
memory = emulator.getMemory();
// 3.设置安卓sdk版本(只支持19、23)
memory.setLibraryResolver(new AndroidResolver(23));
// 4.创建虚拟机(运行安卓代码需要虚拟机,就想运行py代码需要python解释器一样)
vm = emulator.createDalvikVM(new File("unidbg-android/apks/che/atc241.apk"));
vm.setJni(this);
//vm.setVerbose(true); //是否展示调用过程的细节
// 5.加载so文件
DalvikModule dm = vm.loadLibrary(new File("unidbg-android/apks/che/libnative-lib.so"), false);
//dm.callJNI_OnLoad(emulator);
// 6.dm代表so文件,dm.getModule()得到module对象,基于module对象可以访问so中的成员。
module = dm.getModule();
}
public static void main(String[] args) {
che obj = new che();
}
}
- 3.3:执行签名
package com.nb.demo;
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.memory.Memory;
import java.io.File;
public class che extends AbstractJni {
public static AndroidEmulator emulator;
public static Memory memory;
public static VM vm;
public static DalvikModule dm;
public static Module module;
che() {
// 1.创建设备(32位或64位模拟器), 具体看so文件在哪个目录。 在armeabi-v7a就选择32位
emulator = AndroidEmulatorBuilder.for32Bit().setProcessName("com.che168.autotradercloud").build();
// 2.获取内存对象(可以操作内存)
memory = emulator.getMemory();
// 3.设置安卓sdk版本(只支持19、23)
memory.setLibraryResolver(new AndroidResolver(23));
// 4.创建虚拟机(运行安卓代码需要虚拟机,就想运行py代码需要python解释器一样)
vm = emulator.createDalvikVM(new File("unidbg-android/apks/che/atc241.apk"));
vm.setJni(this);
//vm.setVerbose(true); //是否展示调用过程的细节
// 5.加载so文件
DalvikModule dm = vm.loadLibrary(new File("unidbg-android/apks/che/libnative-lib.so"), false);
//dm.callJNI_OnLoad(emulator);
// 6.dm代表so文件,dm.getModule()得到module对象,基于module对象可以访问so中的成员。
module = dm.getModule();
}
public static void main(String[] args) {
che obj = new che();
obj.sign();
}
public void sign() {
// 找到java中native所在的类,并加载
DvmClass CheckSignUtil = vm.resolveClass("com/autohome/ahkit/jni/CheckSignUtil");
// 方法的符号表示
// 这个可以使用hook,故意输错参数,frida会有提示;也可以根据3.5中的对照表编写
String method = "get3desKey(Landroid/content/Context;)Ljava/lang/String;";
// 执行类中的静态成员
StringObject obj = CheckSignUtil.callStaticJniMethodObject(
emulator,
method,
vm.resolveClass("android/content/Context").newObject(null)
);
String keyString = obj.getValue();
System.out.println(keyString);
}
}
-
3.4:执行,获取结果
![]()
-
3.5:对照表
![]()







浙公网安备 33010602011771号