发帖后的发现
经测试,该算法可以集合用在某节某动的所有APP中。[测试APP:某某头条极速版、某茄某听、某茄某某小说、某瓜视频(+86 1***2)]
前言
感觉有点莫名其妙,我这个各种语言小白,自从中石化小程序之后,就喜欢上了分析下发短信验证码的接口。。这不又来了...
今天的主角:某头条极速版。
工具
- fiddler(抓网络数据包用)
- jadx-gui(APP反编译用)
- 易语言/e4a(复现用)
0x1 抓包
直接手机设置代{过}{滤}理,打开APP,竟然能抓到数据包。
登录下发验证码的接口为passport/mobile/send_code/v1/
直接搜手机号但是却没找到手机号的明文,mobile的值也是一串22位数的字符串,那么肯定是有函数处理过了。
【我看hearders里面有sign还有很多token等等,但是我试了一下去掉各种hearders,用fd测试了一遍竟然能下发成功.......这不是多此一举吗】
0x2 分析
搜mobile
拿出jadx-gui,拖进去,搜索"mobile"
,发现好多hashMap.put("mobile", StringUtils.a(xxx))
,那么这个StringUtils.a
疑似就是处理的函数,猜参数是手机号。
跳到声明看看。
public static String a(String str) {
PatchProxyResult proxy = PatchProxy.proxy(new Object[]{str}, null, null, true, 11971);
if (proxy.isSupported) {
return (String) proxy.result;
}
return com.bytedance.android.standard.tools.string.StringUtils.b(str);/* 这个函数 */
}
继续看xxxx.string.StringUtils.b
,
public static String b(String str) {
PatchProxyResult proxy = PatchProxy.proxy(new Object[]{str}, null, null, true, 2195);
if (proxy.isSupported) {
return (String) proxy.result;
}
try {
if (TextUtils.isEmpty(str)) {
return null;
}
byte[] bytes = str.getBytes("UTF-8");
for (int i = 0; i < bytes.length; i++) {
bytes[i] = (byte) (bytes[i] ^ 5);/* 异或操作 */
}
return a.a(bytes, 0, bytes.length);/* 继续看这个a.a函数 */
} catch (Exception unused) {
return str;
}
}
a.a函数
public static String a(byte[] bArr, int i, int i2) {
PatchProxyResult proxy = PatchProxy.proxy(new Object[]{bArr, Integer.valueOf(i), Integer.valueOf(i2)}, null, null, true, 2161);
if (proxy.isSupported) {
return (String) proxy.result;
}
if (bArr == null) {
throw new NullPointerException("bytes is null");
} else if (i < 0 || i + i2 > bArr.length) {
throw new IndexOutOfBoundsException();
} else {
int i3 = i2 << 1;/* 左移 */
char[] cArr = new char[i3];
int i4 = 0;
for (int i5 = 0; i5 < i2; i5++) {
int i6 = bArr[i5 + i] & 255;/* &与 */
int i7 = i4 + 1;
char[] cArr2 = a;/* 常量a */
cArr[i4] = cArr2[i6 >> 4];/* >>右移 */
i4 = i7 + 1;
cArr[i7] = cArr2[i6 & 15];
}
return new String(cArr, 0, i3);
}
}
private static char[] a = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
0x3 算法复现
e4a复现,算法源码+成品下载
e4a复现就有点简单了,直接接口函数复制2个函数进去,调用即可。
某头条极速版mobile算法复现下载,密码:52pjpj
易语言算法复现
由于小弟属于java小白,顺便也是易语言小白,一句一句的翻译,所以饶了很多弯路。
最后的结果和APP的算法结果竟然每一位都相差了1,所以我又用子字节集替换()把所有的全部替换了一次。
希望能有大佬指点一下java算法转易语言算法
完美的java转易语言
感谢@siniandd 的指点,完美的java转易语言
0x4 用E下发短信成功