好友
阅读权限10
听众
最后登录1970-1-1
|
阳光肥肥
发表于 2021-3-19 09:58
最近想给自己的qq机器人添加一个每日本子推荐的功能,于是尝试爬了一下picacg的每日本子推荐
那么好 怎么爬? 使用httpcanny抓包然后python爬虫构造发送请求
抓个包看看
抓包
多抓两次,可以发现其中会变得东西有
time 时间戳
nonce 估计是和时间一起加密的
signature 经过某种加密算法得出的签名
现在我们要想办法去生成nonce和signature
我之前已经把apk拖到androidkiller里了,现在搜一下time,nonce,signature 看看能不能找到相关函数
搜完之后发现 time和 signature都有很多结果,而nonce只有一个
查nonce
那我们到相应的地方 使用java反编译软件 查看
反编译
ok 找到了time,nonce,signature 其中time就是时间戳,nonce是用uuid随机生成,signature在164行说了就是这个c(这里我没截到)
现在signature由MyApplication.bx().c()生成去看相关函数定义
MyApplication.bx().c
发现蛋疼了 有三个函数有关系 hl.C(),stringConFromNative(),getStringSigFromNative()
后两个函数一看native那就是在so里面的 一会儿再看 先看hl.C()
hl.C
好 看一下函数 把传入的两个参数全部转小写,然后调用了SHA256的Hmac算法
现在回过头看stringConFromNative(),getStringSigFromNative()
把apk改名为zip,去lib/arm64-v8a/下找到so文件 丢到IDA里面
找函数
找到相关函数,可以按f5转换为c代码
函数代码
最后只觉得自己菜,看不懂这个代码,,,
还好在github上找到了相关dalao的代码
https://github.com/AnkiKong/picacomic
https://github.com/tonquer/picacg-windows
相关函数python实现如下
[Python] 纯文本查看 复制代码 def ConFromNative(datas):
key = ""
# v6 = datas[0]
v37 = str(datas[1])
v7 = str(datas[2])
v35 = str(datas[3])
v36 = str(datas[4])
v8 = str(datas[5])
# v9 = datas[6]
# v10 = datas[7]
# v33 = v9
# v34 = v6
key += v37
key += v7
key += v35
key += v36
key += v8
return key
def SigFromNative():
key = "~*}$#,$-\").=$)\",,#/-.'%(;$[,|@/&(#\"~%*!-?*\"-:*!!*,$\"%.&'*|%/*,*"
key = list(key)
# v5 = int[] 32bit
# BYTE1(v5[0]) = 100;
key[1] = chr(100)
# LOWORD(v5[1]) = 14161;
key[4:6] = list((14161).to_bytes(2, 'little').decode("utf-8"))
# *(int *)((char *)&v5[1] + 3) = 1768835429;
key[7:11] = list((1768835429).to_bytes(4, 'little').decode("utf-8"))
# LOBYTE(v5[3]) = 86;
key[12] = chr(86)
# HIBYTE(v5[4]) = 80;
key[20 - 1] = chr(80)
# qmemcpy((char *)&v5[5] + 1, "RM4", 3);
key[20 + 1:20 + 1 + 3] = list("RM4")
# qmemcpy((char *)&v5[7] + 3, "CA}b", sizeof(int));
key[28 + 3:28 + 3 + 4] = list("CA}b")
# LOWORD(v5[9]) = 22351;
key[36:38] = list((22351).to_bytes(2, 'little').decode("utf-8"))
# qmemcpy((char *)&v5[10] + 1, "EV`", 3);
key[40 + 1:40 + 1 + 3] = list("EV`")
# qmemcpy((char *)&v5[11] + 1, "<>M7pddUBL5n", 12);
key[44 + 1:44 + 1 + 12] = list("<>M7pddUBL5n")
# *(_WORD *)((char *)&v5[15] + 1) = 28227;
key[60 + 1:63] = list((28227).to_bytes(2, 'little').decode("utf-8"))
# qmemcpy((char *)&v5[3] + 2, "9\\RK", sizeof(int))
key[12 + 2:12 + 2 + 4] = list("9\\RK")
# BYTE1(v5[6]) = 57;
key[24 + 1] = chr(57)
# HIBYTE(v5[6]) = 55;
key[28 - 1] = chr(55)
# HIBYTE(v5[9]) = 51;
key[40 - 1] = chr(51)
# BYTE2(v5[14]) = 48;
key[56 + 2] = chr(48)
return "".join(key)
最后上一张成功截图
成果
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|