Commit b062c580 authored by Him188's avatar Him188

Android stuff

parent 67903e67
......@@ -66,6 +66,8 @@ actual class SystemDeviceInfo actual constructor(context: Context) : DeviceInfo(
get() = md5(kotlin.runCatching {
(context.applicationContext.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager).subscriberId.toByteArray()
}.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 androidId: ByteArray get() = Build.ID.toByteArray()
override val apn: ByteArray get() = "wifi".toByteArray()
......
package net.mamoe.mirai.qqandroid.network
import kotlinx.atomicfu.AtomicInt
import kotlinx.atomicfu.atomic
import kotlinx.io.core.toByteArray
import net.mamoe.mirai.BotAccount
import net.mamoe.mirai.qqandroid.utils.*
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.io.hexToBytes
/*
......@@ -33,7 +36,11 @@ internal open class QQAndroidClient(
var mainSigMap: Int = 16724722
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
val apkVersionName: ByteArray = "8.2.0".toByteArray()
......
......@@ -18,7 +18,7 @@ import net.mamoe.mirai.utils.cryptor.DecrypterType
* @param TDecrypter 服务器回复包解密器
*/
@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")
internal var _id: PacketId = NullPacketId
......
......@@ -22,19 +22,20 @@ class LoginPacketDecrypter(override val value: ByteArray) : DecrypterByteArray {
@UseExperimental(ExperimentalUnsignedTypes::class)
internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse, LoginPacketDecrypter>(LoginPacketDecrypter) {
init {
this._id = PacketId(0x0810, 9)
this._id = PacketId(CommandId("wtlogin.login", 0x0810), 9)
}
operator fun invoke(
client: QQAndroidClient
): OutgoingPacket = buildOutgoingPacket(client, EncryptMethod.ByECDH135) {
writeECDHEncryptedPacket(client.ecdh) {
writeShort(9) // subCommand
writeShort(LoginType.PASSWORD.value.toShort())
): OutgoingPacket = buildLoginOutgoingPacket(client.account.id.toString()) {
val appId = 16L
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)
t1(client.account.id, client.device.ipAddress)
t106(
......@@ -100,7 +101,7 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse, Log
// ignored t16a because array5 is null
t154(client.ssoSequenceId)
t154(ssoSequenceId)
t141(client.device.simInfo, client.networkType, client.device.apn)
t8(2052)
......@@ -158,6 +159,7 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse, Log
// ignored t318 because not logging in by QR
}
}
}
class LoginPacketResponse : Packet
......@@ -170,20 +172,20 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse, Log
@Suppress("FunctionName")
fun PacketId(commandId: Int, subCommandId: Int) = object : PacketId {
override val commandId: Int
internal fun PacketId(commandId: CommandId, subCommandId: Int) = object : PacketId {
override val commandId: CommandId
get() = commandId
override val subCommandId: Int
get() = subCommandId
}
interface PacketId {
val commandId: Int // ushort actually
internal interface PacketId {
val commandId: CommandId // ushort actually
val subCommandId: Int // ushort actually
}
object NullPacketId : PacketId {
override val commandId: Int
internal object NullPacketId : PacketId {
override val commandId: CommandId
get() = error("uninitialized")
override val subCommandId: Int
get() = error("uninitialized")
......
......@@ -33,6 +33,8 @@ abstract class DeviceInfo(
abstract val wifiSSID: ByteArray?
abstract val imsiMd5: ByteArray
abstract val imei: String
abstract val ksid: String
abstract val ipAddress: String
......
......@@ -26,6 +26,8 @@ actual class SystemDeviceInfo actual constructor(context: Context) : DeviceInfo(
@UseExperimental(ExperimentalUnsignedTypes::class)
override val imsiMd5: ByteArray
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 androidId: ByteArray get() = "QSR1.190920.001".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