diff --git a/README.md b/README.md
index c7c86db60..1404f04ec 100644
--- a/README.md
+++ b/README.md
@@ -5,9 +5,8 @@
 [![Download](https://api.bintray.com/packages/him188moe/mirai/mirai-core/images/download.svg)](https://bintray.com/him188moe/mirai/mirai-core/)  
 **[English](README-eng.md)**  
 
-**TIM PC 协议** 跨平台 QQ 协议支持库.  
-**纯 Kotlin 实现协议和支持框架. 目前可运行在 JVM 或 Android.**  
-部分协议来自网络上开源项目.   
+**TIM PC 和 QQ Android 协议** 跨平台 QQ 协议支持库.  
+**纯 Kotlin 实现协议和支持框架. 目前可运行在 JVM 或 Android.**   
 
 **一切开发旨在学习,请勿用于非法用途**  
 
@@ -17,17 +16,6 @@
 在 [Project](https://github.com/mamoe/mirai/projects/1) 查看已支持功能和计划  
 在 [UpdateLog](https://github.com/mamoe/mirai/blob/master/UpdateLog.md) 查看版本更新记录
 
-## Contribution
-
-我们 (Mamoe, NaturalHG & Him188) 将会一直维护这个项目,除非遇到不可抗力因素。
-
-我们欢迎一切形式的贡献。  
-我们也期待有更多人能加入 Mirai 的开发。  
-
-若在使用过程中有任何疑问, 可提交 issue 或是邮件联系(support@mamoe.net). 我们希望 Mirai 变得更易用.
-
-您的 star 是对我们最大的鼓励(点击项目右上角);  
-
 ## Features
 #### mirai-core 
 通用 API 模块,请参考此模块调用 Mirai.    
@@ -46,9 +34,11 @@ QQ for Android (8.2.0 版本,2019 年 12 月)协议的实现,目前还
 
 开发进度:  
 - 完成 密码登录 (2020/1/23)
-- 进行中 验证码登录
-- 进行中 消息解析
-- 进行中 图片上传下载
+- 完成 群消息解析 (2020/1/25)
+- 进行中 免密登录
+- 进行中 图片验证码登录
+- 进行中 消息解析和发送
+- 进行中 图片上传和下载
 
 ## Use directly
 **直接使用Mirai(终端环境/网页面板(将来)).**  
@@ -87,8 +77,19 @@ implementation("net.mamoe:mirai-core-timpc-android:VERSION")
 Android 上, Mirai 运行需使用 80M 内存.  
 JVM 上需 120M-150M 内存
 
+## Contribution
+
+我们 (Mamoe, NaturalHG & Him188) 将会一直维护这个项目,除非遇到不可抗力因素。
+
+我们欢迎一切形式的贡献。  
+我们也期待有更多人能加入 Mirai 的开发。  
+
+若在使用过程中有任何疑问, 可提交 issue 或是邮件联系(support@mamoe.net). 我们希望 Mirai 变得更易用.
+
+您的 star 是对我们最大的鼓励(点击项目右上角);  
+
 ## Wiki
-在 [Wiki](https://github.com/mamoe/mirai/wiki/Development-Guide---Kotlin) 中查看各类帮助
+在 [Wiki](https://github.com/mamoe/mirai/wiki/Development-Guide---Kotlin) 中查看各类帮助,如 API 示例。
 
 ## Try
 
@@ -115,9 +116,9 @@ bot.subscribeAlways<MemberPermissionChangedEvent> {
 
 ## Build Requirements
 
-- Kotlin 1.3.61  
-- JDK 8
-- Android SDK 29
+- Kotlin 1.3.61 
+- JDK 8 (required)
+- Android SDK 29 (for Android target, optional)
 
 #### Libraries used
 感谢:
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidClient.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidClient.kt
index 4c7d99cec..fd78149c7 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidClient.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidClient.kt
@@ -9,10 +9,7 @@ import net.mamoe.mirai.data.OnlineStatus
 import net.mamoe.mirai.qqandroid.QQAndroidBot
 import net.mamoe.mirai.qqandroid.network.protocol.packet.PacketLogger
 import net.mamoe.mirai.qqandroid.network.protocol.packet.Tlv
-import net.mamoe.mirai.qqandroid.utils.Context
-import net.mamoe.mirai.qqandroid.utils.DeviceInfo
-import net.mamoe.mirai.qqandroid.utils.NetworkType
-import net.mamoe.mirai.qqandroid.utils.SystemDeviceInfo
+import net.mamoe.mirai.qqandroid.utils.*
 import net.mamoe.mirai.utils.MiraiExperimentalAPI
 import net.mamoe.mirai.utils.MiraiInternalAPI
 import net.mamoe.mirai.utils.cryptor.ECDH
@@ -20,10 +17,7 @@ import net.mamoe.mirai.utils.cryptor.contentToString
 import net.mamoe.mirai.utils.cryptor.decryptBy
 import net.mamoe.mirai.utils.cryptor.initialPublicKey
 import net.mamoe.mirai.utils.getValue
-import net.mamoe.mirai.utils.io.hexToBytes
-import net.mamoe.mirai.utils.io.read
-import net.mamoe.mirai.utils.io.readUShortLVByteArray
-import net.mamoe.mirai.utils.io.readUShortLVString
+import net.mamoe.mirai.utils.io.*
 import net.mamoe.mirai.utils.unsafeWeakRef
 
 /*
@@ -86,8 +80,8 @@ internal open class QQAndroidClient(
     val context: Context by context.unsafeWeakRef()
     val bot: QQAndroidBot by bot.unsafeWeakRef()
 
-    var tgtgtKey: ByteArray = ByteArray(16) // generateTgtgtKey(device.guid)
-    val randomKey: ByteArray = ByteArray(16) // 加密使用
+    var tgtgtKey: ByteArray = generateTgtgtKey(device.guid)
+    val randomKey: ByteArray = getRandomByteArray(16)
 
     var miscBitMap: Int = 184024956 // 也可能是 150470524 ?
     var mainSigMap: Int = 16724722
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/PacketFactory.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/PacketFactory.kt
index fbed60855..5a8feff8d 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/PacketFactory.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/PacketFactory.kt
@@ -8,7 +8,7 @@ import net.mamoe.mirai.qqandroid.network.io.JceInput
 import net.mamoe.mirai.qqandroid.network.protocol.jce.RequestPacket
 import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.receive.OnlinePush
 import net.mamoe.mirai.qqandroid.network.protocol.packet.login.LoginPacket
-//import net.mamoe.mirai.qqandroid.network.protocol.packet.login.SvcReqRegisterPacket
+import net.mamoe.mirai.qqandroid.network.protocol.packet.login.StatSvc
 import net.mamoe.mirai.utils.DefaultLogger
 import net.mamoe.mirai.utils.MiraiLogger
 import net.mamoe.mirai.utils.cryptor.adjustToPublicKey
@@ -50,6 +50,7 @@ internal val PacketLogger: MiraiLogger = DefaultLogger("Packet")
 @UseExperimental(ExperimentalUnsignedTypes::class)
 internal object KnownPacketFactories : List<PacketFactory<*>> by mutableListOf(
     LoginPacket,
+    StatSvc.Register,
     OnlinePush.PbPushGroupMsg
 ) {
 
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/OnlinePush.PbPushGroupMsg.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/OnlinePush.PbPushGroupMsg.kt
index 6a96bdd44..203338c54 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/OnlinePush.PbPushGroupMsg.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/OnlinePush.PbPushGroupMsg.kt
@@ -59,7 +59,7 @@ internal class OnlinePush {
                 permission = when {
                     flags and 16 != 0 -> MemberPermission.ADMINISTRATOR
                     flags and 8 != 0 -> MemberPermission.OWNER
-                    flags and 0 != 0 -> MemberPermission.MEMBER
+                    flags == 0 -> MemberPermission.MEMBER
                     else -> {
                         bot.logger.warning("判断群员权限失败")
                         MemberPermission.MEMBER
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/LoginPacket.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/LoginPacket.kt
index 4e13c2542..23e8af005 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/LoginPacket.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/LoginPacket.kt
@@ -261,8 +261,8 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse>("wt
         // val ret = tlvMap[0x104]?.let { println(it.toUHexString()) }
         println()
         val question = tlvMap[0x165] ?: error("CAPTCHA QUESTION UNKNOWN")
-        when (question[18].toUHexString()) {
-            "36" -> {
+        when (question[18].toInt()) {
+            0x36 -> {
                 //图片验证
                 DebugLogger.debug("是一个图片验证码")
                 bot.client.t104 = tlvMap[0x104]!!