1、前提准备环境
Android反编译工具——jadx
IDA Pro:交互式反汇编器
Fiddler是强大的抓包工具
真机或者模拟器 笔者这里使用nexus5
2、对APP进行抓包分析
1、打开APP 点击搜索按钮 搜索任意商品即可
切换fidder抓包工具可以看见在请求当中有一个sign的参数
使用jadx对APK进行反编译分析 这里我们搜索下
这里我们可以发现 进行签名计算的参数有5个
我们点击signature()这个方法可以看见这个是个接口
是接口必然有他的实现类 我们继续搜索 果然搜索到了
可以看见最终调用的是
BitmapkitUtils.getSignFromJni()这个方法 我们继续追踪
这里我们发现 getSignFromJni是个native方法 加载他的so也可以看的到
那么我们提取apk中的libjdbitmapkit.so进行分析
3、使用ida打开so文件进行分析
将so拖进ida 点击导出表 我们可以发现 我们找到了最终调用的函数
方法实现如下
4、进行黑盒调用进行实现
public class test extends AbstractJni {
private final AndroidEmulator emulator;
private final VM vm;
public String apkPath = "apk 文件路径";
public String soPath = "so 文件路径";
private static LibraryResolver createLibraryResolver() {
return new AndroidResolver(23);
}
private static AndroidEmulator createARMEmulator() {
return AndroidEmulatorBuilder
.for32Bit()
.build();
}
public test () {
emulator = createARMEmulator();
final Memory memory = emulator.getMemory();
memory.setLibraryResolver(createLibraryResolver());
vm = emulator.createDalvikVM(new File(apkPath));
vm.setVerbose(true);
DalvikModule dm = vm.loadLibrary(new File(soPath), false);
vm.setJni(this);
dm.callJNI_OnLoad(emulator);
Module module = dm.getModule();
}
public void callGetSignFromJni() {
DvmClass bitMapKitUtils = vm.resolveClass("com/jingdong/common/utils/BitmapkitUtils");
DvmObject<?> strRc = bitMapKitUtils.callStaticJniMethodObject(
emulator,
"getSignFromJni()(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;",
);
System.out.println("callGetSignFromJni: " + strRc.getValue());
}
public static void main(String[] args) throws IOException {
JingDong1020Test jdSign = new JingDong1020Test();
jdSign.callGetSignFromJni();
jdSign.destroy();
}
private void destroy() throws IOException {
emulator.close();
}
}
全部代码,写完跑起来,这里还要补一下环境的问题。。跳过
最后可以看到 生成成功了
算法学习交流QQ1421806379