move more text into text.h, refactor and fix bug in texthook

This commit is contained in:
Akash Mozumdar 2019-01-01 18:44:27 -05:00
parent 3dd7be65ff
commit 479c73d029
4 changed files with 25 additions and 34 deletions

View File

@ -26,9 +26,9 @@ u8"Negatives for data_offset/sub_offset refer to registers\r\n"
u8"-4 for EAX, -8 for ECX, -C for EDX, -10 for EBX, -14 for ESP, -18 for EBP, -1C for ESI, -20 for EDI\r\n" u8"-4 for EAX, -8 for ECX, -C for EDX, -10 for EBX, -14 for ESP, -18 for EBP, -1C for ESI, -20 for EDI\r\n"
u8"* means dereference pointer+deref_offset"; u8"* means dereference pointer+deref_offset";
constexpr auto SAVE_SETTINGS = u8"Save settings"; constexpr auto SAVE_SETTINGS = u8"Save settings";
constexpr auto EXTEN_WINDOW_INSTRUCTIONS = u8"Drag and drop extensions (.dll files) here to add them\r\n" constexpr auto EXTEN_WINDOW_INSTRUCTIONS = u8"Drag and drop extension (.dll) files here from your computer to add them\r\n"
u8"Press delete with an extension selected to remove it\r\n" u8"Drag and drop within the list to reorder\r\n"
u8"Drag and drop extensions to rearrange them"; u8"Press delete with an extension selected to remove it";
constexpr auto WINDOW = u8"Window"; constexpr auto WINDOW = u8"Window";
constexpr auto DEFAULT_CODEPAGE = u8"Default Codepage"; constexpr auto DEFAULT_CODEPAGE = u8"Default Codepage";
constexpr auto FLUSH_DELAY = u8"Flush Delay"; constexpr auto FLUSH_DELAY = u8"Flush Delay";
@ -38,7 +38,7 @@ L"Made by me: Artikash (email: akashmozumdar@gmail.com)\r\n"
L"Please contact me with any problems, feature requests, or questions relating to Textractor\r\n" L"Please contact me with any problems, feature requests, or questions relating to Textractor\r\n"
L"You can do so via the project homepage (issues section) or via email\r\n" L"You can do so via the project homepage (issues section) or via email\r\n"
L"Source code available under GPLv3 at project homepage\r\n" L"Source code available under GPLv3 at project homepage\r\n"
L"I'm currently on the job market: please email me if you're hiring US software engineers"; L"I'm currently looking for a new job: please email me if you're hiring US software engineers";
constexpr auto UPDATE_AVAILABLE = L"Update available: download it from https://github.com/Artikash/Textractor/releases"; constexpr auto UPDATE_AVAILABLE = L"Update available: download it from https://github.com/Artikash/Textractor/releases";
constexpr auto ALREADY_INJECTED = L"Textractor: already injected"; constexpr auto ALREADY_INJECTED = L"Textractor: already injected";
constexpr auto ARCHITECTURE_MISMATCH = L"Textractor: architecture mismatch: try 32 bit Textractor instead"; constexpr auto ARCHITECTURE_MISMATCH = L"Textractor: architecture mismatch: try 32 bit Textractor instead";
@ -53,6 +53,9 @@ constexpr auto TOO_MANY_HOOKS = u8"Textractor: too many hooks: can't insert";
constexpr auto FUNC_MISSING = u8"Textractor: function not present"; constexpr auto FUNC_MISSING = u8"Textractor: function not present";
constexpr auto MODULE_MISSING = u8"Textractor: module not present"; constexpr auto MODULE_MISSING = u8"Textractor: module not present";
constexpr auto GARBAGE_MEMORY = u8"Textractor: memory constantly changing, useless to read"; constexpr auto GARBAGE_MEMORY = u8"Textractor: memory constantly changing, useless to read";
constexpr auto SEND_ERROR = u8"Textractor: Send ERROR (likely an incorrect H-code)";
constexpr auto READ_ERROR = u8"Textractor: Reader ERROR (likely an incorrect R-code)";
constexpr auto HIJACK_ERROR = u8"Textractor: Hijack ERROR";
constexpr auto SELECT_LANGUAGE = u8"Select Language"; constexpr auto SELECT_LANGUAGE = u8"Select Language";
constexpr auto BING_PROMPT = u8"What language should Bing translate to?"; constexpr auto BING_PROMPT = u8"What language should Bing translate to?";
constexpr auto GOOGLE_PROMPT = u8"What language should Google translate to?"; constexpr auto GOOGLE_PROMPT = u8"What language should Google translate to?";

View File

@ -13,6 +13,7 @@
#include "util/growl.h" #include "util/growl.h"
#include "util/util.h" #include "util/util.h"
#include "main.h" #include "main.h"
#include "text.h"
#include "ithsys/ithsys.h" #include "ithsys/ithsys.h"
//#define ConsoleOutput(...) (void)0 // jichi 8/18/2013: I don't need ConsoleOutput //#define ConsoleOutput(...) (void)0 // jichi 8/18/2013: I don't need ConsoleOutput
@ -866,7 +867,7 @@ bool DetermineEngineType()
bool found = false; bool found = false;
#ifndef ITH_DISABLE_ENGINE #ifndef ITH_DISABLE_ENGINE
__try { found = UnsafeDetermineEngineType(); } __try { found = UnsafeDetermineEngineType(); }
__except (ExceptHandler((GetExceptionInformation())->ExceptionRecord, 0, 0, 0)) { ConsoleOutput("Textractor: Hijack ERROR"); } __except (ExceptHandler((GetExceptionInformation())->ExceptionRecord, 0, 0, 0)) { ConsoleOutput(HIJACK_ERROR); }
#endif // ITH_DISABLE_ENGINE #endif // ITH_DISABLE_ENGINE
if (!found) { // jichi 10/2/2013: Only enable it if no game engine is detected if (!found) { // jichi 10/2/2013: Only enable it if no game engine is detected
PcHooks::hookOtherPcFunctions(); PcHooks::hookOtherPcFunctions();

View File

@ -1,6 +1,7 @@
#include "main.h"
#include "native/pchooks.h"
#include "match.h" #include "match.h"
#include "main.h"
#include "text.h"
#include "native/pchooks.h"
namespace Engine namespace Engine
{ {
@ -15,6 +16,6 @@ namespace Engine
PcHooks::hookGDIPlusFunctions(); PcHooks::hookGDIPlusFunctions();
PcHooks::hookOtherPcFunctions(); PcHooks::hookOtherPcFunctions();
} }
__except (EXCEPTION_EXECUTE_HANDLER) { ConsoleOutput("Textractor: Hijack ERROR"); } __except (EXCEPTION_EXECUTE_HANDLER) { ConsoleOutput(HIJACK_ERROR); }
} }
} }

