美文网首页
有X记账app 逆向分析:signMsg和pwd参数分析

有X记账app 逆向分析:signMsg和pwd参数分析

作者: 归隐小赵 | 来源:发表于2020-07-13 15:43 被阅读0次

APP官网下载地址:
https://jz.yofish.com/homepage.html
首先,调用抓包工具,获取参数:

image.png
参数列表:
mobileNo:xxxx    手机号
source:12034  多次测试,发现该字段固定,版本类
cgetuiid:4767890aab8d5a38bd36dd165d981ede  多次测试,发现字段固定,应为设备ID类
cmodel:HD1900  设备型号
pwd:3b503f7e87b9f2e66c52001afe76adc6  密码的md5
signMsg:EB10FF224AFFBDCD1EEF2AC01CA584EB  sign的md5
cxmid:xSO3/z+G4coGDJF5NySVvaBKFyMtw2DDKS8ds1IKjA8ydscVTHurmTAoa7Fk3Xj3  设备类参数,不变
cimei:865166028805691  imei字段  需要与协议头一致
cres:540*960  分辨率
merchantacctId:130313002  多次测试,发现固定不变,猜测版本号
signType:1  加密类型,固定为1
cphoneos:Android_5.1.1_LMY49I  系统型号,固定
cphonebrand:OnePlus  系统型号固定
cuserid:36df3e97-0ffe-4073-a92e-f89da19ddea5  随机的uuid,需要与协议头一致

header协议头:

appversion: 5.0.0  APP版本5.0
flavor: youyu  app标识
releaseversion: 5.0.0  APP版本
source: 12034  app版本标识
cuserid: 36df3e97-0ffe-4073-a92e-f89da19ddea5  uuid,与传参一致
devtype: android  手机类型,安卓
apppkgname: com.jz.youyu  app包名
appversionname: 5.0.0  版本
appversioncode: 202  版本
product: %E6%9C%89%E9%B1%BC%E8%AE%B0%E8%B4%A6  解码:有鱼记账
device: OnePlusHD1900  设备型号
channel: %E5%AE%98%E7%BD%91  解码:官网
deviceid: 865166028805691  设备imei,需要与传参一致
content-type: application/x-www-form-urlencoded  提交类型
user-agent: okhttp/3.12.1  协议头

拖入idax,进行源码反编译
抓包分析参数后,我们要查的是signMsg,所以搜索关键词signMsg


image.png

第一次查找的是signMsg,关键词太多,通过"signMsg"过滤后,就很少的,第一个进去看后,感觉不是


image.png
与提交的参数不一致,可能是别的参数,跳过,看下一个
image.png
根据上方变量猜测得知,这里的确是,我们看一下谁调用了这个变量
image.png

很明显,就2个方法,第一个是变量,第二个是函数,直接看函数


image.png
看了一下,很像,对比一下这几个参数
f20085g  merchantacctId
f20083e  mobileNo
f20084f  pwd
k  signMsg

很明显了,就是这个函数内进行参数处理的


image.png
StringBuilder sb = new StringBuilder();
        sb.append("signType=1" + "&merchantacctId=" + f20081c + "&mobileNo=" + str2 + "&pwd=" + str);
        sb.append("&key=");
        sb.append(f20082d);
        String a2 = bd.a(sb.toString(), true);

定义字符串数组sb,追加参数:

signType=1&merchantacctId=f20081c &mobileNo=str2&pwd=str&key=f20082d

通过该方法可知

f20081c 为固定参数,看一下他的值
f20081c=130313002

str2手机号
str密码
f20082d md5秘钥,看一下是多少  A9FK25RHT487ULMI

所以,实际要进行md5的字段为:

signType=1&merchantacctId=130313002&mobileNo=手机号码&pwd=密码&key=A9FK25RHT487ULMI

通过参数模拟,写一个java类,校验一下我们的猜测是否正确


image.png

对比抓包结果:


image.png
一致,所以signMsg参数无误,那么接下来,对密码直接进行md5,发现与post的结果不一致,根据函数传参可知,密码是在加密后传到这个函数来的,所以我们再查一下是谁调用了他
image.png

通过节点命名,唯一的Login函数,肯定就是登陆类,进去看看


image.png
可知,的确是这里传的
String obj = this.j.getText().toString();
final String a2 = bd.a(obj.trim() + l, false);

通过刚刚的函数分析可知,bd.a是个md5,右边的布尔值,应该为是否对接过进行大写,我们看一下l参数

 private static final String l = "http://www.9188.com/";

也就是加密内容为:
trim(密码)+ "http://www.9188.com/"
对比md5,结果正常,postman模拟请求:

image.png

成功,请求成功,登陆算法获取完成

附:java 加密demo:

import java.util.Locale;
import java.security.MessageDigest;
public class Demo {
    //盐,用于混交md5
    private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5",
            "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
    public static void main(String[] args) {

        //字符串加密后,就是登陆的signMsg参数  注意,结果要进行大写转换!
        System.out.println(getSign("您的手机号","您的密码"));

    }

    /**
     * 获取signMsg的加密字段
     * @return
     */
    public static String getSign(String str2,String str) {

        String f20081c="130313002";     //项目标识  等同 merchantacctId
        //需要对md5进行一个加密
        String f20082d="A9FK25RHT487ULMI"; //秘钥
        StringBuilder sb = new StringBuilder();
        //对密码进行md5
        str=getPwdMd5(str);
        sb.append("signType=1" + "&merchantacctId=" + f20081c + "&mobileNo=" + str2 + "&pwd=" + str);
        sb.append("&key=");
        sb.append(f20082d);
        String sign_text=sb.toString();
        //字符串加密后,就是登陆的signMsg参数  注意,结果要进行大写转换!
        System.out.println("加密字符串"+sign_text);
        return encodeByMD5(sign_text,Boolean.TRUE);
    }
    private static String encodeByMD5(String originString,Boolean type) {
        if (originString != null){
            try {
                MessageDigest md = MessageDigest.getInstance("MD5");
                byte[] results = md.digest(originString .getBytes());
                String resultString = byteArrayToHexString(results);
                if (type==Boolean.TRUE){
                    return resultString.toUpperCase();
                }else{
                    return resultString;
                }

            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        return null;
    }
    /**
     * 转换字节数组为16进制字串
     *
     * @param b  字节数组
     * @return 十六进制字串
     */
    private static String byteArrayToHexString(byte[] b) {
        StringBuffer resultSb = new StringBuffer();
        for (int i = 0; i < b.length; i++) {
            resultSb.append(byteToHexString(b[i]));
        }
        return resultSb.toString();
    }

    /**
     * 将一个字节转化成16进制形式的字符串
     * @param b
     * @return
     */
    private static String byteToHexString(byte b) {
        int n = b;
        if (n < 0)
            n = 256 + n;
        int d1 = n / 16;
        int d2 = n % 16;
        return hexDigits[d1] + hexDigits[d2];
    }
    /**
     * 获取密码的md5
     */
    public static String getPwdMd5(String pwd) {
        String key="http://www.9188.com/"; //密码加密秘钥
        //字符串加密后,就是登陆的signMsg参数  注意,结果要进行大写转换!
        System.out.println("加密字符串:"+pwd+key);
        return encodeByMD5(pwd+key,Boolean.FALSE);


    }
}

相关文章

网友评论

      本文标题:有X记账app 逆向分析:signMsg和pwd参数分析

      本文链接:https://www.haomeiwen.com/subject/kogacktx.html