2023年某东sign签名算法(少走弯路)

1、前提准备环境

  Android反编译工具——jadx

  IDA Pro:交互式反汇编器

  Fiddler是强大的抓包工具

  真机或者模拟器 笔者这里使用nexus5

2、对APP进行抓包分析

    1、打开APP 点击搜索按钮 搜索任意商品即可

7da01ab4a3d24b3a81257a53d745d02a.png

 切换fidder抓包工具可以看见在请求当中有一个sign的参数

84a8043aefaf4c90925a3bdf48054a2f.png

使用jadx对APK进行反编译分析 这里我们搜索下 

b58b4407aa5442ee8c288689bf70bf6b.png

这里我们可以发现 进行签名计算的参数有5个  

我们点击signature()这个方法可以看见这个是个接口

4eed81e83f2c40d8af4de8b56fcb6b7e.png

 是接口必然有他的实现类 我们继续搜索 果然搜索到了

47881cfd61c64e5982121f6b1f1154fa.png

 可以看见最终调用的是

BitmapkitUtils.getSignFromJni()这个方法 我们继续追踪

2bfded96e05244d3aec48d1023fb4aa0.png

这里我们发现 getSignFromJni是个native方法 加载他的so也可以看的到

那么我们提取apk中的libjdbitmapkit.so进行分析

3、使用ida打开so文件进行分析

将so拖进ida 点击导出表 我们可以发现 我们找到了最终调用的函数

0bc300e2d00f4a5a8cc2594d56706248.png

 方法实现如下

f1e5f9ae8a314deb8295e53c3e01001a.png

 

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();
    }
}

 

全部代码,写完跑起来,这里还要补一下环境的问题。。跳过

d6a4d6fa6a187e0292961681419b533e.png

 

最后可以看到 生成成功了

算法学习交流QQ1421806379

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值