Skip to content

Instantly share code, notes, and snippets.

@ssddi456
Created October 17, 2018 17:31
Show Gist options
  • Save ssddi456/5f1f5ce13e04ebea2badd6874bf8219e to your computer and use it in GitHub Desktop.
Save ssddi456/5f1f5ce13e04ebea2badd6874bf8219e to your computer and use it in GitHub Desktop.
try decode amf according wikipedia's doc
var data = new Buffer([0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1d, 0x42, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, // 16
0x69, 0x63, 0x65, 0x2e, 0x64, 0x6f, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x54, 0x6f, // 32
0x42, 0x61, 0x74, 0x63, 0x68, 0x00, 0x02, 0x2f, 0x31, 0x00, 0x00, 0x00, 0xdc, 0x0a, 0x00, 0x00, // 47
0x00, 0x00
]);
var offset = 0;
var version = data.readUInt16BE(offset);
offset += 2;
var headerLen = data.readUInt16BE(offset);
offset += 2;
function readUtf(data) {
var len = data.readUInt16BE(offset);
offset += 2;
var str = data.slice(offset, offset + len);
offset += len;
return str.toString();
}
function readLongUtf(data) {
var len = data.readInt32BE(offset);
offset += 4;
var str = data.slice(offset, offset + len);
offset += len;
return str.toString();
}
function readAmf0Object(data) {
var obj = {};
do {
var name = readUtf(data);
console.log( JSON.stringify(name), name.length );
if(name.length == 0){
var endObj = data.readUInt8(offset) == 0x09;
if(endObj) {
return obj
}
}
var value = readAmf0Data(data);
obj[name] = value;
} while (true);
}
function readAmf3Data(data) {
}
function readAmf0Data(data) {
var type = data.readUInt8(offset);
offset += 1;
switch (type) {
case 0x00:
var ret = data.readDoubleBE(offset);
offset += 8;
return ret;
case 0x01:
var ret = data.readUInt8(offset);
offset += 1;
return ret == 1;
case 0x02:
return readUtf(data);
case 0x03:
return readAmf0Object(data);
case 0x05:
return null;
case 0x08:
return readAmf0Array(data);
case 0x0a:
return readAmf0Array(data);
case 0x0b:
var timeStamp = data.readDoubleBE(offset);
offset += 8;
var timeZone = data.readUInt16BE(offset);
offset += 2;
return [timeStamp, timeZone];
case 0x0c:
return readLongUtf(data);
case 0x0f:
return readLongUtf(data);
case 0x10:
var name = readUtf(data);
var body = readAmf0Data(data);
return {
name: name,
body: body
};
case 0x11:
return readAmf3Data(data);
}
}
function readAmf0Array(data) {
console.log(data.length, offset);
var amf0ArrayLen = data.readInt32BE(offset);
offset += 4;
var ret = [];
for (var i = 0; i < amf0ArrayLen; i++) {
ret.push(readAmf0Data());
}
return ret;
}
for (var i = 0; i < headerLen; i++) {
var header = readUtf(data);
var required = data.readInt8(offset);
offset += 1;
var headerValueLen = data.readUInt16BE(offset);
offset += 2;
var headerValue = data.slice(offset, offset + headerValueLen)
offset += headerValueLen;
}
var bodyLen = data.readUInt16BE(offset);
offset += 2;
for (var j = 0; j < bodyLen; j++) {
var reqUrl = readUtf(data);
var respUrl = readUtf(data);
console.log(reqUrl, respUrl, offset);
// this seems truely useless
var messageBodyLen = data.readInt32BE(offset);
offset += 4;
console.log(messageBodyLen, offset);
var body = readAmf0Data(data);
console.log(body);
}
var obj = new Buffer([0x03, 0x00, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x02, 0x00, 0x04, 0x4d, 0x69, 0x6b, 0x65, 0x00, 0x03, 0x61, 0x67, 0x65, 0x00, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x02, 0x00, 0x04, 0x4d, 0x69, 0x6b, 0x65, 0x00, 0x00, 0x09]);
offset = 0;
console.log(readAmf0Data(obj));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment