@(某住会sign与data算法)
某住会sign与data算法
经抓包分析得知,华住会app请求参数中有三个,分别是sign、data、time。time一眼可看出,就是当前时间,精确到秒。sign与data是经过一系列运算后 base64编码。
抓包分析
从图中可以看到,请求和响应均不是明文,响应报文从响应头中的content-type application/octet-stream 可以看到是字节流的形式,切换到十六进制模式。
反编译
这里我们用jeb打开,并导出源码,用idea打开
寻找data、sign处理逻辑
经过搜索和分析得知,计算data的代码在
public class NewGetString {
static {
System.loadLibrary("hzsign");
}
public static String a(String arg2, String arg3) {
Class v0 = NewGetString.class;
__monitor_enter(v0);
try {
arg2 = NewGetString.getNewStr(arg2, arg3).replaceAll("\r\n", "");
}
catch(Throwable v2) {
__monitor_exit(v0);
throw v2;
}
__monitor_exit(v0);
return arg2;
}
private static native String getNewStr(String arg0, String arg1) {
}
}
是一个本地方法,通过名称我们进入lib/armeabi目录,找到libhzsign.so,稍后我们再用IDA打开来分析。
接下来寻找sign的计算位置。
v0.a("sign", Base64.encodeToString(ab.c(v1.toString()), 2));
进入ab这个类的c方法
public static byte[] c(String arg2) {
MessageDigest v0;
try {
v0 = MessageDigest.getInstance("MD5");
v0.reset();
v0.update(arg2.getBytes("UTF-8"));
goto label_10;
}
catch(UnsupportedEncodingException ) {
label_10:
return v0.digest();
}
catch(NoSuchAlgorithmException ) {
System.exit(-1);
goto label_10;
}
}
这是一个md5算法。
逆向libhzsign.so
指令集功能鉴于篇幅 不一一解读。
还原算法
public static String deData(String data) {
return EncodingUtils.decodeToString(Base64.decodeBase64(data), KEY);
}
public static String getSign(String unSignData, String time) {
...
return Base64.encodeBase64String(DigestUtils.md5(unSign));
}
public static String getData(String unSignData) {
return Base64.encodeBase64String(EncodingUtils.encode(unSignData.getBytes(), KEY));
}
public static String deResponse(byte[] responseData) throws IOException {
...
}
验证算法正确性
将抓包取得的data,经过解密,再次加密,与原包完全一致,控制台中已打印出true。
sign值与抓包中的sign也完全吻合。
有对安卓逆向感兴趣的朋友们,可进群:912146030 共同交流、进步。