Action Message Format - AMF0

摘要


Action Message Format (AMF) 是一種簡潔的二進(jìn)制格式,通常用于序列化ActionScript object graphs(對(duì)象圖?不會(huì)翻譯)。一旦序列化,AMF編碼的對(duì)象圖可用于會(huì)話之間持久化以及檢索應(yīng)用程序的公共狀態(tài),或者允許兩個(gè)端通過強(qiáng)類型數(shù)據(jù)的交換進(jìn)行通信。

AMF 0 Data Types


下方是AMF0的16種類型的markermarker位占用一個(gè)字節(jié)長度,用于描述AMF中某種數(shù)據(jù)類型。

marker value remark
number-marker 0x00
boolean-marker 0x01
string-marker 0x02
object-marker 0x03
movieclip-marker 0x04 reserved, not supported
null-marker 0x05
undefined-marker 0x06
reference-marker 0x07
ecma-array-marker 0x08
object-end-marker 0x09
strict-array-marker 0x0A
date-marker 0x0B
long-string-marker 0x0C
unsupported-marker 0x0D
recordset-marker 0x0E reserved, not supported
xml-document-marker 0x0F
typed-object-marker 0x10

抓包分析


因?yàn)?code>AMF0采用的是 big endian (network) byte order,所以先簡單看看什么是big endian

int val = 0x1234;

big endian:
低地址  0------->1------->2   高地址
        +--------+--------+
        |  0x12  |  0x34  |
        +--------+--------+
little endian:
        +--------+--------+
        |  0x34  |  0x12  |
        +--------+--------+
  1. Number
number-type = number-marker DOUBLE

Number
如上圖所示,紅框內(nèi)的是Numbermarker0x00,紫框是Number的數(shù)值,為40 08 00 00 00 00 00 00,我的電腦是little endian的所以我在內(nèi)存里面看到的相應(yīng)的數(shù)值是00 00 00 00 00 00 08 40
我們可以看一下rtmpdump的實(shí)現(xiàn)

char *AMF_EncodeNumber(char *output, char *outend, double dVal)
{
    unsigned char *ci, *co;
    ci = (unsigned char *)&dVal;
    co = (unsigned char *)output;
    co[0] = ci[7];
    co[1] = ci[6];
    co[2] = ci[5];
    co[3] = ci[4];
    co[4] = ci[3];
    co[5] = ci[2];
    co[6] = ci[1];
    co[7] = ci[0];
}
  1. Boolean
boolean-type = boolean-marker U8 ; 0 is false, <> 0 is true

Boolean
如上圖所示,紅框內(nèi)的是Booleanmarker0x01,紫框是Boolean的數(shù)值,為0x01,理論上只要非零就是true
rtmpdump的實(shí)現(xiàn)

char * AMF_EncodeBoolean(char *output, char *outend, int bVal)
{
  *output++ = AMF_BOOLEAN;
  *output++ = bVal ? 0x01 : 0x00;
  return output;
}
  1. String
string-type = string-marker UTF-8

String
如上圖所示,紅框內(nèi)的是Stringmarker0x02,綠框是字符串的長度,值為0x0008,紫框是String的值,為onStatusASCII碼。
rtmpdump的實(shí)現(xiàn)

char *AMF_EncodeString(char *output, char *outend, const AVal *bv)
{
 *output++ = AMF_STRING;
  output = AMF_EncodeInt16(output, outend, bv->av_len);
  memcpy(output, bv->av_val, bv->av_len);
  output += bv->av_len;
  return output;
}
  1. Object
object-property = (UTF-8 value-type) | (UTF-8-empty object-end-marker)
anonymous-object-type = object-marker *(object-property)

Object類型除了可以包含其他類型之外,也可以包含Object類型。

image.png
Object是以Object-End結(jié)束的,值為0x000009

Thanks


  1. rtmpdump,簡直是入門引路者

最終目標(biāo)是實(shí)現(xiàn)RTMP協(xié)議。還好前方有大量牛人實(shí)現(xiàn)過,感覺造輪子的時(shí)候,可以抄一下=。=
簡單地實(shí)現(xiàn)了一下,代碼地址->amf0

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評(píng)論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,860評(píng)論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評(píng)論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評(píng)論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,025評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,421評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,642評(píng)論 0 289
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,177評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,970評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,157評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,410評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評(píng)論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,896評(píng)論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,157評(píng)論 2 375

推薦閱讀更多精彩內(nèi)容