Selaa lähdekoodia

小更新,由于包含敏感信息,不再更新 XposedLog

akemimadoka 6 vuotta sitten
vanhempi
sitoutus
cb21279bfe
6 muutettua tiedostoa jossa 60 lisäystä ja 23 poistoa
  1. 1 0
      Docs/研究.md
  2. 2 5
      YumeBot/CMakeLists.txt
  3. 19 5
      YumeBot/Misc.h
  4. 32 8
      YumeBot/Request.h
  5. 5 5
      YumeBot/Tlv.h
  6. 1 0
      conanfile.txt

+ 1 - 0
Docs/研究.md

@@ -32,6 +32,7 @@ tgtgt_key = Md5(随机 16 字节 + IMEI)
 MsgCookie
 ----
 利用 Xposed 获取了 MsgCookie 信息,由获取的信息可知,msgCookie 由任意不附带 msgCookie 的第一个请求获取,之后用于登录等其他请求,不再尝试接收新的 msgCookie,始终保持相同,不会进行持久化保存
+
 Xposed 获取的 MsgCookie 信息详见 XposedLog.txt
 
 安卓 apk 签名获取

+ 2 - 5
YumeBot/CMakeLists.txt

@@ -18,19 +18,16 @@ set(HEADERS
 
 add_library(YumeBot ${SOURCE_FILES} ${HEADERS})
 
-find_package(OpenSSL REQUIRED)
-
 target_compile_features(YumeBot PUBLIC
     cxx_std_20)
 
 target_include_directories(YumeBot INTERFACE
     $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
-    $<INSTALL_INTERFACE:.>
-    PRIVATE ${OPENSSL_INCLUDE_DIR})
+    $<INSTALL_INTERFACE:include>)
 
 target_link_libraries(YumeBot
     PUBLIC CONAN_PKG::Cafe
-    PRIVATE ${OPENSSL_LIBRARIES})
+    PRIVATE CONAN_PKG::OpenSSL)
 
 install(TARGETS YumeBot
     EXPORT YumeBot)

+ 19 - 5
YumeBot/Misc.h

@@ -1,8 +1,12 @@
 #pragma once
 #include <Cafe/Encoding/CodePage/UTF-8.h>
+#include <ctime>
 
 namespace YumeBot
 {
+	using UsingString = Cafe::Encoding::String<Cafe::Encoding::CodePage::Utf8>;
+	using UsingStringView = Cafe::Encoding::StringView<Cafe::Encoding::CodePage::Utf8>;
+
 	constexpr std::uint32_t DefaultAppId = 537039093;
 	/// @remark 使用短信登录时为 3
 	constexpr std::uint32_t DefualtSigSrc = 1;
@@ -18,8 +22,15 @@ namespace YumeBot
 
 		constexpr bool IsUnspecified() const noexcept
 		{
-			return std::all_of(std::begin(Content), std::end(Content),
-			                   [](std::uint8_t value) { return value == 0; });
+			for (auto item : Content)
+			{
+				if (item)
+				{
+					return false;
+				}
+			}
+
+			return true;
 		}
 	};
 
@@ -63,10 +74,13 @@ namespace YumeBot
 
 	constexpr auto SdkVersion = CAFE_UTF8_SV("5.2.2.98");
 
+	enum class SsoVersion
+	{
+		Version8 = 8,
+		Version9 = 9
+	};
+
 	static_assert(
 	    std::numeric_limits<float>::is_iec559 && std::numeric_limits<double>::is_iec559,
 	    "Jce assumed float and double fulfill the requirements of IEEE 754(IEC 559) standard.");
-
-	using UsingString = Cafe::Encoding::String<Cafe::Encoding::CodePage::Utf8>;
-	using UsingStringView = Cafe::Encoding::StringView<Cafe::Encoding::CodePage::Utf8>;
 } // namespace YumeBot

+ 32 - 8
YumeBot/Request.h

@@ -29,7 +29,7 @@ namespace YumeBot::Request
 			Cryptography::Ecdh::GenerateKeyPair(gsl::make_span(PubKey), gsl::make_span(ShareKey));
 
 			std::random_device rd;
-			std::default_random_engine engine{ rd };
+			std::default_random_engine engine{ rd() };
 			std::uniform_int_distribution<> dist{ 0, std::numeric_limits<std::uint8_t>::max() };
 			std::generate(std::begin(RandomKey), std::end(RandomKey),
 			              [&] { return static_cast<std::byte>(dist(engine)); });
@@ -58,6 +58,8 @@ namespace YumeBot::Request
 		UsingString ApkVersion = DefaultApkVersion;
 		gsl::span<const std::byte> ApkSignature = gsl::as_bytes(gsl::make_span(Signature));
 
+		SsoVersion UsingSsoVersion = SsoVersion::Version8;
+
 		std::array<std::byte, 16> const& GetGuid() const
 		{
 			if (m_Guid.has_value())
@@ -69,7 +71,7 @@ namespace YumeBot::Request
 			std::array<std::byte, 16> result;
 			Cryptography::Md5::Calculate(gsl::as_bytes(tmp.GetView().GetTrimmedSpan()),
 			                             gsl::make_span(result));
-			return result;
+			return m_Guid.emplace(result);
 		}
 
 		std::size_t AcquireRequestSeq() const noexcept
@@ -83,7 +85,7 @@ namespace YumeBot::Request
 		}
 
 	private:
