mirror of
https://github.com/HolographicHat/Yae.git
synced 2026-03-29 07:49:46 +08:00
added PlayerStoreNotify
This commit is contained in:
@@ -13,6 +13,26 @@
|
||||
CRITICAL_SECTION CriticalSection;
|
||||
void SetBreakpoint(HANDLE thread, uintptr_t address, bool enable, uint8_t index = 0);
|
||||
|
||||
namespace
|
||||
{
|
||||
PacketType GetPacketType(const PacketMeta* packet)
|
||||
{
|
||||
using namespace Globals;
|
||||
const auto cmdid = packet->CmdId;
|
||||
|
||||
if (AchievementId && cmdid == AchievementId)
|
||||
return PacketType::Achivement;
|
||||
|
||||
if (AchievementIdSet.contains(cmdid) && packet->DataLength > 500)
|
||||
return PacketType::Achivement;
|
||||
|
||||
if (PlayerStoreId && cmdid == PlayerStoreId)
|
||||
return PacketType::Inventory;
|
||||
|
||||
return PacketType::None;
|
||||
}
|
||||
}
|
||||
|
||||
namespace Hook {
|
||||
|
||||
|
||||
@@ -27,41 +47,41 @@ namespace Hook {
|
||||
SetBreakpoint((HANDLE)-2, Offset.BitConverter_ToUInt16, true);
|
||||
LeaveCriticalSection(&CriticalSection);
|
||||
|
||||
const auto packet = reinterpret_cast<PacketMeta*>(val->data());
|
||||
if (ret != 0xAB89)
|
||||
return ret;
|
||||
|
||||
auto CheckPacket = [](const PacketMeta* packet) -> bool {
|
||||
const auto cmdid = _byteswap_ushort(packet->CmdId);
|
||||
const auto dataLength = _byteswap_ulong(packet->DataLength);
|
||||
const auto packet = val->As<PacketMeta*>();
|
||||
const auto packetType = GetPacketType(packet);
|
||||
if (packetType == PacketType::None)
|
||||
return ret;
|
||||
|
||||
if (dataLength < 500) {
|
||||
return false;
|
||||
}
|
||||
#ifdef _DEBUG
|
||||
std::println("PacketType: {}", static_cast<uint8_t>(packetType));
|
||||
std::println("CmdId: {}", packet->CmdId);
|
||||
std::println("DataLength: {}", packet->m_DataLength);
|
||||
//std::println("Data: {}", Util::Base64Encode(packet->AsSpan()));
|
||||
#endif
|
||||
|
||||
if (CmdId != 0) {
|
||||
return cmdid == CmdId;
|
||||
}
|
||||
if (!MessagePipe.Write(packetType))
|
||||
Util::Win32ErrorDialog(1002, GetLastError());
|
||||
|
||||
return DynamicCmdIds.contains(cmdid);
|
||||
};
|
||||
if (!MessagePipe.Write(packet->DataLength))
|
||||
Util::Win32ErrorDialog(1003, GetLastError());
|
||||
|
||||
using namespace Globals;
|
||||
if (ret == 0xAB89 && CheckPacket(packet))
|
||||
if (!MessagePipe.Write(packet->AsSpan()))
|
||||
Util::Win32ErrorDialog(1004, GetLastError());
|
||||
|
||||
if (!AchievementsWritten)
|
||||
AchievementsWritten = packetType == PacketType::Achivement;
|
||||
|
||||
if (packetType == PacketType::Inventory)
|
||||
PlayerStoreWrittenCount++;
|
||||
|
||||
if (AchievementsWritten && PlayerStoreWrittenCount == 2)
|
||||
{
|
||||
const auto headLength = _byteswap_ushort(packet->HeaderLength);
|
||||
const auto dataLength = _byteswap_ulong(packet->DataLength);
|
||||
|
||||
std::println("CmdId: {}", _byteswap_ushort(packet->CmdId));
|
||||
std::println("DataLength: {}", dataLength);
|
||||
|
||||
const auto base64 = Util::Base64Encode(packet->Data + headLength, dataLength) + "\n";
|
||||
std::println("Base64: {}", base64);
|
||||
|
||||
#ifdef _DEBUG
|
||||
system("pause");
|
||||
#endif
|
||||
|
||||
WriteFile(MessagePipe, base64.c_str(), (DWORD)base64.length(), nullptr, nullptr);
|
||||
CloseHandle(MessagePipe);
|
||||
ExitProcess(0);
|
||||
}
|
||||
|
||||
@@ -97,11 +117,6 @@ void SetBreakpoint(HANDLE thread, uintptr_t address, bool enable, uint8_t index)
|
||||
return;
|
||||
}
|
||||
|
||||
if (!BaseAddress || Offset.BitConverter_ToUInt16 <= BaseAddress) {
|
||||
// not initialized yet
|
||||
return;
|
||||
}
|
||||
|
||||
CONTEXT ctx{};
|
||||
ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;
|
||||
GetThreadContext(thread, &ctx);
|
||||
@@ -120,6 +135,7 @@ DWORD __stdcall ThreadProc(LPVOID hInstance)
|
||||
#ifdef _DEBUG
|
||||
AllocConsole();
|
||||
freopen_s((FILE**)stdout, "CONOUT$", "w", stdout);
|
||||
system("pause");
|
||||
#endif
|
||||
InitializeCriticalSection(&CriticalSection);
|
||||
|
||||
@@ -132,10 +148,11 @@ DWORD __stdcall ThreadProc(LPVOID hInstance)
|
||||
SwitchToThread();
|
||||
}
|
||||
|
||||
initFuture.get();
|
||||
if (!initFuture.get())
|
||||
ExitProcess(0);
|
||||
|
||||
MessagePipe = CreateFileA(R"(\\.\pipe\YaeAchievementPipe)", GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, 0, nullptr);
|
||||
if (MessagePipe == INVALID_HANDLE_VALUE)
|
||||
if (!MessagePipe)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
std::println("CreateFile failed: {}", GetLastError());
|
||||
|
||||
Reference in New Issue
Block a user