本文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
同事王二狗说他大舅家二姑的三叔子的小外孙的班花突然追他,想知道她是否注册了这个APP,于是就有了接下来的分析
掏出Reqabel抓包,看到phone、cs、slb、sdi都需要计算

返回数据包
通过register的值来判断该号码是否已注册
在IDA中查找“phone”,找到引用

继续查找“encodePhoneNum”

至此,phone的计算过程已经很明显了
让豆包老师写个函数验证,结果竟然不对!!!
继续分析

发现内部还有一次base64,也就是一次加密,结果进行两次base64
代码如下,测试通过

跟进去之后,就能看到整个的计算过程
两次MD5,都取前4字节,进行排列组合
还有就是时间戳/1000,然后转成hex进行排列组合
其中一次MD5要用到sdi,那就继续分析

查找sdi,发现slb也在这里,好像更容易解决,就先验证slb吧
这不是和phone加密相同嘛,只是key不同
验证通过
继续寻找sdi

跟进去,发现是MD5
源数据是三部分
P1:设备ID
P2:设备名称
P3:设备型号
sdi = MD5( P1 + P2 + P3 )
本次分析难度适中,但加密参数较多,并非没有头发为之阵亡。
{"code":10001,"message":"获取成功","data":{"register":true},"success":true}
{"code":10001,"message":"获取成功","data":{"register":true},"success":true}
def encodePhoneNum(phone: str) -> str:
key = "789!@#xswEDCzxcv".encode('utf-8')[:8]
phone_utf8 = phone.encode('utf-8')
cipher = DES.new(key, DES.MODE_ECB)
encrypted_bytes = cipher.encrypt(pad(phone_utf8, DES.block_size, style='pkcs7'))
first_base64 = base64.b64encode(encrypted_bytes).decode('utf-8')
second_utf8 = first_base64.encode('utf-8')
second_base64 = base64.b64encode(second_utf8).decode('utf-8')
return second_base64
def encodePhoneNum(phone: str) -> str:
key = "789!@#xswEDCzxcv".encode('utf-8')[:8]
phone_utf8 = phone.encode('utf-8')
cipher = DES.new(key, DES.MODE_ECB)
encrypted_bytes = cipher.encrypt(pad(phone_utf8, DES.block_size, style='pkcs7'))
传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!