A small hack on Adobe FMS

我发现Adobe FMS的程序中包含很多日志输出代码,这些日志信息对于理解RTMFP协议非常有用。例如它会把收发到的每个user data chunk中的AMF对象打印出来,如

2012-06-12 17:32:07 8328 (d)0000000 rtmfp send message, session: 08F2F008 flow: 08F22EA0 rel: (-2,-2) kMsgCmd idByte=20 streamId=0 time=0 trxId=1 kEncodingAMF0 _result cmdData=( kObjectType ( fmsVer= kStringType "FMS/4,5,0,297", capabilities= kNumberType 255, mode= kNumberType 1 ) ) arg0=( kObjectType ( level= kStringType "status", code= kStringType "NetConnection.Connect.Success", description= kStringType "Connection succeeded.", objectEncoding= kNumberType 3, data= kArrayType ( version= kStringType "4,5,0,297" ) ) ) -

2012-06-12 17:32:07 8328 (i)2581173 rtmfp recv message, session: 08F2F008 flow: 05624900 kMsgCmdEx idByte=17 streamId=0 time=724 trxId=0 kEncodingAMF0 setPeerInfo cmdData=( kNullType ) arg0=( kStringType "192.168.15.1:53804" ) arg1=( kStringType "192.168.146.1:53804" ) arg2=( kStringType "10.4.8.84:53804" ) -

于是我就找如何打开这些日志。令人失望的是,通过配置文件是不行的,只能改程序。

于是我一共找到了3个点:

首先,启动FMS的时候要加上-console参数,不要通过services.msc直接启动。

然后,0x00C4BEDC处是一个4字节的整数,它是一个全局变量,用来控制LogLevel, 4是最高。

然后,007CCBE0 这个函数始终返回false。需要改成返回true。也就是说,把xor al,al 换成 mov al,1。

顺藤摸瓜,根据这个找到了MessageType的列表:

id name
4 kMsgUserCtrl
7 kMsgVirtualUserControl
8 kMsgAudio
9 kMsgVideo
15 kMsgDataEx
16 kMsgContainerEx
17 kMsgCmdEx
18 kMsgData
19 kMsgContainer
20 kMsgCmd
21 kMsgUDP
22 kMsgAggregate
23 kMsgPresent

下面这是Cumulus中对应的代码:

namespace Cumulus {
    class Message {
    public:
        enum Type {
            EMPTY            =0x00,
            AUDIO            =0x08,
            VIDEO            =0x09,
            AMF_WITH_HANDLER=0x14,
            AMF                =0x0F
        };
    };
}

可见缺的不是一点半点啊!

此博客中的热门博文

在windows下使用llvm+clang

少写代码,多读别人写的代码

tensorflow distributed runtime初窥