python解析AMF協議

2022-03-01 21:56:05 字數 1573 閱讀 3475

最近看公司同事在玩頁遊

《鬥破乾坤》我也進去完了一把,感覺畫面還不錯,就是不停的點滑鼠做任務,一會就煩了,看了下前端配置檔案,我們以error.json_3e30為例,這個肯定是記錄錯誤碼的檔案直接開啟是亂碼,二進位制開啟看到:

前面寫著czlib_1.0,那肯定是zlib壓縮,然後找了個zlib壓縮後的資料對比了下,發現,壓縮後的資料從78da開始的,因此也就是從第13個位元組開始,解壓後發現檔案依然不能直接看到,直接開啟只能看到少許幾個單詞,因此可以斷定沒有加密,只是某種編碼如下:

我們可以看到,這裡肯定不是ascii碼,因為有大量的不能顯示的字元,後來想到as3中的amf編碼,查了下amf編碼格式,基本斷定就是amf編碼,用python寫了個小工具如下:

#!/usr/bin/env python

#coding=utf-8

import os

import sys

import zlib

import json

import pyamf

def amfparser(srcpath, n, dstpath):

fsize = os.path.getsize(srcpath)

srchandle = open(srcpath, 'rb')

srchandle.seek(n)

rdata = srchandle.read(fsize - n)

decdata = pyamf.decode(zlib.decompressobj().decompress(rdata))

srchandle.close()

wdata = {}

dsthandle = open(dstpath, 'w')

wdata[k] = [elem[k] for elem in decdata for k in elem]

dsthandle .write(json.dumps(wdata, encoding='utf-8', ensure_ascii=false))

dsthandle.close()

if __name__ == '__main__':

reload(sys)

sys.setdefaultencoding('utf-8')

#amfparser('charm.xml_e3bb', 13, 'charm.xml')

#amfparser('quest_preload.xml_baa2', 13, 'quest_preload.xml')

#amfparser('13001_skill.tt_474f', 4, '13001_skill.txt')

#amfparser('13005_attacked.tt_7a53', 4, '13005_attacked.txt')

amfparser('error.json_3e30', 13, 'error.json')

RTMP協議分析 二 AMF資料

rtmp包預設的最大長度為128位元組,或通過chunksize改變rtmp包最大長度 當amf資料超過128byte的時候就可能有多個rtmp包組成,如果需要解碼的rtmp包太長則被tcp協議分割成多個tcp包.那麼解碼的時候需要先將包含rtmp包的tcp封包合併,再把合併的資料解碼,解碼後可得到...

RTMP協議分析 二 AMF資料

型別說明 objtype 資料 datasize core string 0x02 2位元組 2位元組的資料紀錄了string的實際長度 core object 0x03 0位元組 開始巢狀0x00000009表示巢狀結束 null 0x05 0位元組 空位元組無意義 core number 0x0...

Amf3協議分析與實現

amf3協議分析與實現 前沿 amf action message format 是一種 二進位制格式資料型態,amf協議基於http,將flash客戶端資料編碼後傳回server,server端的remoting adaptor接收到資料後則會解碼回正確的native物件,交給正確的程式處理,並以...