-		std::optional<std::array<std::byte, 16>> m_Guid;
+		mutable std::optional<std::array<std::byte, 16>> m_Guid;
 		mutable std::size_t m_RequestSeq{};
 		mutable std::size_t m_ClientSeq{};
 	};
@@ -133,9 +135,8 @@ namespace YumeBot::Request
 		/// @return Seq
 		template <typename T, std::uint16_t CmdValue, std::uint16_t SubCmdValue,
 		          EncryptType EncryptTypeValue>
-		std::size_t
-		WriteRequest(Cafe::Io::OutputStream* stream,
-		             RequestBase<T, CmdValue, SubCmdValue, EncryptTypeValue> const& request) const
+		std::size_t WriteRequest(Cafe::Io::OutputStream* stream,
+		                         RequestBase<T, CmdValue, SubCmdValue, EncryptTypeValue> const& request)
 		{
 			const auto seq = m_Context.AcquireRequestSeq();
 
@@ -226,11 +227,34 @@ namespace YumeBot::Request
 
 		void EncodeRequest(Cafe::Io::OutputStream* stream, gsl::span<const std::byte> const& request)
 		{
-			// TODO
+			if (m_Context.UsingSsoVersion == SsoVersion::Version8)
+			{
+				EncodeRequestV8(stream, request);
+			}
+			else
+			{
+				assert(m_Context.UsingSsoVersion == SsoVersion::Version9);
+				EncodeRequestV9(stream, request);
+			}
 		}
 
 	private:
 		RequestContext m_Context;
+
+		void EncodeRequestV8(Cafe::Io::OutputStream* stream, gsl::span<const std::byte> const& request)
+		{
+			constexpr std::uint32_t ssoVersion = static_cast<std::uint32_t>(SsoVersion::Version8);
+
+			Cafe::Io::BinaryWriter writer{ stream, std::endian::big };
+			writer.Write(ssoVersion);
+			writer.Write(std::uint8_t{}); // unknown byte
+			
+		}
+
+		void EncodeRequestV9(Cafe::Io::OutputStream* stream, gsl::span<const std::byte> const& request)
+		{
+			// TODO
+		}
 	};
 
 	struct RequestTGTGT : RequestBase<RequestTGTGT, 2064, 9, EncryptType::Ecdh>
@@ -245,7 +269,7 @@ namespace YumeBot::Request
 			tlvBuilder.WriteTlv(Tlv::TlvT<0x107>{ PicType, CapType, PicSize, RetType });
 			tlvBuilder.WriteTlv(Tlv::TlvT<0x116>{ Bitmap, GetSig, SubAppIdList });
 			tlvBuilder.WriteTlv(Tlv::TlvT<0x145>{ guid });
-			tlvBuilder.WriteTlv(Tlv::TlvT<0x154>{ seq });
+			tlvBuilder.WriteTlv(Tlv::TlvT<0x154>{ static_cast<std::uint32_t>(seq) });
 			tlvBuilder.WriteTlv(
 			    Tlv::TlvT<0x141>{ context.SimOperatorName, context.ConnectionType, context.Apn });
 			tlvBuilder.WriteTlv(Tlv::TlvT<0x8>{ 0, context.CurrentLocaleId, 0 });

+ 5 - 5
YumeBot/Tlv.h

@@ -29,7 +29,7 @@ namespace YumeBot::Tlv
 	{
 	};
 
-	template <>
+	template <std::uint16_t Cmd>
 	struct IsWritableTlvTrait<
 	    Cmd, std::void_t<decltype(TlvT<Cmd>::Write(std::declval<Cafe::Io::BinaryWriter&>()))>>
 	    : std::true_type
@@ -101,8 +101,8 @@ namespace YumeBot::Tlv
 
 			while (stream->GetAvailableBytes() > 4)
 			{
-				const auto cmd = m_Reader.Read<std::uint16_t>();
-				const auto bodySize = m_Reader.Read<std::uint16_t>();
+				const auto cmd = *m_Reader.Read<std::uint16_t>();
+				const auto bodySize = *m_Reader.Read<std::uint16_t>();
 				if (cmd == Cmd)
 				{
 					return TlvT<Cmd>::Read(m_Reader, bodySize);
@@ -352,7 +352,7 @@ namespace YumeBot::Tlv
 
 		static TlvT<0x108> Read(Cafe::Io::BinaryReader& reader, std::size_t bodySize)
 		{
-			TlvT<0x108> tlv{ { bodySize } };
+			TlvT<0x108> tlv{ std::vector<std::byte>(bodySize) };
 			reader.GetStream()->ReadBytes(gsl::make_span(tlv.Ksid));
 			return tlv;
 		}
@@ -923,7 +923,7 @@ namespace YumeBot::Tlv
 	{
 		static TlvT<0x305> Read(Cafe::Io::BinaryReader& reader, std::size_t bodySize)
 		{
-			TlvT<0x305> tlv{ { bodySize } };
+			TlvT<0x305> tlv{ std::vector<std::byte>(bodySize) };
 			reader.GetStream()->ReadBytes(gsl::make_span(tlv.SessionKey));
 			return tlv;
 		}

+ 1 - 0
conanfile.txt

@@ -1,6 +1,7 @@
 [requires]
 Cafe/0.1@Chino/Cafe
 Catch2/2.9.2@catchorg/stable
+OpenSSL/1.1.1d@conan/stable
 
 [generators]
 cmake