From 4c0443d2c214ed64402319ca84949b26b9da4699 Mon Sep 17 00:00:00 2001 From: ptmaster <52694802+lty2008one@users.noreply.github.com> Date: Tue, 26 Mar 2024 13:30:54 +0000 Subject: [PATCH 01/22] Add Qr plugins Standard Interface --- src/patches/qr.cpp | 40 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/src/patches/qr.cpp b/src/patches/qr.cpp index c8a1af4..3108e2b 100644 --- a/src/patches/qr.cpp +++ b/src/patches/qr.cpp @@ -18,13 +18,18 @@ extern Keybindings QR_DATA_READ; extern Keybindings QR_IMAGE_READ; extern char accessCode1[21]; extern char accessCode2[21]; +extern std::vector plugins; + +typedef bool CheckQrEvent(); +typedef std::vector GetQrEvent(); namespace patches::Qr { enum class State { Ready, CopyWait }; -enum class Mode { Card, Data, Image }; -State gState = State::Ready; -Mode gMode = Mode::Card; +enum class Mode { Card, Data, Image, Plugin }; +State gState = State::Ready; +Mode gMode = Mode::Card; +HMOULDE gPlugin; std::string accessCode; bool qrEnabled = true; @@ -107,7 +112,7 @@ HOOK_DYNAMIC (i64, __fastcall, copy_data, i64, void *dest, int length) { memcpy (dest, byteBuffer.data (), byteBuffer.size ()); gState = State::Ready; return byteBuffer.size (); - } else { + } else if (gMode == Mode::Data) { std::string imagePath = ""; if (config_ptr) { @@ -150,6 +155,22 @@ HOOK_DYNAMIC (i64, __fastcall, copy_data, i64, void *dest, int length) { memcpy (dest, byteData.data (), dataSize); gState = State::Ready; return dataSize; + } else if (gMode == Mode::Plugin) { + FARPROC getQrEvent = GetProcAddress (gPlugin, "getQr"); + if (getQrEvent) { + auto byteData = ((GetQrEvent*) getQrEvent) (); + std::cout << "Plugin QR: " << ZXing::ToHex (byteData) << std::endl; + auto dataSize = byteData.size (); + + memcpy (dest, byteData.data (), dataSize); + gState = State::Ready; + gMode = Mode::Card; + return dataSize; + } else { + gState = State::Ready; + gMode = Mode::Card; + return 0; + } } } return 0; @@ -183,6 +204,17 @@ Update () { std::cout << "Insert" << std::endl; gState = State::CopyWait; gMode = Mode::Image; + } else { + for (auto plugin : plugins) { + FARPROC checkQrEvent = GetProcAddress (plugin, "checkQr"); + if (checkQrEvent && ((CheckQrEvent*) checkQrEvent) ()) { + std::cout << "Insert" << std::endl; + gState = State::CopyWait; + gMode = Mode::Plugin; + gPlugin = plugin; + break; + } + } } } } From b14349537d84add85e833ca27926f29780f1f4f7 Mon Sep 17 00:00:00 2001 From: ptmaster <52694802+lty2008one@users.noreply.github.com> Date: Tue, 26 Mar 2024 13:35:20 +0000 Subject: [PATCH 02/22] fix: Wrong spell --- src/patches/qr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/patches/qr.cpp b/src/patches/qr.cpp index 3108e2b..aacbefe 100644 --- a/src/patches/qr.cpp +++ b/src/patches/qr.cpp @@ -29,7 +29,7 @@ enum class State { Ready, CopyWait }; enum class Mode { Card, Data, Image, Plugin }; State gState = State::Ready; Mode gMode = Mode::Card; -HMOULDE gPlugin; +HMODULE gPlugin; std::string accessCode; bool qrEnabled = true; From 978487b8658eb4b27f45d6bf9be4a47ba8fced74 Mon Sep 17 00:00:00 2001 From: ptmaster <52694802+lty2008one@users.noreply.github.com> Date: Tue, 26 Mar 2024 13:48:22 +0000 Subject: [PATCH 03/22] fix --- src/patches/qr.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/patches/qr.cpp b/src/patches/qr.cpp index aacbefe..ca97464 100644 --- a/src/patches/qr.cpp +++ b/src/patches/qr.cpp @@ -158,11 +158,18 @@ HOOK_DYNAMIC (i64, __fastcall, copy_data, i64, void *dest, int length) { } else if (gMode == Mode::Plugin) { FARPROC getQrEvent = GetProcAddress (gPlugin, "getQr"); if (getQrEvent) { - auto byteData = ((GetQrEvent*) getQrEvent) (); - std::cout << "Plugin QR: " << ZXing::ToHex (byteData) << std::endl; - auto dataSize = byteData.size (); + std::vector byteBuffer = ((GetQrEvent*) getQrEvent) (); - memcpy (dest, byteData.data (), dataSize); + std::stringstream ss; + ss << std::hex << std::setfill('0'); + for (const auto& byte : bytes) { + ss << std::setw(2) << static_cast(byte); + } + + std::cout << "Plugin QR: " << ss.str() << std::endl; + auto dataSize = byteBuffer.size(); + + memcpy (dest, byteBuffer.data(), dataSize); gState = State::Ready; gMode = Mode::Card; return dataSize; From 8a935c22eaf9e4b259ce6de81fed3895af410724 Mon Sep 17 00:00:00 2001 From: ptmaster <52694802+lty2008one@users.noreply.github.com> Date: Tue, 26 Mar 2024 13:53:16 +0000 Subject: [PATCH 04/22] fix --- src/patches/qr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/patches/qr.cpp b/src/patches/qr.cpp index ca97464..48c2f1a 100644 --- a/src/patches/qr.cpp +++ b/src/patches/qr.cpp @@ -162,7 +162,7 @@ HOOK_DYNAMIC (i64, __fastcall, copy_data, i64, void *dest, int length) { std::stringstream ss; ss << std::hex << std::setfill('0'); - for (const auto& byte : bytes) { + for (const auto& byte : byteBuffer) { ss << std::setw(2) << static_cast(byte); } From 20c36966beb32d8884cf14972f9931703a16bb1a Mon Sep 17 00:00:00 2001 From: ptmaster <52694802+lty2008one@users.noreply.github.com> Date: Wed, 27 Mar 2024 21:10:53 +0800 Subject: [PATCH 05/22] Update qr.cpp --- src/patches/qr.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/patches/qr.cpp b/src/patches/qr.cpp index 48c2f1a..7a7a20e 100644 --- a/src/patches/qr.cpp +++ b/src/patches/qr.cpp @@ -112,7 +112,7 @@ HOOK_DYNAMIC (i64, __fastcall, copy_data, i64, void *dest, int length) { memcpy (dest, byteBuffer.data (), byteBuffer.size ()); gState = State::Ready; return byteBuffer.size (); - } else if (gMode == Mode::Data) { + } else if (gMode == Mode::Image) { std::string imagePath = ""; if (config_ptr) { @@ -170,6 +170,7 @@ HOOK_DYNAMIC (i64, __fastcall, copy_data, i64, void *dest, int length) { auto dataSize = byteBuffer.size(); memcpy (dest, byteBuffer.data(), dataSize); + std::cout << "Data consumed! len = " << dataSize << std::endl; gState = State::Ready; gMode = Mode::Card; return dataSize; From 3052df3fcb974a3d30e844a576e5914c2719e0bd Mon Sep 17 00:00:00 2001 From: ptmaster <52694802+lty2008one@users.noreply.github.com> Date: Wed, 27 Mar 2024 21:38:53 +0800 Subject: [PATCH 06/22] Update qr.cpp --- src/patches/qr.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/patches/qr.cpp b/src/patches/qr.cpp index 7a7a20e..9e97295 100644 --- a/src/patches/qr.cpp +++ b/src/patches/qr.cpp @@ -149,10 +149,11 @@ HOOK_DYNAMIC (i64, __fastcall, copy_data, i64, void *dest, int length) { std::cout << "Valid" << std::endl; auto byteData = result.bytes (); - std::cout << ZXing::ToHex (byteData) << std::endl; + std::cout << "Image QR: " << ZXing::ToHex (byteData) << std::endl; auto dataSize = byteData.size (); memcpy (dest, byteData.data (), dataSize); + std::cout << "Data consumed! len = " << dataSize << std::endl; gState = State::Ready; return dataSize; } else if (gMode == Mode::Plugin) { @@ -161,9 +162,9 @@ HOOK_DYNAMIC (i64, __fastcall, copy_data, i64, void *dest, int length) { std::vector byteBuffer = ((GetQrEvent*) getQrEvent) (); std::stringstream ss; - ss << std::hex << std::setfill('0'); + ss << std::hex << std::uppercase << std::setfill('0'); for (const auto& byte : byteBuffer) { - ss << std::setw(2) << static_cast(byte); + ss << std::setw(2) << static_cast(byte) << " "; } std::cout << "Plugin QR: " << ss.str() << std::endl; From 9c12c6832f11fd77ed23ab7b97d87367d1ce8931 Mon Sep 17 00:00:00 2001 From: ptmaster <52694802+lty2008one@users.noreply.github.com> Date: Wed, 27 Mar 2024 22:28:05 +0800 Subject: [PATCH 07/22] Update qr.cpp --- src/patches/qr.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/patches/qr.cpp b/src/patches/qr.cpp index 9e97295..05a7ec9 100644 --- a/src/patches/qr.cpp +++ b/src/patches/qr.cpp @@ -20,6 +20,7 @@ extern char accessCode1[21]; extern char accessCode2[21]; extern std::vector plugins; +typedef void event (); typedef bool CheckQrEvent(); typedef std::vector GetQrEvent(); @@ -181,6 +182,11 @@ HOOK_DYNAMIC (i64, __fastcall, copy_data, i64, void *dest, int length) { return 0; } } + } else { + for (auto plugin : plugins) { + FARPROC usingQrEvent = GetProcAddress (plugin, "usingQr"); + if (usingQrEvent) ((event*) usingQrEvent) (); + } } return 0; } From 046f6f5e1f14ab1d612b9b78b6645ac6c81e1a04 Mon Sep 17 00:00:00 2001 From: ptmaster <52694802+lty2008one@users.noreply.github.com> Date: Wed, 27 Mar 2024 22:39:26 +0800 Subject: [PATCH 08/22] Update qr.cpp --- src/patches/qr.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/patches/qr.cpp b/src/patches/qr.cpp index 05a7ec9..5ffc088 100644 --- a/src/patches/qr.cpp +++ b/src/patches/qr.cpp @@ -34,6 +34,9 @@ HMODULE gPlugin; std::string accessCode; bool qrEnabled = true; +std::vector qrPlugins; +bool qrPluginRegistered = false; + HOOK_DYNAMIC (char, __fastcall, qrInit, i64) { return 1; } HOOK_DYNAMIC (char, __fastcall, qrRead, i64 a1) { *(DWORD *)(a1 + 40) = 1; @@ -182,8 +185,8 @@ HOOK_DYNAMIC (i64, __fastcall, copy_data, i64, void *dest, int length) { return 0; } } - } else { - for (auto plugin : plugins) { + } else if (qrPluginRegistered) { + for (auto plugin : qrPlugins) { FARPROC usingQrEvent = GetProcAddress (plugin, "usingQr"); if (usingQrEvent) ((event*) usingQrEvent) (); } @@ -219,8 +222,8 @@ Update () { std::cout << "Insert" << std::endl; gState = State::CopyWait; gMode = Mode::Image; - } else { - for (auto plugin : plugins) { + } else if (qrPluginRegistered) { + for (auto plugin : qrPlugins) { FARPROC checkQrEvent = GetProcAddress (plugin, "checkQr"); if (checkQrEvent && ((CheckQrEvent*) checkQrEvent) ()) { std::cout << "Insert" << std::endl; @@ -253,6 +256,11 @@ Init () { std::cout << "[Init] QR emulation disabled" << std::endl; return; } + for (auto plugin : plugins) { + FARPROC usingQrEvent = GetProcAddress (plugin, "usingQr"); + if (usingQrEvent) qrPlugins.push_back(plugin); + } + if (qrPlugins.size() > 0) qrPluginRegistered = true; SetConsoleOutputCP (CP_UTF8); auto amHandle = (u64)GetModuleHandle ("AMFrameWork.dll"); switch (gameVersion) { From f61f03759f71ded6b05a55711274d854177ec459 Mon Sep 17 00:00:00 2001 From: ptmaster <52694802+lty2008one@users.noreply.github.com> Date: Thu, 28 Mar 2024 11:29:42 +0800 Subject: [PATCH 09/22] Update qr.cpp test --- src/patches/qr.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/patches/qr.cpp b/src/patches/qr.cpp index 5ffc088..47a1938 100644 --- a/src/patches/qr.cpp +++ b/src/patches/qr.cpp @@ -22,7 +22,7 @@ extern std::vector plugins; typedef void event (); typedef bool CheckQrEvent(); -typedef std::vector GetQrEvent(); +typedef std::vector GetQrEvent(); namespace patches::Qr { @@ -163,7 +163,8 @@ HOOK_DYNAMIC (i64, __fastcall, copy_data, i64, void *dest, int length) { } else if (gMode == Mode::Plugin) { FARPROC getQrEvent = GetProcAddress (gPlugin, "getQr"); if (getQrEvent) { - std::vector byteBuffer = ((GetQrEvent*) getQrEvent) (); + std::vector byteBuffer1 = ((GetQrEvent*) getQrEvent) (); + std::vector byteBuffer = {0x53, 0x31, 0x32, 0x00, 0x01, 0x26, 0x7D, 0xA4, 0x3C, 0x34, 0xEC, 0x3E, 0x7F, 0xA9, 0x52, 0x34, 0xFF, 0xAF, 0x94, 0xA4, 0x99, 0xFE, 0xDD, 0x47, 0x22, 0xB3, 0xDF, 0xA4, 0x4C, 0x9D, 0xAB, 0x10, 0x22, 0x91, 0xDA, 0x16, 0xF1}; std::stringstream ss; ss << std::hex << std::uppercase << std::setfill('0'); From efd0aeb98a52bdcde65e36979099111c29a26400 Mon Sep 17 00:00:00 2001 From: ptmaster <52694802+lty2008one@users.noreply.github.com> Date: Thu, 28 Mar 2024 14:09:20 +0800 Subject: [PATCH 10/22] Update qr.cpp no read --- src/patches/qr.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/patches/qr.cpp b/src/patches/qr.cpp index 47a1938..93d8acf 100644 --- a/src/patches/qr.cpp +++ b/src/patches/qr.cpp @@ -164,7 +164,7 @@ HOOK_DYNAMIC (i64, __fastcall, copy_data, i64, void *dest, int length) { FARPROC getQrEvent = GetProcAddress (gPlugin, "getQr"); if (getQrEvent) { std::vector byteBuffer1 = ((GetQrEvent*) getQrEvent) (); - std::vector byteBuffer = {0x53, 0x31, 0x32, 0x00, 0x01, 0x26, 0x7D, 0xA4, 0x3C, 0x34, 0xEC, 0x3E, 0x7F, 0xA9, 0x52, 0x34, 0xFF, 0xAF, 0x94, 0xA4, 0x99, 0xFE, 0xDD, 0x47, 0x22, 0xB3, 0xDF, 0xA4, 0x4C, 0x9D, 0xAB, 0x10, 0x22, 0x91, 0xDA, 0x16, 0xF1}; + // std::vector byteBuffer = {0x53, 0x31, 0x32, 0x00, 0x01, 0x26, 0x7D, 0xA4, 0x3C, 0x34, 0xEC, 0x3E, 0x7F, 0xA9, 0x52, 0x34, 0xFF, 0xAF, 0x94, 0xA4, 0x99, 0xFE, 0xDD, 0x47, 0x22, 0xB3, 0xDF, 0xA4, 0x4C, 0x9D, 0xAB, 0x10, 0x22, 0x91, 0xDA, 0x16, 0xF1}; std::stringstream ss; ss << std::hex << std::uppercase << std::setfill('0'); @@ -175,11 +175,11 @@ HOOK_DYNAMIC (i64, __fastcall, copy_data, i64, void *dest, int length) { std::cout << "Plugin QR: " << ss.str() << std::endl; auto dataSize = byteBuffer.size(); - memcpy (dest, byteBuffer.data(), dataSize); + // memcpy (dest, byteBuffer.data(), dataSize); std::cout << "Data consumed! len = " << dataSize << std::endl; gState = State::Ready; gMode = Mode::Card; - return dataSize; + return 0; } else { gState = State::Ready; gMode = Mode::Card; From c18b3a55637e2657e34d26ed29f4d8093170e91d Mon Sep 17 00:00:00 2001 From: ptmaster <52694802+lty2008one@users.noreply.github.com> Date: Thu, 28 Mar 2024 14:13:52 +0800 Subject: [PATCH 11/22] Update qr.cpp --- src/patches/qr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/patches/qr.cpp b/src/patches/qr.cpp index 93d8acf..6924251 100644 --- a/src/patches/qr.cpp +++ b/src/patches/qr.cpp @@ -163,7 +163,7 @@ HOOK_DYNAMIC (i64, __fastcall, copy_data, i64, void *dest, int length) { } else if (gMode == Mode::Plugin) { FARPROC getQrEvent = GetProcAddress (gPlugin, "getQr"); if (getQrEvent) { - std::vector byteBuffer1 = ((GetQrEvent*) getQrEvent) (); + std::vector byteBuffer = ((GetQrEvent*) getQrEvent) (); // std::vector byteBuffer = {0x53, 0x31, 0x32, 0x00, 0x01, 0x26, 0x7D, 0xA4, 0x3C, 0x34, 0xEC, 0x3E, 0x7F, 0xA9, 0x52, 0x34, 0xFF, 0xAF, 0x94, 0xA4, 0x99, 0xFE, 0xDD, 0x47, 0x22, 0xB3, 0xDF, 0xA4, 0x4C, 0x9D, 0xAB, 0x10, 0x22, 0x91, 0xDA, 0x16, 0xF1}; std::stringstream ss; From 60de0a7702943a0764994e48d9c14d929a4091ab Mon Sep 17 00:00:00 2001 From: gyt4 <158863045+gyt4@users.noreply.github.com> Date: Thu, 28 Mar 2024 15:34:29 +0800 Subject: [PATCH 12/22] Update qr.cpp --- src/patches/qr.cpp | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/src/patches/qr.cpp b/src/patches/qr.cpp index 6924251..e522019 100644 --- a/src/patches/qr.cpp +++ b/src/patches/qr.cpp @@ -163,23 +163,15 @@ HOOK_DYNAMIC (i64, __fastcall, copy_data, i64, void *dest, int length) { } else if (gMode == Mode::Plugin) { FARPROC getQrEvent = GetProcAddress (gPlugin, "getQr"); if (getQrEvent) { - std::vector byteBuffer = ((GetQrEvent*) getQrEvent) (); - // std::vector byteBuffer = {0x53, 0x31, 0x32, 0x00, 0x01, 0x26, 0x7D, 0xA4, 0x3C, 0x34, 0xEC, 0x3E, 0x7F, 0xA9, 0x52, 0x34, 0xFF, 0xAF, 0x94, 0xA4, 0x99, 0xFE, 0xDD, 0x47, 0x22, 0xB3, 0xDF, 0xA4, 0x4C, 0x9D, 0xAB, 0x10, 0x22, 0x91, 0xDA, 0x16, 0xF1}; + // std::vector byteBuffer = ((GetQrEvent*) getQrEvent) (); + unsigned char tmp_data[37] = {0x53, 0x31, 0x32, 0x00, 0x01, 0x26, 0x7d, 0xa4, 0x3c, 0x34, 0xec, 0x3e, 0x7f, 0xa9, 0x52, 0x34, 0xff, 0xaf, 0x94, 0xa4, 0x99, 0xfe, 0xdd, 0x47, 0x22, 0xb3, 0xdf, 0xa4, 0x4c, 0x9d, 0xab, 0x10, 0x22, 0x91, 0xda, 0x16, 0xf1}; + - std::stringstream ss; - ss << std::hex << std::uppercase << std::setfill('0'); - for (const auto& byte : byteBuffer) { - ss << std::setw(2) << static_cast(byte) << " "; - } - - std::cout << "Plugin QR: " << ss.str() << std::endl; - auto dataSize = byteBuffer.size(); - - // memcpy (dest, byteBuffer.data(), dataSize); + memcpy (dest, tmp_data, 37); std::cout << "Data consumed! len = " << dataSize << std::endl; gState = State::Ready; gMode = Mode::Card; - return 0; + return 37; } else { gState = State::Ready; gMode = Mode::Card; From 7ede13e6269784f8f1e92c7224a100aa84e9ac0b Mon Sep 17 00:00:00 2001 From: gyt4 <158863045+gyt4@users.noreply.github.com> Date: Thu, 28 Mar 2024 15:44:41 +0800 Subject: [PATCH 13/22] Update qr.cpp --- src/patches/qr.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/patches/qr.cpp b/src/patches/qr.cpp index e522019..d9e2d67 100644 --- a/src/patches/qr.cpp +++ b/src/patches/qr.cpp @@ -168,7 +168,6 @@ HOOK_DYNAMIC (i64, __fastcall, copy_data, i64, void *dest, int length) { memcpy (dest, tmp_data, 37); - std::cout << "Data consumed! len = " << dataSize << std::endl; gState = State::Ready; gMode = Mode::Card; return 37; From b69726fa9bcc442c14bad47d485d16bcecbe8601 Mon Sep 17 00:00:00 2001 From: gyt4 <158863045+gyt4@users.noreply.github.com> Date: Thu, 28 Mar 2024 15:53:50 +0800 Subject: [PATCH 14/22] Update qr.cpp --- src/patches/qr.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/patches/qr.cpp b/src/patches/qr.cpp index d9e2d67..d038e8e 100644 --- a/src/patches/qr.cpp +++ b/src/patches/qr.cpp @@ -22,7 +22,7 @@ extern std::vector plugins; typedef void event (); typedef bool CheckQrEvent(); -typedef std::vector GetQrEvent(); +typedef int GetQrEvent(char *buf_); namespace patches::Qr { @@ -163,14 +163,12 @@ HOOK_DYNAMIC (i64, __fastcall, copy_data, i64, void *dest, int length) { } else if (gMode == Mode::Plugin) { FARPROC getQrEvent = GetProcAddress (gPlugin, "getQr"); if (getQrEvent) { - // std::vector byteBuffer = ((GetQrEvent*) getQrEvent) (); - unsigned char tmp_data[37] = {0x53, 0x31, 0x32, 0x00, 0x01, 0x26, 0x7d, 0xa4, 0x3c, 0x34, 0xec, 0x3e, 0x7f, 0xa9, 0x52, 0x34, 0xff, 0xaf, 0x94, 0xa4, 0x99, 0xfe, 0xdd, 0x47, 0x22, 0xb3, 0xdf, 0xa4, 0x4c, 0x9d, 0xab, 0x10, 0x22, 0x91, 0xda, 0x16, 0xf1}; - - - memcpy (dest, tmp_data, 37); + unsigned char plugin_data[10086] ; + int buf_len = ((GetQrEvent*) getQrEvent) (plugin_data); + memcpy (dest, plugin_data, buf_len); gState = State::Ready; gMode = Mode::Card; - return 37; + return buf_len; } else { gState = State::Ready; gMode = Mode::Card; From c72368f547a8ed2deb7302d6df424abb070b016e Mon Sep 17 00:00:00 2001 From: gyt4 <158863045+gyt4@users.noreply.github.com> Date: Thu, 28 Mar 2024 15:59:39 +0800 Subject: [PATCH 15/22] Update qr.cpp --- src/patches/qr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/patches/qr.cpp b/src/patches/qr.cpp index d038e8e..c9d61d2 100644 --- a/src/patches/qr.cpp +++ b/src/patches/qr.cpp @@ -22,7 +22,7 @@ extern std::vector plugins; typedef void event (); typedef bool CheckQrEvent(); -typedef int GetQrEvent(char *buf_); +typedef int GetQrEvent(unsigned char *buf_); namespace patches::Qr { From 8572c9876d8cfbddc2546a964d529ef8681b3ddf Mon Sep 17 00:00:00 2001 From: ptmaster <52694802+lty2008one@users.noreply.github.com> Date: Thu, 28 Mar 2024 16:24:12 +0800 Subject: [PATCH 16/22] Update qr.cpp --- src/patches/qr.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/patches/qr.cpp b/src/patches/qr.cpp index c9d61d2..91ac25c 100644 --- a/src/patches/qr.cpp +++ b/src/patches/qr.cpp @@ -22,7 +22,7 @@ extern std::vector plugins; typedef void event (); typedef bool CheckQrEvent(); -typedef int GetQrEvent(unsigned char *buf_); +typedef int GetQrEvent(int, unsigned char*); namespace patches::Qr { @@ -163,15 +163,15 @@ HOOK_DYNAMIC (i64, __fastcall, copy_data, i64, void *dest, int length) { } else if (gMode == Mode::Plugin) { FARPROC getQrEvent = GetProcAddress (gPlugin, "getQr"); if (getQrEvent) { - unsigned char plugin_data[10086] ; - int buf_len = ((GetQrEvent*) getQrEvent) (plugin_data); - memcpy (dest, plugin_data, buf_len); + unsigned char plugin_data[length]; + int buf_len = ((GetQrEvent*) getQrEvent) (length, plugin_data); + if (buf_len > 0) { + memcpy (dest, plugin_data, buf_len); + } gState = State::Ready; - gMode = Mode::Card; return buf_len; } else { gState = State::Ready; - gMode = Mode::Card; return 0; } } From b084fe5b13382b58c1451e89baa0efe8edc8b0e9 Mon Sep 17 00:00:00 2001 From: ptmaster <52694802+lty2008one@users.noreply.github.com> Date: Thu, 28 Mar 2024 16:45:13 +0800 Subject: [PATCH 17/22] Update qr.cpp --- src/patches/qr.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/patches/qr.cpp b/src/patches/qr.cpp index 91ac25c..9154f83 100644 --- a/src/patches/qr.cpp +++ b/src/patches/qr.cpp @@ -153,11 +153,10 @@ HOOK_DYNAMIC (i64, __fastcall, copy_data, i64, void *dest, int length) { std::cout << "Valid" << std::endl; auto byteData = result.bytes (); - std::cout << "Image QR: " << ZXing::ToHex (byteData) << std::endl; + std::cout << ZXing::ToHex (byteData) << std::endl; auto dataSize = byteData.size (); memcpy (dest, byteData.data (), dataSize); - std::cout << "Data consumed! len = " << dataSize << std::endl; gState = State::Ready; return dataSize; } else if (gMode == Mode::Plugin) { From bbf71166587319e3ac1fd11b5051b966190d5996 Mon Sep 17 00:00:00 2001 From: ptmaster <52694802+lty2008one@users.noreply.github.com> Date: Thu, 28 Mar 2024 17:18:58 +0800 Subject: [PATCH 18/22] Update qr.cpp --- src/patches/qr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/patches/qr.cpp b/src/patches/qr.cpp index 9154f83..f479b8e 100644 --- a/src/patches/qr.cpp +++ b/src/patches/qr.cpp @@ -164,7 +164,7 @@ HOOK_DYNAMIC (i64, __fastcall, copy_data, i64, void *dest, int length) { if (getQrEvent) { unsigned char plugin_data[length]; int buf_len = ((GetQrEvent*) getQrEvent) (length, plugin_data); - if (buf_len > 0) { + if (0 < buf_len && buf_len <= length) { memcpy (dest, plugin_data, buf_len); } gState = State::Ready; From bb8578b323f53ca6711800bef44588b25d07d63c Mon Sep 17 00:00:00 2001 From: ptmaster <52694802+lty2008one@users.noreply.github.com> Date: Thu, 28 Mar 2024 17:23:28 +0800 Subject: [PATCH 19/22] Update qr.cpp --- src/patches/qr.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/patches/qr.cpp b/src/patches/qr.cpp index f479b8e..e28628e 100644 --- a/src/patches/qr.cpp +++ b/src/patches/qr.cpp @@ -166,6 +166,9 @@ HOOK_DYNAMIC (i64, __fastcall, copy_data, i64, void *dest, int length) { int buf_len = ((GetQrEvent*) getQrEvent) (length, plugin_data); if (0 < buf_len && buf_len <= length) { memcpy (dest, plugin_data, buf_len); + } else { + std::cerr << "QR discard! Length invalid: " << buf_len << ", valid range: 0~" << length + << std::endl; } gState = State::Ready; return buf_len; From 1a51074bb8695e5a9daa7cca1379f7af021b2615 Mon Sep 17 00:00:00 2001 From: ptmaster <52694802+lty2008one@users.noreply.github.com> Date: Thu, 28 Mar 2024 19:37:39 +0800 Subject: [PATCH 20/22] Update qr.cpp --- src/patches/qr.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/patches/qr.cpp b/src/patches/qr.cpp index e28628e..a9c1d6a 100644 --- a/src/patches/qr.cpp +++ b/src/patches/qr.cpp @@ -252,7 +252,10 @@ Init () { FARPROC usingQrEvent = GetProcAddress (plugin, "usingQr"); if (usingQrEvent) qrPlugins.push_back(plugin); } - if (qrPlugins.size() > 0) qrPluginRegistered = true; + if (qrPlugins.size() > 0) { + std::cout << "QR Plugin Found!" << std::endl; + qrPluginRegistered = true; + } SetConsoleOutputCP (CP_UTF8); auto amHandle = (u64)GetModuleHandle ("AMFrameWork.dll"); switch (gameVersion) { From 3ce03ed28d49a36b1c0f05a207ef4669408d2b3b Mon Sep 17 00:00:00 2001 From: ptmaster <52694802+lty2008one@users.noreply.github.com> Date: Sun, 31 Mar 2024 16:48:54 +0800 Subject: [PATCH 21/22] Update qr.cpp add QRData output --- src/patches/qr.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/patches/qr.cpp b/src/patches/qr.cpp index a9c1d6a..daa98c6 100644 --- a/src/patches/qr.cpp +++ b/src/patches/qr.cpp @@ -113,6 +113,11 @@ HOOK_DYNAMIC (i64, __fastcall, copy_data, i64, void *dest, int length) { byteBuffer.push_back (0xEE); byteBuffer.push_back (0xFF); + for (auto byteData : byteBuffer) { + std::cout << std::hex << std::uppercase << std::setfill('0') << std::setw(2) << static_cast(byteData) << " "; + } + std::cout << std::endl; + memcpy (dest, byteBuffer.data (), byteBuffer.size ()); gState = State::Ready; return byteBuffer.size (); @@ -165,6 +170,10 @@ HOOK_DYNAMIC (i64, __fastcall, copy_data, i64, void *dest, int length) { unsigned char plugin_data[length]; int buf_len = ((GetQrEvent*) getQrEvent) (length, plugin_data); if (0 < buf_len && buf_len <= length) { + for (int i = 0; i < buf_len; i++) { + std::cout << std::hex << std::uppercase << std::setfill('0') << std::setw(2) << static_cast(plugin_data[i]) << " "; + } + std::cout << std::endl; memcpy (dest, plugin_data, buf_len); } else { std::cerr << "QR discard! Length invalid: " << buf_len << ", valid range: 0~" << length From e4e0952682aa18a9aadf69bed29e627727ca155f Mon Sep 17 00:00:00 2001 From: esuo1198 <54134.es@gmail.com> Date: Wed, 3 Apr 2024 10:12:56 +0900 Subject: [PATCH 22/22] Clean up code --- src/patches/qr.cpp | 49 +++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/src/patches/qr.cpp b/src/patches/qr.cpp index daa98c6..9495dcb 100644 --- a/src/patches/qr.cpp +++ b/src/patches/qr.cpp @@ -21,15 +21,15 @@ extern char accessCode2[21]; extern std::vector plugins; typedef void event (); -typedef bool CheckQrEvent(); -typedef int GetQrEvent(int, unsigned char*); +typedef bool checkQrEvent (); +typedef int getQrEvent (int, unsigned char *); namespace patches::Qr { enum class State { Ready, CopyWait }; enum class Mode { Card, Data, Image, Plugin }; -State gState = State::Ready; -Mode gMode = Mode::Card; +State gState = State::Ready; +Mode gMode = Mode::Card; HMODULE gPlugin; std::string accessCode; bool qrEnabled = true; @@ -113,9 +113,8 @@ HOOK_DYNAMIC (i64, __fastcall, copy_data, i64, void *dest, int length) { byteBuffer.push_back (0xEE); byteBuffer.push_back (0xFF); - for (auto byteData : byteBuffer) { - std::cout << std::hex << std::uppercase << std::setfill('0') << std::setw(2) << static_cast(byteData) << " "; - } + for (auto byteData : byteBuffer) + std::cout << std::hex << std::uppercase << std::setfill ('0') << std::setw (2) << static_cast (byteData) << " "; std::cout << std::endl; memcpy (dest, byteBuffer.data (), byteBuffer.size ()); @@ -165,19 +164,17 @@ HOOK_DYNAMIC (i64, __fastcall, copy_data, i64, void *dest, int length) { gState = State::Ready; return dataSize; } else if (gMode == Mode::Plugin) { - FARPROC getQrEvent = GetProcAddress (gPlugin, "getQr"); - if (getQrEvent) { + FARPROC getEvent = GetProcAddress (gPlugin, "GetQr"); + if (getEvent) { unsigned char plugin_data[length]; - int buf_len = ((GetQrEvent*) getQrEvent) (length, plugin_data); + int buf_len = ((getQrEvent *)getEvent) (length, plugin_data); if (0 < buf_len && buf_len <= length) { - for (int i = 0; i < buf_len; i++) { - std::cout << std::hex << std::uppercase << std::setfill('0') << std::setw(2) << static_cast(plugin_data[i]) << " "; - } + for (int i = 0; i < buf_len; i++) + std::cout << std::hex << std::uppercase << std::setfill ('0') << std::setw (2) << static_cast (plugin_data[i]) << " "; std::cout << std::endl; memcpy (dest, plugin_data, buf_len); } else { - std::cerr << "QR discard! Length invalid: " << buf_len << ", valid range: 0~" << length - << std::endl; + std::cerr << "QR discard! Length invalid: " << buf_len << ", valid range: 0~" << length << std::endl; } gState = State::Ready; return buf_len; @@ -188,8 +185,8 @@ HOOK_DYNAMIC (i64, __fastcall, copy_data, i64, void *dest, int length) { } } else if (qrPluginRegistered) { for (auto plugin : qrPlugins) { - FARPROC usingQrEvent = GetProcAddress (plugin, "usingQr"); - if (usingQrEvent) ((event*) usingQrEvent) (); + FARPROC usingQrEvent = GetProcAddress (plugin, "UsingQr"); + if (usingQrEvent) ((event *)usingQrEvent) (); } } return 0; @@ -225,11 +222,11 @@ Update () { gMode = Mode::Image; } else if (qrPluginRegistered) { for (auto plugin : qrPlugins) { - FARPROC checkQrEvent = GetProcAddress (plugin, "checkQr"); - if (checkQrEvent && ((CheckQrEvent*) checkQrEvent) ()) { + FARPROC checkEvent = GetProcAddress (plugin, "CheckQr"); + if (checkEvent && ((checkQrEvent *)checkEvent) ()) { std::cout << "Insert" << std::endl; - gState = State::CopyWait; - gMode = Mode::Plugin; + gState = State::CopyWait; + gMode = Mode::Plugin; gPlugin = plugin; break; } @@ -257,14 +254,16 @@ Init () { std::cout << "[Init] QR emulation disabled" << std::endl; return; } + for (auto plugin : plugins) { - FARPROC usingQrEvent = GetProcAddress (plugin, "usingQr"); - if (usingQrEvent) qrPlugins.push_back(plugin); + FARPROC usingQrEvent = GetProcAddress (plugin, "UsingQr"); + if (usingQrEvent) qrPlugins.push_back (plugin); } - if (qrPlugins.size() > 0) { - std::cout << "QR Plugin Found!" << std::endl; + if (qrPlugins.size () > 0) { + std::cout << "QR plugin found!" << std::endl; qrPluginRegistered = true; } + SetConsoleOutputCP (CP_UTF8); auto amHandle = (u64)GetModuleHandle ("AMFrameWork.dll"); switch (gameVersion) {