View File

@ -18,7 +18,6 @@ extern std::unique_ptr<WinMutex> viewMutex;
namespace { // unnamed namespace { // unnamed
#ifndef _WIN64 #ifndef _WIN64
BYTE common_hook[] = { BYTE common_hook[] = {
0x9c, // pushfd 0x9c, // pushfd
0x60, // pushad 0x60, // pushad
@ -34,7 +33,7 @@ namespace { // unnamed
0x68, 0,0,0,0, // push @original 0x68, 0,0,0,0, // push @original
0xc3 // ret ; basically absolute jmp to @original 0xc3 // ret ; basically absolute jmp to @original
}; };
int this_offset = 9, send_offset = 14, original_offset = 24;
#else #else
BYTE common_hook[] = { BYTE common_hook[] = {
0x9c, // push rflags 0x9c, // push rflags
@ -86,6 +85,7 @@ namespace { // unnamed
0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmp qword ptr [0] ; relative to next instruction (i.e. jmp @original) 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmp qword ptr [0] ; relative to next instruction (i.e. jmp @original)
0,0,0,0,0,0,0,0 // @original 0,0,0,0,0,0,0,0 // @original
}; };
int this_offset = 50, send_offset = 60, original_offset = 116;
#endif #endif
bool trigger = false; bool trigger = false;
@ -189,7 +189,7 @@ void TextHook::Send(uintptr_t dwDataBase)
{ {
if (!err) if (!err)
{ {
ConsoleOutput("Textractor: Send ERROR (likely an incorrect H-code)"); ConsoleOutput(SEND_ERROR);
err = true; err = true;
} }
} }
@ -207,28 +207,14 @@ bool TextHook::InsertHookCode()
else return ConsoleOutput(MODULE_MISSING), false; else return ConsoleOutput(MODULE_MISSING), false;
void* original; void* original;
insert: MH_STATUS error;
if (MH_STATUS err = MH_CreateHook(location, trampoline, &original)) while ((error = MH_CreateHook(location, trampoline, &original)) != MH_OK)
if (err == MH_ERROR_ALREADY_CREATED) if (error == MH_ERROR_ALREADY_CREATED) RemoveHook(address);
{ else return ConsoleOutput(MH_StatusToString(error)), false;
RemoveHook(address);
goto insert; // FIXME: i'm too lazy to do this properly right now...
}
else
{
ConsoleOutput(MH_StatusToString(err));
return false;
}
#ifndef _WIN64 *(TextHook**)(common_hook + this_offset) = this;
*(TextHook**)(common_hook + 9) = this; *(void(TextHook::**)(uintptr_t))(common_hook + send_offset) = &TextHook::Send;
*(void(TextHook::**)(uintptr_t))(common_hook + 14) = &TextHook::Send; *(void**)(common_hook + original_offset) = original;
*(void**)(common_hook + 24) = original;
#else // _WIN32
*(TextHook**)(common_hook + 50) = this;
*(void(TextHook::**)(uintptr_t))(common_hook + 60) = &TextHook::Send;
*(void**)(common_hook + 116) = original;
#endif // _WIN64
memcpy(trampoline, common_hook, sizeof(common_hook)); memcpy(trampoline, common_hook, sizeof(common_hook));
return MH_EnableHook(location) == MH_OK; return MH_EnableHook(location) == MH_OK;
} }
@ -243,7 +229,7 @@ DWORD WINAPI TextHook::Reader(LPVOID hookPtr)
uint64_t currentAddress = This->address; uint64_t currentAddress = This->address;
while (WaitForSingleObject(This->readerEvent, 500) == WAIT_TIMEOUT) while (WaitForSingleObject(This->readerEvent, 500) == WAIT_TIMEOUT)
{ {
if (This->hp.type & DATA_INDIRECT) currentAddress = *(uint64_t*)This->address + This->hp.index; if (This->hp.type & DATA_INDIRECT) currentAddress = *(uintptr_t*)This->address + This->hp.index;
if (memcmp(buffer, (void*)currentAddress, dataLen + 1) == 0) if (memcmp(buffer, (void*)currentAddress, dataLen + 1) == 0)
{ {
changeCount = 0; changeCount = 0;
@ -265,7 +251,7 @@ DWORD WINAPI TextHook::Reader(LPVOID hookPtr)
} }
__except (EXCEPTION_EXECUTE_HANDLER) __except (EXCEPTION_EXECUTE_HANDLER)
{ {
ConsoleOutput("Textractor: Reader ERROR (likely an incorrect R-code)"); ConsoleOutput(READ_ERROR);
This->Clear(); This->Clear();
} }
return 0; return 0;