diff --git a/src/core/proto/EmojiLikeToOthers.proto b/src/core/proto/EmojiLikeToOthers.proto
new file mode 100644
index 00000000..171f6714
--- /dev/null
+++ b/src/core/proto/EmojiLikeToOthers.proto
@@ -0,0 +1,24 @@
+syntax = 'proto3';
+package SysMessage;
+
+message EmojiLikeToOthersWrapper1 {
+  EmojiLikeToOthersWrapper2 wrapper = 1;
+}
+
+message EmojiLikeToOthersWrapper2 {
+  EmojiLikeToOthersWrapper3 body = 1;
+}
+
+message EmojiLikeToOthersWrapper3 {
+  EmojiLikeToOthersMsgSpec msgSpec = 2;
+  EmojiLikeToOthersAttributes attributes = 3;
+}
+
+message EmojiLikeToOthersMsgSpec {
+  uint32 msgSeq = 1;
+}
+
+message EmojiLikeToOthersAttributes {
+  string emojiId = 1;
+  string senderUid = 4;
+}
diff --git a/src/core/proto/GreyTipWrapper.proto b/src/core/proto/GreyTipWrapper.proto
new file mode 100644
index 00000000..a498edf0
--- /dev/null
+++ b/src/core/proto/GreyTipWrapper.proto
@@ -0,0 +1,9 @@
+syntax = 'proto3';
+package SysMessage;
+
+message GreyTipWrapper {
+  uint32 subTypeId = 1;
+  uint32 groupCode = 4;
+  uint32 subTypeIdMinusOne = 13;
+  bytes rest = 44;
+}
diff --git a/src/core/proto/SysMessage.proto b/src/core/proto/SysMessage.proto
new file mode 100644
index 00000000..c15d920f
--- /dev/null
+++ b/src/core/proto/SysMessage.proto
@@ -0,0 +1,36 @@
+syntax = 'proto3';
+package SysMessage;
+
+message SysMessage {
+  repeated SysMessageHeader header = 1;
+  repeated SysMessageMsgSpec msgSpec = 2;
+  SysMessageBodyWrapper bodyWrapper = 3;
+}
+
+message SysMessageHeader {
+  uint32 PeerNumber = 1;
+  string PeerString = 2;
+  uint32 Uin = 5;
+  optional string Uid = 6;
+}
+
+message SysMessageMsgSpec {
+  uint32 msgType = 1;
+  uint32 subType = 2;
+  uint32 subSubType = 3;
+  uint32 msgSeq = 5;
+  uint32 time = 6;
+  uint64 msgId = 12;
+  uint32 other = 13;
+}
+
+message SysMessageBodyWrapper {
+  bytes wrappedBody = 2;
+  // Find the first [08], or ignore the first 7 bytes?
+  // And it becomes another ProtoBuf message.
+}
+
+message KeyValuePair {
+  string key = 1;
+  string value = 2;
+}