Commit b062c580 authored by Him188's avatar Him188

Android stuff

parent 67903e67
...@@ -66,6 +66,8 @@ actual class SystemDeviceInfo actual constructor(context: Context) : DeviceInfo( ...@@ -66,6 +66,8 @@ actual class SystemDeviceInfo actual constructor(context: Context) : DeviceInfo(
get() = md5(kotlin.runCatching { get() = md5(kotlin.runCatching {
(context.applicationContext.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager).subscriberId.toByteArray() (context.applicationContext.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager).subscriberId.toByteArray()
}.getOrElse { byteArrayOf() }) }.getOrElse { byteArrayOf() })
override val imei: String get() = "858414369211993" // TODO: 2020/1/5 get actual imei and ksid
override val ksid: String get() = "|454001228437590|A8.2.0.27f6ea96"
override val ipAddress: String get() = localIpAddress() override val ipAddress: String get() = localIpAddress()
override val androidId: ByteArray get() = Build.ID.toByteArray() override val androidId: ByteArray get() = Build.ID.toByteArray()
override val apn: ByteArray get() = "wifi".toByteArray() override val apn: ByteArray get() = "wifi".toByteArray()
......
package net.mamoe.mirai.qqandroid.network package net.mamoe.mirai.qqandroid.network
import kotlinx.atomicfu.AtomicInt
import kotlinx.atomicfu.atomic
import kotlinx.io.core.toByteArray import kotlinx.io.core.toByteArray
import net.mamoe.mirai.BotAccount import net.mamoe.mirai.BotAccount
import net.mamoe.mirai.qqandroid.utils.* import net.mamoe.mirai.qqandroid.utils.*
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.io.hexToBytes import net.mamoe.mirai.utils.io.hexToBytes
/* /*
...@@ -33,7 +36,11 @@ internal open class QQAndroidClient( ...@@ -33,7 +36,11 @@ internal open class QQAndroidClient(
var mainSigMap: Int = 16724722 var mainSigMap: Int = 16724722
var subSigMap: Int = 0x10400 //=66,560 var subSigMap: Int = 0x10400 //=66,560
var ssoSequenceId: Int = 85602 private val _ssoSequenceId: AtomicInt = atomic(85600)
@MiraiInternalAPI("Do not use directly. Get from the lambda param of buildSsoPacket")
internal fun nextSsoSequenceId() = _ssoSequenceId.addAndGet(2)
var openAppId: Long = 715019303L var openAppId: Long = 715019303L
val apkVersionName: ByteArray = "8.2.0".toByteArray() val apkVersionName: ByteArray = "8.2.0".toByteArray()
......
...@@ -18,7 +18,7 @@ import net.mamoe.mirai.utils.cryptor.DecrypterType ...@@ -18,7 +18,7 @@ import net.mamoe.mirai.utils.cryptor.DecrypterType
* @param TDecrypter 服务器回复包解密器 * @param TDecrypter 服务器回复包解密器
*/ */
@UseExperimental(ExperimentalUnsignedTypes::class) @UseExperimental(ExperimentalUnsignedTypes::class)
abstract class PacketFactory<out TPacket : Packet, TDecrypter : Decrypter>(val decrypterType: DecrypterType<TDecrypter>) { internal abstract class PacketFactory<out TPacket : Packet, TDecrypter : Decrypter>(val decrypterType: DecrypterType<TDecrypter>) {
@Suppress("PropertyName") @Suppress("PropertyName")
internal var _id: PacketId = NullPacketId internal var _id: PacketId = NullPacketId
......
...@@ -22,19 +22,20 @@ class LoginPacketDecrypter(override val value: ByteArray) : DecrypterByteArray { ...@@ -22,19 +22,20 @@ class LoginPacketDecrypter(override val value: ByteArray) : DecrypterByteArray {
@UseExperimental(ExperimentalUnsignedTypes::class) @UseExperimental(ExperimentalUnsignedTypes::class)
internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse, LoginPacketDecrypter>(LoginPacketDecrypter) { internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse, LoginPacketDecrypter>(LoginPacketDecrypter) {
init { init {
this._id = PacketId(0x0810, 9) this._id = PacketId(CommandId("wtlogin.login", 0x0810), 9)
} }
operator fun invoke( operator fun invoke(
client: QQAndroidClient client: QQAndroidClient
): OutgoingPacket = buildOutgoingPacket(client, EncryptMethod.ByECDH135) { ): OutgoingPacket = buildLoginOutgoingPacket(client.account.id.toString()) {
writeECDHEncryptedPacket(client.ecdh) {
writeShort(9) // subCommand
writeShort(LoginType.PASSWORD.value.toShort())
val appId = 16L val appId = 16L
val subAppId = 537062845L val subAppId = 537062845L
writeLoginSsoPacket(client, subAppId, _id.commandId) { ssoSequenceId ->
writeRequestPacket(client, EncryptMethodECDH135(client.ecdh), _id.commandId) {
writeShort(9) // subCommand
writeShort(LoginType.PASSWORD.value.toShort())
t18(appId, client.appClientVersion, client.account.id) t18(appId, client.appClientVersion, client.account.id)
t1(client.account.id, client.device.ipAddress) t1(client.account.id, client.device.ipAddress)
t106( t106(
...@@ -100,7 +101,7 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse, Log ...@@ -100,7 +101,7 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse, Log
// ignored t16a because array5 is null // ignored t16a because array5 is null
t154(client.ssoSequenceId) t154(ssoSequenceId)
t141(client.device.simInfo, client.networkType, client.device.apn) t141(client.device.simInfo, client.networkType, client.device.apn)
t8(2052) t8(2052)
...@@ -158,6 +159,7 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse, Log ...@@ -158,6 +159,7 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse, Log
// ignored t318 because not logging in by QR // ignored t318 because not logging in by QR
} }
} }
}
class LoginPacketResponse : Packet class LoginPacketResponse : Packet
...@@ -170,20 +172,20 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse, Log ...@@ -170,20 +172,20 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse, Log
@Suppress("FunctionName") @Suppress("FunctionName")
fun PacketId(commandId: Int, subCommandId: Int) = object : PacketId { internal fun PacketId(commandId: CommandId, subCommandId: Int) = object : PacketId {
override val commandId: Int override val commandId: CommandId
get() = commandId get() = commandId
override val subCommandId: Int override val subCommandId: Int
get() = subCommandId get() = subCommandId
} }
interface PacketId { internal interface PacketId {
val commandId: Int // ushort actually val commandId: CommandId // ushort actually
val subCommandId: Int // ushort actually val subCommandId: Int // ushort actually
} }
object NullPacketId : PacketId { internal object NullPacketId : PacketId {
override val commandId: Int override val commandId: CommandId
get() = error("uninitialized") get() = error("uninitialized")
override val subCommandId: Int override val subCommandId: Int
get() = error("uninitialized") get() = error("uninitialized")
......
...@@ -33,6 +33,8 @@ abstract class DeviceInfo( ...@@ -33,6 +33,8 @@ abstract class DeviceInfo(
abstract val wifiSSID: ByteArray? abstract val wifiSSID: ByteArray?
abstract val imsiMd5: ByteArray abstract val imsiMd5: ByteArray
abstract val imei: String
abstract val ksid: String
abstract val ipAddress: String abstract val ipAddress: String
......
...@@ -26,6 +26,8 @@ actual class SystemDeviceInfo actual constructor(context: Context) : DeviceInfo( ...@@ -26,6 +26,8 @@ actual class SystemDeviceInfo actual constructor(context: Context) : DeviceInfo(
@UseExperimental(ExperimentalUnsignedTypes::class) @UseExperimental(ExperimentalUnsignedTypes::class)
override val imsiMd5: ByteArray override val imsiMd5: ByteArray
get() = ubyteArrayOf(0xD4u, 0x1Du, 0x8Cu, 0xD9u, 0x8Fu, 0x00u, 0xB2u, 0x04u, 0xE9u, 0x80u, 0x09u, 0x98u, 0xECu, 0xF8u, 0x42u, 0x7Eu).toByteArray() get() = ubyteArrayOf(0xD4u, 0x1Du, 0x8Cu, 0xD9u, 0x8Fu, 0x00u, 0xB2u, 0x04u, 0xE9u, 0x80u, 0x09u, 0x98u, 0xECu, 0xF8u, 0x42u, 0x7Eu).toByteArray()
override val imei: String get() = "858414369211993"
override val ksid: String get() = "|454001228437590|A8.2.0.27f6ea96"
override val ipAddress: String get() = localIpAddress() override val ipAddress: String get() = localIpAddress()
override val androidId: ByteArray get() = "QSR1.190920.001".toByteArray() override val androidId: ByteArray get() = "QSR1.190920.001".toByteArray()
override val apn: ByteArray get() = "wifi".toByteArray() override val apn: ByteArray get() = "wifi".toByteArray()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment