From df72875f11baca2305d1bb3c5f7bbb6441761df0 Mon Sep 17 00:00:00 2001 From: Reaver Date: Fri, 14 Sep 2018 16:31:10 +0300 Subject: [PATCH] WMMT5 Open Parrot Loader Including all research, saving and stuff. Please improve! --- OpenParrot/src/Functions/Games/ES3X/WMMT5.cpp | 1127 +++++++++++++++++ OpenParrot/src/Functions/Ring_amLib/amJvs.cpp | 2 +- OpenParrot/src/Utility/GameDetect.cpp | 12 + OpenParrot/src/Utility/GameID.h | 3 +- 4 files changed, 1142 insertions(+), 2 deletions(-) create mode 100644 OpenParrot/src/Functions/Games/ES3X/WMMT5.cpp diff --git a/OpenParrot/src/Functions/Games/ES3X/WMMT5.cpp b/OpenParrot/src/Functions/Games/ES3X/WMMT5.cpp new file mode 100644 index 0000000..bc2504d --- /dev/null +++ b/OpenParrot/src/Functions/Games/ES3X/WMMT5.cpp @@ -0,0 +1,1127 @@ +#include +#include "Utility/InitFunction.h" +#include "Functions/Global.h" +#include "MinHook.h" +#include +#include +#ifdef _M_AMD64 +#pragma optimize("", off) +#pragma comment(lib, "Ws2_32.lib") + +extern LPCSTR hookPort; +uintptr_t imageBase; +static unsigned char hasp_buffer[0xD40]; +static bool isFreePlay = true; + +// Data for IC card, Force Feedback etc OFF. +unsigned char settingData[406] = { + 0x1F, 0x8B, 0x08, 0x08, 0x53, 0x6A, 0x8B, 0x5A, 0x00, 0x03, 0x46, 0x73, + 0x65, 0x74, 0x74, 0x69, 0x6E, 0x67, 0x2E, 0x6C, 0x75, 0x61, 0x00, 0x85, + 0x93, 0xC9, 0x6E, 0xC2, 0x30, 0x10, 0x86, 0xEF, 0x79, 0x0A, 0x5E, 0x80, + 0x8A, 0x90, 0x80, 0xE8, 0xA1, 0x07, 0x08, 0xA4, 0x20, 0x11, 0x81, 0x20, + 0x2A, 0x52, 0x6F, 0xC6, 0x19, 0x88, 0x85, 0x17, 0xE4, 0xD8, 0xAD, 0x78, + 0xFB, 0xDA, 0x59, 0x1D, 0xB5, 0x2A, 0x39, 0x44, 0xF9, 0xBF, 0x59, 0x32, + 0x8B, 0x3D, 0x1C, 0xFE, 0xFF, 0x78, 0xF6, 0x35, 0x28, 0x40, 0x29, 0xC2, + 0xAF, 0x2F, 0x54, 0x23, 0xEF, 0x49, 0xC0, 0xD0, 0xF3, 0x58, 0x84, 0x28, + 0x39, 0xAF, 0x11, 0xCF, 0x28, 0x44, 0xC0, 0x15, 0xC8, 0xC1, 0xDB, 0x20, + 0x08, 0x27, 0xD3, 0x51, 0x6D, 0x9A, 0x63, 0x0C, 0xB4, 0xB5, 0x34, 0x74, + 0x21, 0xD1, 0x0D, 0x7E, 0xD1, 0x44, 0x28, 0x21, 0x5B, 0x3A, 0xF1, 0xFD, + 0x9A, 0xA7, 0x42, 0xE3, 0x7C, 0x0B, 0x17, 0x65, 0xE8, 0x78, 0x14, 0xCE, + 0x5C, 0x7C, 0x20, 0xD7, 0xDC, 0x72, 0x3F, 0x0C, 0x82, 0xA9, 0x6B, 0x48, + 0xC5, 0xFD, 0x2F, 0xBC, 0x10, 0x4A, 0x09, 0xD6, 0x25, 0x12, 0x84, 0x47, + 0xB9, 0x56, 0x60, 0x7D, 0x3D, 0xB6, 0xD0, 0x8F, 0x08, 0xC9, 0x2C, 0x12, + 0x85, 0xCD, 0x19, 0x78, 0xEC, 0x1D, 0x31, 0xA8, 0xD5, 0xD8, 0x7A, 0x73, + 0x33, 0x1B, 0xED, 0x90, 0x58, 0x53, 0x1A, 0x09, 0x2D, 0x8B, 0x86, 0x85, + 0x86, 0x49, 0x80, 0x3D, 0x45, 0x8F, 0x2A, 0xE5, 0x1E, 0x9F, 0x37, 0x59, + 0xD5, 0xE4, 0x06, 0xDB, 0xE4, 0x87, 0x6F, 0x57, 0x7D, 0x00, 0xCF, 0x9A, + 0x21, 0x24, 0x57, 0xD7, 0x1E, 0x0B, 0x89, 0x21, 0x06, 0xC8, 0xCE, 0x08, + 0xDF, 0x2A, 0x74, 0x22, 0xBC, 0x98, 0xF3, 0xEC, 0x00, 0x0C, 0x99, 0xAF, + 0x2A, 0xFF, 0xEA, 0xCB, 0x0C, 0x2C, 0x11, 0x19, 0x54, 0x2E, 0xAD, 0x5C, + 0x92, 0xB2, 0x1E, 0x17, 0x99, 0x42, 0x79, 0x5D, 0x63, 0x44, 0x45, 0x01, + 0xE9, 0xE3, 0x0E, 0x75, 0x63, 0x56, 0x1E, 0x35, 0x37, 0xEA, 0x75, 0x5A, + 0xCB, 0x44, 0xF4, 0x64, 0xAA, 0xC1, 0x95, 0x27, 0xC8, 0x7A, 0xD6, 0x5C, + 0xBB, 0x32, 0x96, 0xC4, 0x95, 0x47, 0xA4, 0x5C, 0xB9, 0x2C, 0x67, 0x63, + 0x65, 0xB9, 0x92, 0x3D, 0xE2, 0x40, 0xAB, 0x52, 0xED, 0xB8, 0x3F, 0x84, + 0x15, 0xBE, 0x51, 0x73, 0xA5, 0x24, 0xC2, 0xAA, 0x03, 0xBB, 0xCB, 0x85, + 0x12, 0x0E, 0x5D, 0xB7, 0x26, 0x1D, 0xBE, 0x19, 0x6A, 0x0E, 0x6D, 0x05, + 0x52, 0xC2, 0xE0, 0x53, 0xF0, 0xA6, 0x35, 0xBB, 0x7B, 0x8B, 0xCC, 0x1F, + 0xB7, 0xF5, 0x41, 0x71, 0x9C, 0xD6, 0x66, 0x71, 0x6D, 0xF0, 0xAC, 0xE3, + 0x09, 0xE1, 0x6E, 0xCE, 0xA3, 0x66, 0x0C, 0xA4, 0x35, 0xF6, 0x02, 0x7A, + 0x96, 0x7E, 0xC8, 0xD3, 0x7B, 0x53, 0xDE, 0xB4, 0xD5, 0x2E, 0x7E, 0xEE, + 0xF9, 0x03, 0x44, 0x94, 0xFB, 0x8E, 0xB5, 0x03, 0x00, 0x00 +}; + +// FOR FREEPLAY +unsigned char terminalPackage1_Free[79] = { + 0x01, 0x04, 0x4B, 0x00, 0x12, 0x14, 0x0A, 0x00, 0x10, 0x04, 0x18, 0x00, + 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, 0x00, + 0x50, 0x00, 0x1A, 0x02, 0x5A, 0x00, 0x2A, 0x12, 0x08, 0x12, 0x12, 0x0C, + 0x32, 0x37, 0x32, 0x32, 0x31, 0x31, 0x39, 0x39, 0x30, 0x30, 0x30, 0x32, + 0x18, 0x00, 0x30, 0x03, 0x4A, 0x08, 0x08, 0x01, 0x10, 0x01, 0x18, 0x00, + 0x20, 0x00, 0x52, 0x0B, 0x08, 0x64, 0x10, 0xDE, 0x0F, 0x18, 0x05, 0x20, + 0x00, 0x28, 0x00, 0xEC, 0x72, 0x00, 0x41 +}; + +unsigned char terminalPackage2_Free[139] = { + 0x01, 0x04, 0x87, 0x00, 0x12, 0x14, 0x0A, 0x00, 0x10, 0x04, 0x18, 0x00, + 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, 0x00, + 0x50, 0x00, 0x1A, 0x02, 0x5A, 0x00, 0x2A, 0x12, 0x08, 0x14, 0x12, 0x0C, + 0x32, 0x37, 0x32, 0x32, 0x31, 0x31, 0x39, 0x39, 0x30, 0x30, 0x30, 0x32, + 0x18, 0x00, 0x30, 0x03, 0x42, 0x3A, 0x08, 0x01, 0x10, 0x03, 0x18, 0x02, + 0x20, 0x02, 0x28, 0x04, 0x30, 0x01, 0x38, 0x01, 0x40, 0x00, 0x48, 0x00, + 0x50, 0x02, 0x58, 0x60, 0x60, 0x60, 0x68, 0x60, 0x70, 0x60, 0x78, 0x60, + 0x80, 0x01, 0x60, 0x88, 0x01, 0x60, 0x90, 0x01, 0x60, 0x98, 0x01, 0x00, + 0xA0, 0x01, 0xE2, 0xBA, 0xAC, 0xD4, 0x05, 0xA8, 0x01, 0x04, 0xB0, 0x01, + 0x24, 0xB8, 0x01, 0x00, 0x4A, 0x08, 0x08, 0x01, 0x10, 0x01, 0x18, 0x00, + 0x20, 0x00, 0x52, 0x0B, 0x08, 0x64, 0x10, 0xDE, 0x0F, 0x18, 0x05, 0x20, + 0x00, 0x28, 0x00, 0x99, 0x4E, 0xC6, 0x14 +}; + +unsigned char terminalPackage3_Free[79] = { + 0x01, 0x04, 0x4B, 0x00, 0x12, 0x14, 0x0A, 0x00, 0x10, 0x04, 0x18, 0x00, + 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, 0x00, + 0x50, 0x00, 0x1A, 0x02, 0x5A, 0x00, 0x2A, 0x12, 0x08, 0x19, 0x12, 0x0C, + 0x32, 0x37, 0x32, 0x32, 0x31, 0x31, 0x39, 0x39, 0x30, 0x30, 0x30, 0x32, + 0x18, 0x00, 0x30, 0x03, 0x4A, 0x08, 0x08, 0x01, 0x10, 0x01, 0x18, 0x00, + 0x20, 0x00, 0x52, 0x0B, 0x08, 0x64, 0x10, 0xDE, 0x0F, 0x18, 0x05, 0x20, + 0x00, 0x28, 0x00, 0x89, 0x93, 0x3A, 0x22 +}; + +unsigned char terminalPackage4_Free[139] = { + 0x01, 0x04, 0x87, 0x00, 0x12, 0x14, 0x0A, 0x00, 0x10, 0x04, 0x18, 0x00, + 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, 0x00, + 0x50, 0x00, 0x1A, 0x02, 0x5A, 0x00, 0x2A, 0x12, 0x08, 0x2E, 0x12, 0x0C, + 0x32, 0x37, 0x32, 0x32, 0x31, 0x31, 0x39, 0x39, 0x30, 0x30, 0x30, 0x32, + 0x18, 0x00, 0x30, 0x03, 0x42, 0x3A, 0x08, 0x01, 0x10, 0x03, 0x18, 0x02, + 0x20, 0x02, 0x28, 0x04, 0x30, 0x01, 0x38, 0x01, 0x40, 0x00, 0x48, 0x00, + 0x50, 0x02, 0x58, 0x60, 0x60, 0x60, 0x68, 0x60, 0x70, 0x60, 0x78, 0x60, + 0x80, 0x01, 0x60, 0x88, 0x01, 0x60, 0x90, 0x01, 0x60, 0x98, 0x01, 0x00, + 0xA0, 0x01, 0xF0, 0xBA, 0xAC, 0xD4, 0x05, 0xA8, 0x01, 0x04, 0xB0, 0x01, + 0x24, 0xB8, 0x01, 0x00, 0x4A, 0x08, 0x08, 0x01, 0x10, 0x01, 0x18, 0x00, + 0x20, 0x00, 0x52, 0x0B, 0x08, 0x64, 0x10, 0xDE, 0x0F, 0x18, 0x05, 0x20, + 0x00, 0x28, 0x00, 0x55, 0x42, 0x47, 0xD5 +}; + +unsigned char terminalPackage5_Free[79] = { + 0x01, 0x04, 0x4B, 0x00, 0x12, 0x14, 0x0A, 0x00, 0x10, 0x04, 0x18, 0x00, + 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, 0x00, + 0x50, 0x00, 0x1A, 0x02, 0x5A, 0x00, 0x2A, 0x12, 0x08, 0x2F, 0x12, 0x0C, + 0x32, 0x37, 0x32, 0x32, 0x31, 0x31, 0x39, 0x39, 0x30, 0x30, 0x30, 0x32, + 0x18, 0x00, 0x30, 0x03, 0x4A, 0x08, 0x08, 0x01, 0x10, 0x01, 0x18, 0x00, + 0x20, 0x00, 0x52, 0x0B, 0x08, 0x64, 0x10, 0xDE, 0x0F, 0x18, 0x05, 0x20, + 0x00, 0x28, 0x00, 0x9C, 0xC9, 0xE0, 0x73 +}; + +unsigned char terminalPackage6_Free[139] = { + 0x01, 0x04, 0x87, 0x00, 0x12, 0x14, 0x0A, 0x00, 0x10, 0x04, 0x18, 0x00, + 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, 0x00, + 0x50, 0x00, 0x1A, 0x02, 0x5A, 0x00, 0x2A, 0x12, 0x08, 0x6A, 0x12, 0x0C, + 0x32, 0x37, 0x32, 0x32, 0x31, 0x31, 0x39, 0x39, 0x30, 0x30, 0x30, 0x32, + 0x18, 0x00, 0x30, 0x03, 0x42, 0x3A, 0x08, 0x01, 0x10, 0x03, 0x18, 0x02, + 0x20, 0x02, 0x28, 0x04, 0x30, 0x01, 0x38, 0x01, 0x40, 0x00, 0x48, 0x00, + 0x50, 0x02, 0x58, 0x60, 0x60, 0x60, 0x68, 0x60, 0x70, 0x60, 0x78, 0x60, + 0x80, 0x01, 0x60, 0x88, 0x01, 0x60, 0x90, 0x01, 0x60, 0x98, 0x01, 0x00, + 0xA0, 0x01, 0xF1, 0xBA, 0xAC, 0xD4, 0x05, 0xA8, 0x01, 0x04, 0xB0, 0x01, + 0x24, 0xB8, 0x01, 0x00, 0x4A, 0x08, 0x08, 0x01, 0x10, 0x01, 0x18, 0x00, + 0x20, 0x00, 0x52, 0x0B, 0x08, 0x64, 0x10, 0xDE, 0x0F, 0x18, 0x05, 0x20, + 0x00, 0x28, 0x00, 0x26, 0xB7, 0x89, 0xD0 +}; + +// FOR COIN ENTRY! +unsigned char terminalPackage1_Coin[75] = { + 0x01, 0x04, 0x47, 0x00, 0x12, 0x14, 0x0A, 0x00, 0x10, 0x04, 0x18, 0x00, + 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, 0x00, + 0x50, 0x00, 0x1A, 0x00, 0x2A, 0x12, 0x08, 0x0B, 0x12, 0x0C, 0x32, 0x37, + 0x32, 0x32, 0x31, 0x31, 0x39, 0x39, 0x30, 0x30, 0x30, 0x32, 0x18, 0x00, + 0x4A, 0x08, 0x08, 0x01, 0x10, 0x01, 0x18, 0x00, 0x20, 0x00, 0x52, 0x0B, + 0x08, 0x64, 0x10, 0xDE, 0x0F, 0x18, 0x05, 0x20, 0x00, 0x28, 0x00, 0x09, + 0x06, 0x41, 0x0B +}; + +unsigned char terminalPackage2_Coin[135] = { + 0x01, 0x04, 0x83, 0x00, 0x12, 0x14, 0x0A, 0x00, 0x10, 0x04, 0x18, 0x00, + 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, 0x00, + 0x50, 0x00, 0x1A, 0x00, 0x2A, 0x12, 0x08, 0x39, 0x12, 0x0C, 0x32, 0x37, + 0x32, 0x32, 0x31, 0x31, 0x39, 0x39, 0x30, 0x30, 0x30, 0x32, 0x18, 0x00, + 0x42, 0x3A, 0x08, 0x01, 0x10, 0x03, 0x18, 0x02, 0x20, 0x02, 0x28, 0x04, + 0x30, 0x00, 0x38, 0x01, 0x40, 0x00, 0x48, 0x00, 0x50, 0x02, 0x58, 0x60, + 0x60, 0x60, 0x68, 0x60, 0x70, 0x60, 0x78, 0x60, 0x80, 0x01, 0x60, 0x88, + 0x01, 0x60, 0x90, 0x01, 0x60, 0x98, 0x01, 0x00, 0xA0, 0x01, 0xD5, 0xBE, + 0x8F, 0xD2, 0x05, 0xA8, 0x01, 0x04, 0xB0, 0x01, 0x24, 0xB8, 0x01, 0x00, + 0x4A, 0x08, 0x08, 0x01, 0x10, 0x01, 0x18, 0x00, 0x20, 0x00, 0x52, 0x0B, + 0x08, 0x64, 0x10, 0xDE, 0x0F, 0x18, 0x05, 0x20, 0x00, 0x28, 0x00, 0xF5, + 0xF1, 0x0D, 0xB2 +}; + +unsigned char terminalPackage3_Coin[75] = { + 0x01, 0x04, 0x47, 0x00, 0x12, 0x14, 0x0A, 0x00, 0x10, 0x04, 0x18, 0x00, + 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, 0x00, + 0x50, 0x00, 0x1A, 0x00, 0x2A, 0x12, 0x08, 0x3A, 0x12, 0x0C, 0x32, 0x37, + 0x32, 0x32, 0x31, 0x31, 0x39, 0x39, 0x30, 0x30, 0x30, 0x32, 0x18, 0x00, + 0x4A, 0x08, 0x08, 0x01, 0x10, 0x01, 0x18, 0x00, 0x20, 0x00, 0x52, 0x0B, + 0x08, 0x64, 0x10, 0xDE, 0x0F, 0x18, 0x05, 0x20, 0x00, 0x28, 0x00, 0x22, + 0x25, 0x31, 0x0D +}; + +unsigned char terminalPackage4_Coin[135] = { + 0x01, 0x04, 0x83, 0x00, 0x12, 0x14, 0x0A, 0x00, 0x10, 0x04, 0x18, 0x00, + 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, 0x00, + 0x50, 0x00, 0x1A, 0x00, 0x2A, 0x12, 0x08, 0x57, 0x12, 0x0C, 0x32, 0x37, + 0x32, 0x32, 0x31, 0x31, 0x39, 0x39, 0x30, 0x30, 0x30, 0x32, 0x18, 0x00, + 0x42, 0x3A, 0x08, 0x01, 0x10, 0x03, 0x18, 0x02, 0x20, 0x02, 0x28, 0x04, + 0x30, 0x00, 0x38, 0x01, 0x40, 0x00, 0x48, 0x00, 0x50, 0x02, 0x58, 0x60, + 0x60, 0x60, 0x68, 0x60, 0x70, 0x60, 0x78, 0x60, 0x80, 0x01, 0x60, 0x88, + 0x01, 0x60, 0x90, 0x01, 0x60, 0x98, 0x01, 0x00, 0xA0, 0x01, 0xD6, 0xBE, + 0x8F, 0xD2, 0x05, 0xA8, 0x01, 0x04, 0xB0, 0x01, 0x24, 0xB8, 0x01, 0x00, + 0x4A, 0x08, 0x08, 0x01, 0x10, 0x01, 0x18, 0x00, 0x20, 0x00, 0x52, 0x0B, + 0x08, 0x64, 0x10, 0xDE, 0x0F, 0x18, 0x05, 0x20, 0x00, 0x28, 0x00, 0xCA, + 0x8B, 0x15, 0xCB +}; + +unsigned char terminalPackage5_Coin[79] = { + 0x01, 0x04, 0x4B, 0x00, 0x12, 0x14, 0x0A, 0x00, 0x10, 0x04, 0x18, 0x00, + 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, 0x00, + 0x50, 0x00, 0x1A, 0x02, 0x5A, 0x00, 0x2A, 0x12, 0x08, 0x58, 0x12, 0x0C, + 0x32, 0x37, 0x32, 0x32, 0x31, 0x31, 0x39, 0x39, 0x30, 0x30, 0x30, 0x32, + 0x18, 0x00, 0x30, 0x03, 0x4A, 0x08, 0x08, 0x01, 0x10, 0x01, 0x18, 0x00, + 0x20, 0x00, 0x52, 0x0B, 0x08, 0x64, 0x10, 0xDE, 0x0F, 0x18, 0x05, 0x20, + 0x00, 0x28, 0x00, 0x3E, 0xB1, 0xB7, 0x22 +}; + +unsigned char terminalPackage6_Coin[139] = { + 0x01, 0x04, 0x87, 0x00, 0x12, 0x14, 0x0A, 0x00, 0x10, 0x04, 0x18, 0x00, + 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, 0x00, + 0x50, 0x00, 0x1A, 0x02, 0x5A, 0x00, 0x2A, 0x12, 0x08, 0x77, 0x12, 0x0C, + 0x32, 0x37, 0x32, 0x32, 0x31, 0x31, 0x39, 0x39, 0x30, 0x30, 0x30, 0x32, + 0x18, 0x00, 0x30, 0x03, 0x42, 0x3A, 0x08, 0x01, 0x10, 0x03, 0x18, 0x02, + 0x20, 0x02, 0x28, 0x04, 0x30, 0x00, 0x38, 0x01, 0x40, 0x00, 0x48, 0x00, + 0x50, 0x02, 0x58, 0x60, 0x60, 0x60, 0x68, 0x60, 0x70, 0x60, 0x78, 0x60, + 0x80, 0x01, 0x60, 0x88, 0x01, 0x60, 0x90, 0x01, 0x60, 0x98, 0x01, 0x00, + 0xA0, 0x01, 0xD7, 0xBE, 0x8F, 0xD2, 0x05, 0xA8, 0x01, 0x04, 0xB0, 0x01, + 0x24, 0xB8, 0x01, 0x00, 0x4A, 0x08, 0x08, 0x01, 0x10, 0x01, 0x18, 0x00, + 0x20, 0x00, 0x52, 0x0B, 0x08, 0x64, 0x10, 0xDE, 0x0F, 0x18, 0x05, 0x20, + 0x00, 0x28, 0x00, 0xBD, 0x07, 0xCF, 0xDC +}; + +#define HASP_STATUS_OK 0 +unsigned int Hook_hasp_login(int feature_id, void* vendor_code, int hasp_handle) { +#ifdef _DEBUG + OutputDebugStringA("hasp_login\n"); +#endif + return HASP_STATUS_OK; +} + +unsigned int Hook_hasp_logout(int hasp_handle) { +#ifdef _DEBUG + OutputDebugStringA("hasp_logout\n"); +#endif + return HASP_STATUS_OK; +} + +unsigned int Hook_hasp_encrypt(int hasp_handle, unsigned char* buffer, unsigned int buffer_size) { +#ifdef _DEBUG + OutputDebugStringA("hasp_encrypt\n"); +#endif + return HASP_STATUS_OK; +} + +unsigned int Hook_hasp_decrypt(int hasp_handle, unsigned char* buffer, unsigned int buffer_size) { +#ifdef _DEBUG + OutputDebugStringA("hasp_decrypt\n"); +#endif + return HASP_STATUS_OK; +} + +unsigned int Hook_hasp_get_size(int hasp_handle, int hasp_fileid, unsigned int* hasp_size) { +#ifdef _DEBUG + OutputDebugStringA("hasp_get_size\n"); +#endif + *hasp_size = 0xD40; // Max addressable size by the game... absmax is 4k + return HASP_STATUS_OK; +} + +unsigned int Hook_hasp_read(int hasp_handle, int hasp_fileid, unsigned int offset, unsigned int length, unsigned char* buffer) { +#ifdef _DEBUG + OutputDebugStringA("hasp_read\n"); +#endif + memcpy(buffer, hasp_buffer + offset, length); + return HASP_STATUS_OK; +} + +unsigned int Hook_hasp_write(int hasp_handle, int hasp_fileid, unsigned int offset, unsigned int length, unsigned char* buffer) { + return HASP_STATUS_OK; +} + +unsigned char saveData[0x2000]; +// BASE: 0x24E0 +// Campaing honor data: 2998, save 0xB8 +// Story Mode Honor data: 25F0, save 0x98 +// StoryModeNoLoseHonorData: 2C80, Copy 0,0x10, Copy 0x18,0x28 maybe 8 bytes more +// OtherHonorData: 2A90, Copy 0x60 +// CampaignHonorData: 2698, Copy 0x48 + +//static int SaveCampaingHonorData2() +//{ +// memset(saveData, 0, 0x1000); +// uintptr_t imageBase = (uintptr_t)GetModuleHandleA(0); +// uintptr_t value = *(uintptr_t*)(imageBase + 0x1948F10); +// value += 0x2698; +// FILE* file = fopen(V("CampaignHonorData.sav"), V("wb")); +// memcpy(saveData, (void *)value, 0x48); +// fwrite(saveData, 1, 0x100, file); +// fclose(file); +// return 1; +//} +// +//static int SaveOtherHonorData() +//{ +// memset(saveData, 0, 0x1000); +// uintptr_t imageBase = (uintptr_t)GetModuleHandleA(0); +// uintptr_t value = *(uintptr_t*)(imageBase + 0x1948F10); +// value += 0x2A90; +// FILE* file = fopen(V("OtherHonorData.sav"), V("wb")); +// memcpy(saveData, (void *)value, 0x60); +// fwrite(saveData, 1, 0x100, file); +// fclose(file); +// return 1; +//} +// +//static int SaveStoryModeNoLoseHonorData() +//{ +// memset(saveData, 0, 0x1000); +// uintptr_t imageBase = (uintptr_t)GetModuleHandleA(0); +// uintptr_t value = *(uintptr_t*)(imageBase + 0x1948F10); +// value += 0x2C80; +// FILE* file = fopen(V("StoryModeNoLoseHonorData.sav"), V("wb")); +// memcpy(saveData, (void *)value, 0x10); +// value += 0x18; +// memcpy(saveData, (void *)value, 0x28); +// fwrite(saveData, 1, 0x100, file); +// fclose(file); +// return 1; +//} +// +//static int SaveCampaingHonorData() +//{ +// memset(saveData, 0, 0x1000); +// uintptr_t imageBase = (uintptr_t)GetModuleHandleA(0); +// uintptr_t value = *(uintptr_t*)(imageBase + 0x1948F10); +// value += 0x2998; +// FILE* file = fopen(V("campaing.sav"), V("wb")); +// memcpy(saveData, (void *)value, 0xB8); +// fwrite(saveData, 1, 0x100, file); +// fclose(file); +// return 1; +//} +// +//static int SaveStoryData() +//{ +// memset(saveData, 0, 0x1000); +// uintptr_t imageBase = (uintptr_t)GetModuleHandleA(0); +// uintptr_t value = *(uintptr_t*)(imageBase + 0x1948F10); +// value += 0x25F0; +// FILE* file = fopen(V("story.sav"), V("wb")); +// memcpy(saveData, (void *)value, 0x98); +// fwrite(saveData, 1, 0x100, file); +// fclose(file); +// return 1; +//} + +static bool saveOk = false; +unsigned char carData[0xFF]; +static int SaveOk() +{ + saveOk = true; + return 1; +} + +char carFileName[0xFF]; +bool loadOk = false; +bool customCar = false; + +static int SaveGameData() +{ + if (!saveOk) + return 1; + + memset(saveData, 0, 0x2000); + uintptr_t value = *(uintptr_t*)(imageBase + 0x1948F10); + value = *(uintptr_t*)(value + 0x108); + memcpy(saveData, (void *)value, 0x340); + FILE* file = fopen("openprogress.sav", "wb"); + fwrite(saveData, 1, 0x2000, file); + fclose(file); + + // Car Profile saving + memset(carData, 0, 0xFF); + memset(carFileName, 0, 0xFF); + memcpy(carData, (void *)*(uintptr_t*)(*(uintptr_t*)(imageBase + 0x1948F10) + 0x180 + 0xa8 + 0x18), 0xE0); + CreateDirectoryA("OpenParrot_Cars", nullptr); + if(customCar) + { + sprintf(carFileName, ".\\OpenParrot_Cars\\custom.car"); + } + else + { + sprintf(carFileName, ".\\OpenParrot_Cars\\%08X.car", *(DWORD*)(*(uintptr_t*)(*(uintptr_t*)(imageBase + 0x1948F10) + 0x180 + 0xa8 + 0x18) + 0x2C)); + } + FILE *carSave = fopen(carFileName, "wb"); + fwrite(carData, 1, 0xE0, file); + fclose(carSave); + //SaveStoryData(); + //SaveCampaingHonorData(); + //SaveStoryModeNoLoseHonorData(); + //SaveOtherHonorData(); + //SaveCampaingHonorData2(); + saveOk = false; + return 1; +} + +uintptr_t saveGameOffset; + +//static int LoadCampaingHonorData2() +//{ +// memset(saveData, 0x0, 0x1000); +// FILE* file = fopen(V("CampaignHonorData.sav"), V("rb")); +// if (file) +// { +// fseek(file, 0, SEEK_END); +// int fsize = ftell(file); +// if (fsize == 0x100) +// { +// fseek(file, 0, SEEK_SET); +// fread(saveData, fsize, 1, file); +// uintptr_t imageBase = (uintptr_t)GetModuleHandleA(0); +// uintptr_t value = *(uintptr_t*)(imageBase + 0x1948F10); +// value += 0x2698; +// memcpy((void *)value, saveData, 0x48); +// } +// fclose(file); +// } +// return 1; +//} +// +//static int LoadOtherHonorData() +//{ +// memset(saveData, 0x0, 0x1000); +// FILE* file = fopen(V("OtherHonorData.sav"), V("rb")); +// if (file) +// { +// fseek(file, 0, SEEK_END); +// int fsize = ftell(file); +// if (fsize == 0x100) +// { +// fseek(file, 0, SEEK_SET); +// fread(saveData, fsize, 1, file); +// uintptr_t imageBase = (uintptr_t)GetModuleHandleA(0); +// uintptr_t value = *(uintptr_t*)(imageBase + 0x1948F10); +// value += 0x2A90; +// memcpy((void *)value, saveData, 0x60); +// } +// fclose(file); +// } +// return 1; +//} +// +//static int LoadStoryModeNoLoseHonorData() +//{ +// memset(saveData, 0x0, 0x1000); +// FILE* file = fopen(V("StoryModeNoLoseHonorData.sav"), V("rb")); +// if (file) +// { +// fseek(file, 0, SEEK_END); +// int fsize = ftell(file); +// if (fsize == 0x100) +// { +// fseek(file, 0, SEEK_SET); +// fread(saveData, fsize, 1, file); +// uintptr_t imageBase = (uintptr_t)GetModuleHandleA(0); +// uintptr_t value = *(uintptr_t*)(imageBase + 0x1948F10); +// value += 0x2C80; +// //memcpy((void *)value, saveData, 0x10); +// value += 0x18; +// memcpy((void *)value, saveData, 0x28); +// } +// fclose(file); +// } +// return 1; +//} +// +//static int LoadCampaingHonorData() +//{ +// memset(saveData, 0x0, 0x1000); +// FILE* file = fopen(V("campaing.sav"), V("rb")); +// if (file) +// { +// fseek(file, 0, SEEK_END); +// int fsize = ftell(file); +// if (fsize == 0x100) +// { +// fseek(file, 0, SEEK_SET); +// fread(saveData, fsize, 1, file); +// uintptr_t imageBase = (uintptr_t)GetModuleHandleA(0); +// uintptr_t value = *(uintptr_t*)(imageBase + 0x1948F10); +// value += 0x24E0; +// memcpy((void *)value, saveData, 0xB8); +// } +// fclose(file); +// } +// return 1; +//} +// +//static int LoadStoryData() +//{ +// memset(saveData, 0x0, 0x1000); +// FILE* file = fopen(V("story.sav"), V("rb")); +// if (file) +// { +// fseek(file, 0, SEEK_END); +// int fsize = ftell(file); +// if (fsize == 0x100) +// { +// fseek(file, 0, SEEK_SET); +// fread(saveData, fsize, 1, file); +// uintptr_t imageBase = (uintptr_t)GetModuleHandleA(0); +// uintptr_t value = *(uintptr_t*)(imageBase + 0x1948F10); +// value += 0x25F0; +// memcpy((void *)value, saveData, 0x98); +// } +// fclose(file); +// } +// return 1; +//} + +static int LoadGameData() +{ + saveOk = false; + memset(saveData, 0x0, 0x2000); + FILE* file = fopen("openprogress.sav", "rb"); + if (file) + { + fseek(file, 0, SEEK_END); + int fsize = ftell(file); + if (fsize == 0x2000) + { + fseek(file, 0, SEEK_SET); + fread(saveData, fsize, 1, file); + uintptr_t value = *(uintptr_t*)(imageBase + 0x1948F10); + value = *(uintptr_t*)(value + 0x108); + + // First page + //memcpy((void *)(value), saveData, 0x48); + memcpy((void *)(value + 0x10), saveData + 0x10, 0x20); + memcpy((void *)(value + 0x40), saveData + 0x40, 0x08); + //memcpy((void *)(value + 0x48 + 8), saveData + 0x48 + 8, 0x20); + memcpy((void *)(value + 0x48 + 8), saveData + 0x48 + 8, 0x08); + memcpy((void *)(value + 0x48 + 24), saveData + 0x48 + 24, 0x08); + memcpy((void *)(value + 0x48 + 32), saveData + 0x48 + 32, 0x08); + + // Second page + value += 0x110; + memcpy((void *)(value), saveData + 0x110, 0x90); + value -= 0x110; + + // Third Page + value += 0x1B8; + memcpy((void *)(value), saveData + 0x1B8, 0x48); + memcpy((void *)(value + 0x48 + 8), saveData + 0x1B8 + 0x48 + 8, 0x28); + value -= 0x1B8; + + // Fourth page + value += 0x240; + memcpy((void *)(value), saveData + 0x240, 0x68); + value -= 0x240; + + // Fifth page + value += 0x2B8; + memcpy((void *)(value), saveData + 0x2B8, 0x88); + value -= 0x2B8; + + loadOk = true; + + //+ 0x80 + + //+ [0x340] + + // [[[[0000000005CE5850] + 108] + 340] + 50] + 50 + // [[[[0000000005CE5850] + 108] + 340] + 50] + 54 + // wmn5r.exe + 1948BF8 + //TA stuff + + //[[[[magic_rva]+108]+340]+50] + + //value += 0x24E0; + // First chunk + //memcpy((void *)(value + 0x16), saveData + 0x16, 0x28); + //// + //memcpy((void *)(value + 0x40), saveData + 0x40, 0x18); + //// + //memcpy((void *)(value + 0x60), saveData + 0x60, 0x20); + //// + //memcpy((void *)(value + 0x90), saveData + 0x90, 0x28); + //// + //memcpy((void *)(value + 0xC0), saveData + 0xC0, 0x10); + //// + //memcpy((void *)(value + 0xD8), saveData + 0xD8, 0x28); // OK + //// + //memcpy((void *)(value + 0x110), saveData + 0x110, 0x98); + //// + //memcpy((void *)(value + 0x1B8), saveData + 0x1B8, 0x48); + //// + //memcpy((void *)(value + 0x208), saveData + 0x208, 0x28); + //// + //memcpy((void *)(value + 0x240), saveData + 0x240, 0x68); + //// + //memcpy((void *)(value + 0x2B8), saveData + 0x2B8, 0x88); + // + //memcpy((void *)(value + 0x370), saveData + 0x370, 0x10); + //// + //memcpy((void *)(value + 0x388), saveData + 0x388, 0x90); + //// + //memcpy((void *)(value + 0x420), saveData + 0x420, 0x18); + //// + //memcpy((void *)(value + 0x440), saveData + 0x440, 0x18); + //// + //memcpy((void *)(value + 0x460), saveData + 0x460, 0x48); + //// + //memcpy((void *)(value + 0x4B8), saveData + 0x4B8, 0xB8); + //// + //memcpy((void *)(value + 0x578), saveData + 0x578, 0x08); + //// + //memcpy((void *)(value + 0x5A8), saveData + 0x5A8, 0x68); + //// + //memcpy((void *)(value + 0x628), saveData + 0x628, 0x48); + //// + //memcpy((void *)(value + 0x688), saveData + 0x688, 0x48); + //// + //memcpy((void *)(value + 0x6E8), saveData + 0x6E8, 0xA8); + //// + //memcpy((void *)(value + 0x7A0), saveData + 0x7A0, 0x10); + //// + //memcpy((void *)(value + 0x7B8), saveData + 0x7B8, 0x28); + //// + //memcpy((void *)(value + 0x7E8), saveData + 0x7E8, 0x10); + //// + ////memcpy((void *)(value + 0x800), saveData + 0x800, 0x48); // Problem + ////// + //memcpy((void *)(value + 0x850), saveData + 0x850, 0x08); + // + //memcpy((void *)(value + 0x860), saveData + 0x860, 0x08); + ////// + //memcpy((void *)(value + 0x870), saveData + 0x870, 0x18); + //// + //memcpy((void *)(value + 0x890), saveData + 0x890, 0x40); + //// + //memcpy((void *)(value + 0x8E0), saveData + 0x8E0, 0x10); + //// + //memcpy((void *)(value + 0x8F8), saveData + 0x8F8, 0x28); + //// + //memcpy((void *)(value + 0x928), saveData + 0x928, 0x10); + //// + //memcpy((void *)(value + 0x940), saveData + 0x940, 0x48); // Problem + } + fclose(file); + } + //LoadStoryData(); + //LoadCampaingHonorData(); + //LoadStoryModeNoLoseHonorData(); + //LoadOtherHonorData(); + //LoadCampaingHonorData2(); + return 1; +} + +BOOL FileExists(char *szPath) +{ + DWORD dwAttrib = GetFileAttributesA(szPath); + + return (dwAttrib != INVALID_FILE_ATTRIBUTES && + !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY)); +} + +static void LoadWmmt5CarData() +{ + if (!loadOk) + return; + customCar = false; + memset(carData, 0, 0xFF); + memset(carFileName, 0, 0xFF); + CreateDirectoryA("OpenParrot_Cars", nullptr); + + // check for custom car + sprintf(carFileName, ".\\OpenParrot_Cars\\custom.car"); + if (FileExists(carFileName)) + { + FILE* file = fopen(carFileName, "rb"); + if (file) + { + fseek(file, 0, SEEK_END); + int fsize = ftell(file); + if (fsize == 0xE0) + { + fseek(file, 0, SEEK_SET); + fread(carData, fsize, 1, file); + uintptr_t carSaveLocation = *(uintptr_t*)((*(uintptr_t*)(imageBase + 0x1948F10)) + 0x180 + 0xa8 + 0x18); + memcpy((void *)(carSaveLocation + 0x08), carData + 0x08, 8); + memcpy((void *)(carSaveLocation + 0x10), carData + 0x10, 8); + memcpy((void *)(carSaveLocation + 0x20), carData + 0x20, 8); + memcpy((void *)(carSaveLocation + 0x28), carData + 0x28, 8); + memcpy((void *)(carSaveLocation + 0x30), carData + 0x30, 8); + memcpy((void *)(carSaveLocation + 0x38), carData + 0x38, 8); + memcpy((void *)(carSaveLocation + 0x40), carData + 0x40, 8); + memcpy((void *)(carSaveLocation + 0x50), carData + 0x50, 8); + memcpy((void *)(carSaveLocation + 0x58), carData + 0x58, 8); + memcpy((void *)(carSaveLocation + 0x68), carData + 0x68, 8); + // memcpy((void *)(carSaveLocation + 0x70), carData + 0x70, 8); + memcpy((void *)(carSaveLocation + 0x80), carData + 0x80, 8); + memcpy((void *)(carSaveLocation + 0x88), carData + 0x88, 8); + memcpy((void *)(carSaveLocation + 0x90), carData + 0x90, 8); + memcpy((void *)(carSaveLocation + 0x98), carData + 0x98, 8); + memcpy((void *)(carSaveLocation + 0xA0), carData + 0xA0, 8); + memcpy((void *)(carSaveLocation + 0xA8), carData + 0xA8, 8); + memcpy((void *)(carSaveLocation + 0xB8), carData + 0xB8, 8); + memcpy((void *)(carSaveLocation + 0xC8), carData + 0xC8, 8); + memcpy((void *)(carSaveLocation + 0xD8), carData + 0xD8, 8); + //memcpy((void *)(carSaveLocation + 0xE0), carData + 0xE0, 8); + customCar = true; + } + loadOk = false; + fclose(file); + return; + } + } + + memset(carFileName, 0, 0xFF); + // Load actual car if available + sprintf(carFileName, ".\\OpenParrot_Cars\\%08X.car", *(DWORD*)(*(uintptr_t*)(*(uintptr_t*)(imageBase + 0x1948F10) + 0x180 + 0xa8 + 0x18) + 0x2C)); + if(FileExists(carFileName)) + { + FILE* file = fopen(carFileName, "rb"); + if (file) + { + fseek(file, 0, SEEK_END); + int fsize = ftell(file); + if (fsize == 0xE0) + { + fseek(file, 0, SEEK_SET); + fread(carData, fsize, 1, file); + uintptr_t carSaveLocation = *(uintptr_t*)((*(uintptr_t*)(imageBase + 0x1948F10)) + 0x180 + 0xa8 + 0x18); + memcpy((void *)(carSaveLocation + 0x08), carData + 0x08, 8); + memcpy((void *)(carSaveLocation + 0x10), carData + 0x10, 8); + memcpy((void *)(carSaveLocation + 0x20), carData + 0x20, 8); + memcpy((void *)(carSaveLocation + 0x28), carData + 0x28, 8); + memcpy((void *)(carSaveLocation + 0x30), carData + 0x30, 8); + memcpy((void *)(carSaveLocation + 0x38), carData + 0x38, 8); + memcpy((void *)(carSaveLocation + 0x40), carData + 0x40, 8); + memcpy((void *)(carSaveLocation + 0x50), carData + 0x50, 8); + memcpy((void *)(carSaveLocation + 0x58), carData + 0x58, 8); + memcpy((void *)(carSaveLocation + 0x68), carData + 0x68, 8); +// memcpy((void *)(carSaveLocation + 0x70), carData + 0x70, 8); + memcpy((void *)(carSaveLocation + 0x80), carData + 0x80, 8); + memcpy((void *)(carSaveLocation + 0x88), carData + 0x88, 8); + memcpy((void *)(carSaveLocation + 0x90), carData + 0x90, 8); + memcpy((void *)(carSaveLocation + 0x98), carData + 0x98, 8); + memcpy((void *)(carSaveLocation + 0xA0), carData + 0xA0, 8); + memcpy((void *)(carSaveLocation + 0xA8), carData + 0xA8, 8); + memcpy((void *)(carSaveLocation + 0xB8), carData + 0xB8, 8); + memcpy((void *)(carSaveLocation + 0xC8), carData + 0xC8, 8); + memcpy((void *)(carSaveLocation + 0xD8), carData + 0xD8, 8); + //memcpy((void *)(carSaveLocation + 0xE0), carData + 0xE0, 8); + } + fclose(file); + } + } + loadOk = false; +} + +static int ReturnTrue() +{ + return 1; +} + +void GenerateDongleData(bool isTerminal) +{ + memset(hasp_buffer, 0, 0xD40); + hasp_buffer[0] = 0x01; + hasp_buffer[0x13] = 0x01; + hasp_buffer[0x17] = 0x0A; + hasp_buffer[0x1B] = 0x04; + hasp_buffer[0x1C] = 0x3B; + hasp_buffer[0x1D] = 0x6B; + hasp_buffer[0x1E] = 0x40; + hasp_buffer[0x1F] = 0x87; + + hasp_buffer[0x23] = 0x01; + hasp_buffer[0x27] = 0x0A; + hasp_buffer[0x2B] = 0x04; + hasp_buffer[0x2C] = 0x3B; + hasp_buffer[0x2D] = 0x6B; + hasp_buffer[0x2E] = 0x40; + hasp_buffer[0x2F] = 0x87; + if(isTerminal) + { + memcpy(hasp_buffer + 0xD00, "272211990002", 12); + hasp_buffer[0xD3E] = 0x63; + hasp_buffer[0xD3F] = 0x9C; + } + else + { + memcpy(hasp_buffer + 0xD00, "272213990002", 12); + hasp_buffer[0xD3E] = 0x65; + hasp_buffer[0xD3F] = 0x9A; + } +} + +char customName[256]; + +static DWORD WINAPI SpamCustomName(LPVOID) +{ + while (true) + { + Sleep(50); + void *value = (void *)(imageBase + 0x194C230); + memcpy(value, customName, strlen(customName) + 1); + } +} + +static DWORD WINAPI SpamMulticast(LPVOID) +{ + WSADATA wsaData; + WSAStartup(MAKEWORD(2, 2), &wsaData); + + SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + + int ttl = 255; + setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, sizeof(ttl)); + + int reuse = 1; + setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&reuse, sizeof(reuse)); + + setsockopt(sock, IPPROTO_IP, IP_MULTICAST_LOOP, (char*)&reuse, sizeof(reuse)); + + sockaddr_in bindAddr = { 0 }; + bindAddr.sin_family = AF_INET; + bindAddr.sin_addr.s_addr = 0; + bindAddr.sin_port = htons(50765); + + bind(sock, (sockaddr*)&bindAddr, sizeof(bindAddr)); + + ip_mreq mreq; + mreq.imr_multiaddr.s_addr = inet_addr("225.0.0.1"); + mreq.imr_interface.s_addr = INADDR_ANY; + + setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof(mreq)); + + const uint8_t* byteSequences_Free[] = { + terminalPackage1_Free, + terminalPackage2_Free, + terminalPackage3_Free, + terminalPackage4_Free, + terminalPackage5_Free, + terminalPackage6_Free, + }; + + const size_t byteSizes_Free[] = { + sizeof(terminalPackage1_Free), + sizeof(terminalPackage2_Free), + sizeof(terminalPackage3_Free), + sizeof(terminalPackage4_Free), + sizeof(terminalPackage5_Free), + sizeof(terminalPackage6_Free), + }; + + const uint8_t* byteSequences_Coin[] = { + terminalPackage1_Coin, + terminalPackage2_Coin, + terminalPackage3_Coin, + terminalPackage4_Coin, + terminalPackage5_Coin, + terminalPackage6_Coin, + }; + + const size_t byteSizes_Coin[] = { + sizeof(terminalPackage1_Coin), + sizeof(terminalPackage2_Coin), + sizeof(terminalPackage3_Coin), + sizeof(terminalPackage4_Coin), + sizeof(terminalPackage5_Coin), + sizeof(terminalPackage6_Coin), + }; + + sockaddr_in toAddr = { 0 }; + toAddr.sin_family = AF_INET; + toAddr.sin_addr.s_addr = inet_addr("225.0.0.1"); + toAddr.sin_port = htons(50765); + + + if (isFreePlay) + { + while(true) for (int i = 0; i < _countof(byteSequences_Free); i++) + { + sendto(sock, (const char*)byteSequences_Free[i], byteSizes_Free[i], 0, (sockaddr*)&toAddr, sizeof(toAddr)); + Sleep(8); + } + } + + while (true) for (int i = 0; i < _countof(byteSequences_Coin); i++) + { + sendto(sock, (const char*)byteSequences_Coin[i], byteSizes_Coin[i], 0, (sockaddr*)&toAddr, sizeof(toAddr)); + Sleep(8); + } +} + +extern int* ffbOffset; +extern int* ffbOffset2; +extern int* ffbOffset3; +extern int* ffbOffset4; + +DWORD WINAPI Wmmt5FfbCollector(void* ctx) +{ + uintptr_t imageBase = (uintptr_t)GetModuleHandleA(0); + while (true) + { + *ffbOffset = *(DWORD *)(imageBase + 0x196F188); + *ffbOffset2 = *(DWORD *)(imageBase + 0x196F18c); + *ffbOffset3 = *(DWORD *)(imageBase + 0x196F190); + *ffbOffset4 = *(DWORD *)(imageBase + 0x196F194); + Sleep(10); + } +} + +static InitFunction Wmmt5Func([]() +{ + FILE* fileF = _wfopen(L"Fsetting.lua.gz", L"r"); + if (fileF == NULL) + { + FILE* settingsF = _wfopen(L"Fsetting.lua.gz", L"wb"); + fwrite(settingData, 1, sizeof(settingData), settingsF); + fclose(settingsF); + } + else + { + fclose(fileF); + } + + FILE* fileG = _wfopen(L"Gsetting.lua.gz", L"r"); + if (fileG == NULL) + { + FILE* settingsG = _wfopen(L"Gsetting.lua.gz", L"wb"); + fwrite(settingData, 1, sizeof(settingData), settingsG); + fclose(settingsG); + } + else + { + fclose(fileG); + } + + + bool isTerminal = false; + if (ToBool(config["General"]["TerminalMode"])) + { + isTerminal = true; + } + + hookPort = "COM3"; + imageBase = (uintptr_t)GetModuleHandleA(0); + MH_Initialize(); + + // Hook dongle funcs + MH_CreateHookApi(L"hasp_windows_x64_109906.dll", "hasp_write", Hook_hasp_write, NULL); + MH_CreateHookApi(L"hasp_windows_x64_109906.dll", "hasp_read", Hook_hasp_read, NULL); + MH_CreateHookApi(L"hasp_windows_x64_109906.dll", "hasp_get_size", Hook_hasp_get_size, NULL); + MH_CreateHookApi(L"hasp_windows_x64_109906.dll", "hasp_decrypt", Hook_hasp_decrypt, NULL); + MH_CreateHookApi(L"hasp_windows_x64_109906.dll", "hasp_encrypt", Hook_hasp_encrypt, NULL); + MH_CreateHookApi(L"hasp_windows_x64_109906.dll", "hasp_logout", Hook_hasp_logout, NULL); + MH_CreateHookApi(L"hasp_windows_x64_109906.dll", "hasp_login", Hook_hasp_login, NULL); + + GenerateDongleData(isTerminal); + + // Patch some check + // 0F 94 C0 84 C0 0F 94 C0 84 C0 75 05 45 32 E4 EB 03 41 B4 01 + // FOUND ON 21, 10 + // NOT WORKING 1 + // 0F 94 C0 84 C0 0F 94 C0 84 C0 75 05 45 32 ?? EB + // FOUND ON 1 + //injector::WriteMemory(imageBase + 0x6286EC, 0, true); + injector::WriteMemory(hook::get_pattern("0F 94 C0 84 C0 0F 94 C0 84 C0 75 05 45 32 ? EB", 0x13), 0, true); + + // Patch some jnz + // 83 C0 FD 83 F8 01 0F 87 B4 00 00 00 83 BF D0 06 00 00 3C 73 29 48 8D 8D 60 06 00 00 + // FOUND ON 21, 10 + // NOT FOUND: 1 + // 83 C0 FD 83 F8 01 0F 87 B4 00 00 00 + // FOUND ON 1 + //injector::MakeNOP(imageBase + 0x628AE0, 6); + injector::MakeNOP(hook::get_pattern("83 C0 FD 83 F8 01 0F 87 B4 00 00 00", 6), 6); + + // Patch some shit + // 83 FA 04 0F 8C 1E 01 00 00 4C 89 44 24 18 4C 89 4C 24 20 + // FOUND ON 21, 10, 1 + // NOT FOUND: + //injector::WriteMemory(imageBase + 0x7B9882, 0, true); + injector::WriteMemory(hook::get_pattern("83 FA 04 0F 8C 1E 01 00 00 4C 89 44 24 18 4C 89 4C 24 20", 2), 0, true); + + // Skip weird camera init that stucks entire pc on certain brands. TESTED ONLY ON 05!!!! + if (ToBool(config["General"]["WhiteScreenFix"])) + { + injector::WriteMemory(hook::get_pattern("48 8B C4 55 57 41 54 41 55 41 56 48 8D 68 A1 48 81 EC 90 00 00 00 48 C7 45 D7 FE FF FF FF 48 89 58 08 48 89 70 18 45 33 F6 4C 89 75 DF 33 C0 48 89 45 E7", 0), 0x90C3C032, true); + } + + // Patch some call + // 45 33 C0 BA 65 09 00 00 48 8D 4D B0 E8 ?? ?? ?? ?? 48 8B 08 + // FOUND ON 21, 10, 1 + //injector::MakeNOP(imageBase + 0x7DADED, 5); + injector::MakeNOP(hook::get_pattern("45 33 C0 BA 65 09 00 00 48 8D 4D B0 E8 ? ? ? ? 48 8B 08", 12), 5); + + { + // 199AE18 TIME OFFSET RVA + + auto location = hook::get_pattern("41 3B C7 74 0E 48 8D 8F B8 00 00 00 BA F6 01 00 00 EB 6E 48 8D 8F A0 00 00 00"); + // Patch some jnz + // 41 3B C7 74 0E 48 8D 8F B8 00 00 00 BA F6 01 00 00 EB 6E 48 8D 8F A0 00 00 00 + // FOUND ON 21, 10, 1 + //injector::WriteMemory(imageBase + 0x943F52, 0xEB, true); + injector::WriteMemory(location + 3, 0xEB, true); + + // Skip some jnz + //injector::MakeNOP(imageBase + 0x943F71, 2); + injector::MakeNOP(location + 0x22, 2); + + // Skip some jnz + //injector::MakeNOP(imageBase + 0x943F82, 2); + injector::MakeNOP(location + 0x33, 2); + } + + // Skip DebugBreak on MFStartup fail + // 48 83 EC 28 33 D2 B9 70 00 02 00 E8 ?? ?? ?? ?? 85 C0 79 06 + // FOUND on 21, 1 + { + auto location = hook::get_pattern("48 83 EC 28 33 D2 B9 70 00 02 00 E8 ? ? ? ? 85 C0 79 06"); + injector::WriteMemory(location + 0x12, 0xEB, true); + } + //safeJMP(hook::get_pattern(V("48 83 EC 28 33 D2 B9 70 00 02 00 E8 ? ? ? ? 85 C0 79 06")), ReturnTrue); + + if (isTerminal) + { + // Patch some func to 1 + // + // FOUND ON 21, 10, 1 + // NOT FOUND: + //safeJMP(imageBase + 0x7BE440, ReturnTrue); + safeJMP(hook::get_pattern("0F B6 41 05 2C 30 3C 09 77 04 0F BE C0 C3 83 C8 FF C3"), ReturnTrue); + + // Patch some func to 1 + // 40 53 48 83 EC 20 48 83 39 00 48 8B D9 75 28 48 8D ?? ?? ?? ?? 00 48 8D ?? ?? ?? ?? 00 41 B8 ?? ?? 00 00 FF 15 ?? ?? ?? ?? 4C 8B 1B 41 0F B6 43 78 + // FOUND ON 21, 10, 1 + //safeJMP(imageBase + 0x7CF8D0, ReturnTrue); + safeJMP(hook::get_pattern("40 53 48 83 EC 20 48 83 39 00 48 8B D9 75 28 48 8D ? ? ? ? 00 48 8D ? ? ? ? 00 41 B8 ? ? 00 00 FF 15 ? ? ? ? 4C 8B 1B 41 0F B6 43 78"), ReturnTrue); + } + else + { + // Disregard terminal scanner stuff. + // 48 8B 18 48 3B D8 0F 84 88 00 00 00 39 7B 1C 74 60 80 7B 31 00 75 4F 48 8B 43 10 80 78 31 00 + // FOUND ON 21, 10, 1 + //injector::MakeNOP(imageBase + 0x91E1AE, 6); + //injector::MakeNOP(imageBase + 0x91E1B7, 2); + //injector::MakeNOP(imageBase + 0x91E1BD, 2); + { + auto location = hook::get_pattern("48 8B 18 48 3B D8 0F 84 88 00 00 00 39 7B 1C 74 60 80 7B 31 00 75 4F 48 8B 43 10 80 78 31 00"); + injector::MakeNOP(location + 6, 6); // 6 + injector::MakeNOP(location + 0xF, 2); // 0xF + injector::MakeNOP(location + 0x15, 2); // 0x15 + } + + // spam thread + if (ToBool(config["General"]["TerminalEmulator"])) + { + CreateThread(0, 0, SpamMulticast, 0, 0, 0); + } + } + + auto chars = { 'F', 'G' }; + + for (auto cha : chars) + { + auto patterns = hook::pattern(va("%02X 3A 2F", cha)); + + if (patterns.size() > 0) + { + for (int i = 0; i < patterns.size(); i++) + { + char* text = patterns.get(i).get(0); + std::string text_str(text); + + std::string to_replace = va("%c:/", cha); + std::string replace_with = va("./%c", cha); + + std::string replaced = text_str.replace(0, to_replace.length(), replace_with); + + injector::WriteMemoryRaw(text, (char*)replaced.c_str(), replaced.length() + 1, true); + } + } + } + + if (ToBool(config["General"]["SkipMovies"])) + { + // Skip movies fuck you wmmt5 + safeJMP(imageBase + 0x806020, ReturnTrue); + } + + isFreePlay = ToBool(config["General"]["FreePlay"]); + + std::string value = config["General"]["CustomName"]; + if (!value.empty()) + { + memset(customName, 0, 256); + strcpy(customName, value.c_str()); + CreateThread(0, 0, SpamCustomName, 0, 0, 0); + } + + // Save story stuff (only 05) + { + // skip erasing of temp card data + injector::WriteMemory(imageBase + 0x8DEBC3, 0xEB, true); + // Skip erasing of temp card + safeJMP(imageBase + 0x54DCE1, LoadGameData); + safeJMP(imageBase + 0x5612F0, ReturnTrue); + safeJMP(imageBase + 0x5753C0, ReturnTrue); + safeJMP(imageBase + 0x57DF10, ReturnTrue); + + safeJMP(imageBase + 0x92DB20, ReturnTrue); + safeJMP(imageBase + 0x5628C0, ReturnTrue); + safeJMP(imageBase + 0x579090, ReturnTrue); + + // Skip more + safeJMP(imageBase + 0x54B0F0, ReturnTrue); + safeJMP(imageBase + 0x909DB0, ReturnTrue); + safeJMP(imageBase + 0x59FD90, ReturnTrue); + safeJMP(imageBase + 0x5A0030, ReturnTrue); + safeJMP(imageBase + 0x915370, ReturnTrue); + safeJMP(imageBase + 0x5507A0, ReturnTrue); + safeJMP(imageBase + 0x561290, ReturnTrue); + + safeJMP(imageBase + 0x5A0AE8, LoadWmmt5CarData); + + // crash fix + //safeJMP(imageBase + 0xAD6F28, WmmtOperatorDelete); + //safeJMP(imageBase + 0xAD6F4C, WmmtMemset); + + // Save progress trigger + injector::WriteMemory(imageBase + 0x556CE3, 0xB848, true); + injector::WriteMemory(imageBase + 0x556CE3 + 2, (uintptr_t)SaveOk, true); + injector::WriteMemory(imageBase + 0x556CED, 0x9090D0FF, true); + + // Try save later! + injector::MakeNOP(imageBase + 0x308546, 0x12); + injector::WriteMemory(imageBase + 0x308546, 0xB848, true); + injector::WriteMemory(imageBase + 0x308546 + 2, (uintptr_t)SaveGameData, true); + injector::WriteMemory(imageBase + 0x308550, 0x3348D0FF, true); + injector::WriteMemory(imageBase + 0x308550 + 4, 0x90C0, true); + + CreateThread(0, 0, Wmmt5FfbCollector, 0, 0, 0); + } + + MH_EnableHook(MH_ALL_HOOKS); + +}, GameID::WMMT5); +#endif +#pragma optimize("", on) \ No newline at end of file diff --git a/OpenParrot/src/Functions/Ring_amLib/amJvs.cpp b/OpenParrot/src/Functions/Ring_amLib/amJvs.cpp index 38b0499..1c484e2 100644 --- a/OpenParrot/src/Functions/Ring_amLib/amJvs.cpp +++ b/OpenParrot/src/Functions/Ring_amLib/amJvs.cpp @@ -330,7 +330,7 @@ BOOL __stdcall Hook_ClearCommError(HANDLE hFile, LPDWORD lpErrors, LPCOMSTAT lpS MH_CreateHookApi(L ## mod, #name, &Hook_##name, (void**)&__##name) static InitFunction jvsInit([]() -{ +{ if (GameDetect::IsNesicaGame()) { return; diff --git a/OpenParrot/src/Utility/GameDetect.cpp b/OpenParrot/src/Utility/GameDetect.cpp index 6959167..6e502d1 100644 --- a/OpenParrot/src/Utility/GameDetect.cpp +++ b/OpenParrot/src/Utility/GameDetect.cpp @@ -337,6 +337,18 @@ void GameDetect::DetectCurrentGame() currentGame = GameID::PokkenTournament; break; } + // PATCHES 0-9 + if (*(uint32_t*)(moduleBase + 0x2F00) == 0xFFCB8B48) + { + currentGame = GameID::WMMT5; + break; + } + // PATCHES 10-21 + if (*(uint32_t*)(moduleBase + 0x2F00) == 0x084AFF48) + { + currentGame = GameID::WMMT5; + break; + } #endif #ifdef _DEBUG diff --git a/OpenParrot/src/Utility/GameID.h b/OpenParrot/src/Utility/GameID.h index ce94551..314f0ee 100644 --- a/OpenParrot/src/Utility/GameID.h +++ b/OpenParrot/src/Utility/GameID.h @@ -41,5 +41,6 @@ enum class GameID PokkenTournament, ExBoardGeneric, GrooveCoaster2, - PuzzleBobble + PuzzleBobble, + WMMT5 }; \ No newline at end of file