前语
现如今直播间协议许多现已很少运用http轮询的办法获取直播间的弹幕、礼物、关注等,在用的现在知道的是某音的直播,其他的一些app现已运用socket或许websoceket获取直播间的弹幕等,本次首要针对websocket供给协议破解思路。
设备:小米note8、windows
案例websocket完成1对1谈天:详细不供给,仅供给破解思路。
抓包剖析
本次抓包运用的Charles进行抓包websocket,Charles配备简略,抓包便利。
翻开该app的直播间,在github中文官网网页Charles中能够很清晰的看到,websocket发送的数据以及承受的推送信息。
ws://chat.**.com:3185
ws://
也便是该websocket的明显特征,除过ws://
还有wss://
,而wsshttps和http的差异
是对应ws
的加密版别,类似http
和https
的联络websocket面试题。
脱壳剖析定位
该apwebsocket的缺陷和不足p是经过加壳gitee的,这儿运用youpk进行脱壳,详细流程可看gigithubthub,github.com/Youlor/Youp…
定位要害方位
经过抓包的要害词ctorgithub.entryHandler.enter
在该app定位。
这个sdkwindows体系就奉告咱们全部了,cogitlabm.netease.pomewebsocket是什么意思lo
,经过相关资料
pomelo是网易12年末出品的一个根据node.js的游戏服务器框架,其规划初衷是游戏服务器, 不过在规划node.js是干什么的、开发结束后发现nodejs是前端还是后端pomelo是个通用的分布式实时运用开发框架。
根据网易github,github.com/netease/pom… 相关资料,其运用socket.io
进行发包,并且在logcat中能够很清晰的看到相关发node.js 教程送数据的日志。
但windows更新是在该数据https认证包中直接发现有乱码,那就只能找该数据包的原始字节。
进一步的hook剖析,定位到如下图方位。
经过fridawebsocket和socket差异进行hook打印该类,默许调用tostring
办法
var FramedataImpl1 = Java.ushttps协议e("org.java_websocket.framing.FramedataImpl1")
FramedataImpl1.b.overgithub永久回家地址loadwindows更新('boolean').implemengititation = function (q1) {
this.b(q1)
console.log(this)
}
//51, 58, 58, 58, 0, 0, 0, 1, 31,
//51, 58, 58, 58, 0, 0, 0, 2, 28,
//51, 58, 58, 58, 0, 0, 0, 3, 35,
//51, 58, 58, 58, 0, 0, 0, 4, 32,
//51, 58, 58, 58, 0, 0, 0, 5, 32,
//50, 58, 58
剩余便是发现规则,包的次序以及发那些包,其间
51, 58, 58, 58,
便是3:::
,50, 58, 58
是2::
,那些乱码的字符,也便是对应的后半部分websocket原理的字节,其间包含websocket菜鸟教程了发包的次序,从0-9等。
恢复协议
运用pythonode.js装置n的websocket-client
,进行恢复直播间的协议通websocket心跳重连机制讯。
关于上述的字节,能够在java中运用base64进行编码,然后python中进行解码运github中文官网网页用。
def send_msg(ws):
a = base64.b64decode('Mzo6OgAAAAEf')
enter = {"sid": "", "rid": str(room_id), "userid": "0",
"brand": "Rhttps安全问题edmi Nwebsocket没准备好ote 8", "coreswindows7": 8, "mewindows10激活密钥mory": 5638, "screen": 1080, "trid": 666, "re_egitinter": 1,
"true_ip": "210*12*195*3", "sktime": 1622114102, "sign": sign,
"version_code":Windows 507,
"is_intl_panodejs菜鸟教程ck": "0", "channel": "9700288", "client_code_version": "23", "client_side": 2, "sys_sdk": 29,
"country_conodejs菜鸟教程de": "CN",https安全问题 "pkg_channel": "9700288", "is_market": "1", "timestampGit": 16github是干什么的221windows怎样激活14101589}
ws.send(a + bytes('siogit指令connector.entryHandler.enter' + json.dumps(enter), encoding='utf8'))
b = bagit指令se64.b64decode('Mzo6OgAAAAIc')https协议
ws.send(b + bytes('chat.chatHandler.getTopThree' + json.dumps({"timestamp": 1622113988470}), encoding='utf8'))
c = base64.b64decodwebsocket完成1对1谈天e('Mzwindows更新o6OgAAAAMj')
ws.send(git指令c + bytes('chat.chatHandler.checkUserStatusMix' + json.dumps({"uid": "0", "timestamp": 1622113988484}),
encoding='utf8'))
dgitee = base64.b64decode('Mzo6OgAAAAQg')
ws.send(d + bytes('chat.chatHandler.getAnchorCdhttps域名nMix' + json.dumps({"timestamp": 1622113988496}websocket没准备好),
encoding='utf8'))
e = base64.b64decode('Mzo6OgAAAAcg')
ws.send(e + bytes('chanodejs装置及环境装备t.chatHandler.getGuardinfo' + json.dumps({"timestamp": 1622113988496}),
encoding='utf8'))
f =https和http的差异 base64.b64decode('Mzo6OgAAAAYd')
ws.send(f + bytesgitee('chat.chatHandler.onlineGoldPhone' + json.dumps({"timestamp": 1622113988496}),
encoding='utf8'))
while 1:
ws.sendwebsocket完成1对1谈天(bWebSocket'2::')
sgiti轮胎leep(1)
def on_opnodejs装置及环境装备en(ws):
print('on_open', ws)
threading.Thread(target=send_msg, args=(ws,))websocket面试题.start()
def on_message(ws, messawindows许可证即将过期怎样办ge):
print(message)
message = message[len('3:::'):]
print('on_message', message)
def on_clogitlabse(ws, close_stathttps域名us_code, close_reason):
print('on_close', ws, close_status_code, close_reason)
def start_websocket(chawebsocket菜鸟教程t_url, token):
# websocket.ewindows怎样激活nableTrace(True)
ws = websocket.WebSocketApp(
f"ws://{chat_url}/socket.io/1/websocket/{token}",
on_message=on_message,
owebsocket心跳重连机制n_openhttps和http的差异=on_open,
on_close=owindows怎样激活n_close
)
ws.run_forevnodejs装置及环境装备er()
小结
该直播app的直播间协议,在获取弹幕过程中,有部分数据是乱码办法,这部分就能够运用hook将其发送的数据以字节的办法websocket原理拿到,在经过比照发送字节的不同,结构其发送的数据,最终结束协议恢复。