一、抓包
第一步依然是抓包,我们使用花瓶,随便获取一个请求,发现加密参数sign,然后我们把请求转成python代码
import requests
headers = {
'app': 'mxbc',
'appchannel': 'xiaomi',
'appversion': '3.3.4',
'Content-Type': 'application/json; charset=UTF-8',
'Host': 'mxsa.mxbc.net',
'User-Agent': 'okhttp/4.4.1',
}
json_data = {
'distance': '10',
't': 1721305014995,
'latitude': '39.993754',
'appId': 'ba660596c1d911ebabac005056883e3e',
'limit': 10,
'sign': 'FhD5mRou5mV3dx_toUf0eOOO5XOHfanFzlAPBRdBzegzjBK7VQwJyE-sXtLYlld3hYD_H4Qv9Zt9xAtVopS_XzJLhD81Rk9xv8bH3wNpX8nAwoNqRVEaLPnxjDA7Um-mBxDhwRxVJWI-yfx9612ByODsiZarP_fFOAU1TF3T1gZCt-Hhq1SDDGfih_7KCW8o-aq6gb3iLN1cNgSaH_FwM9CW3KFKreLBz2II3JYf3Zd65UZ_DUuBeQj7UxZ_jniRE6UbBn6XH3kFGA6bknvTfgAyqEQdm-VTY1l8x9zhPztqGZ-KliyY68per5O64YZ5faQRDx_TOkJpvYWCMSihQg==',
'page': 1,
'longitude': '116.304482',
}
response = requests.post('https://mxsa.mxbc.net/api/v2/shopinfo/findNear', headers=headers, json=json_data)
二、分析算法
上面加密结果我们已经知道是base64加密了,可以使用自吐脚本,也可以分析java代码。很遗憾,对方的代码加壳了,我们首先进行脱壳吧,然后使用jadx分析、搜索。
排除前面结果第三方SDK,我们很快发现可以的类,objection hook一下确实使用了这个类。然后我们hook一下具体的方法,也就定位到加密了。
三、还原
public static String a(String str) {
PatchProxyResult proxy = PatchProxy.proxy(new Object[]{str}, null, changeQuickRedirect, true, 5559, new Class[]{String.class}, String.class);
if (proxy.isSupported) {
return (String) proxy.result;
}
try {
if (TextUtils.isEmpty(c)) {
c = (String) ((SerializableService) com.mxbc.service.e.a(SerializableService.class)).deserializeBase64(g.b(false));
}
PrivateKey generatePrivate = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(Base64.decode(c, 2)));
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(generatePrivate);
signature.update(str.getBytes());
return Base64.encodeToString(signature.sign(), 8);
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
我们把代码直接翻译成python,然后验证一下,万全一样。