mirror of
https://github.com/Artikash/Textractor.git
synced 2024-12-23 17:04:12 +08:00
removed reliance on undocumented windows internals in vnrhook
This commit is contained in:
parent
3a001e66b2
commit
9bc95191ff
@ -4366,15 +4366,16 @@ void SpecialHookRUGP1(DWORD esp_base, HookParam *hp, BYTE, DWORD *data, DWORD *s
|
|||||||
// jichi 10/1/2013: Change return type to bool
|
// jichi 10/1/2013: Change return type to bool
|
||||||
bool InsertRUGP1Hook()
|
bool InsertRUGP1Hook()
|
||||||
{
|
{
|
||||||
DWORD low, high;
|
DWORD low;
|
||||||
if (!Util::CheckFile(L"rvmm.dll") || !SafeFillRange(L"rvmm.dll", &low, &high)) {
|
if (!Util::CheckFile(L"rvmm.dll")) {
|
||||||
ConsoleOutput("vnreng:rUGP: rvmm.dll does not exist");
|
ConsoleOutput("vnreng:rUGP: rvmm.dll does not exist");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
//WCHAR str[0x40];
|
//WCHAR str[0x40];
|
||||||
LPVOID ch = (LPVOID)0x8140;
|
LPVOID ch = (LPVOID)0x8140;
|
||||||
enum { range = 0x20000 };
|
enum { range = 0x20000 };
|
||||||
DWORD t = SearchPattern(low + range, high - low - range, &ch, 4) + range;
|
low = (DWORD)GetModuleHandleW(L"rvmm.dll");
|
||||||
|
DWORD t = SearchPattern(low + range, process_limit, &ch, 4) + range;
|
||||||
BYTE *s = (BYTE *)(low + t);
|
BYTE *s = (BYTE *)(low + t);
|
||||||
//if (t) {
|
//if (t) {
|
||||||
if (t != range) { // jichi 10/1/2013: Changed to compare with 0x20000
|
if (t != range) { // jichi 10/1/2013: Changed to compare with 0x20000
|
||||||
@ -4510,7 +4511,7 @@ bool InsertRUGP1Hook()
|
|||||||
bool InsertRUGP2Hook()
|
bool InsertRUGP2Hook()
|
||||||
{
|
{
|
||||||
DWORD low, high;
|
DWORD low, high;
|
||||||
if (!Util::CheckFile(L"vm60.dll") || !SafeFillRange(L"vm60.dll", &low, &high)) {
|
if (!Util::CheckFile(L"vm60.dll") /*|| !SafeFillRange(L"vm60.dll", &low, &high)*/) {
|
||||||
ConsoleOutput("vnreng:rUGP2: vm60.dll does not exist");
|
ConsoleOutput("vnreng:rUGP2: vm60.dll does not exist");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -4524,7 +4525,7 @@ bool InsertRUGP2Hook()
|
|||||||
0x89,0x75, 0x0c // 1001e527 8975 0c mov dword ptr ss:[ebp+0xc],esi
|
0x89,0x75, 0x0c // 1001e527 8975 0c mov dword ptr ss:[ebp+0xc],esi
|
||||||
};
|
};
|
||||||
enum { addr_offset = 0x1001e51d - 0x1001e515 };
|
enum { addr_offset = 0x1001e51d - 0x1001e515 };
|
||||||
ULONG addr = MemDbg::findBytes(bytes, sizeof(bytes), low, high);
|
ULONG addr = MemDbg::findBytes(bytes, sizeof(bytes), process_base, process_limit);
|
||||||
//GROWL_DWORD(addr);
|
//GROWL_DWORD(addr);
|
||||||
if (!addr) {
|
if (!addr) {
|
||||||
ConsoleOutput("vnreng:rUGP2: pattern not found");
|
ConsoleOutput("vnreng:rUGP2: pattern not found");
|
||||||
@ -4596,7 +4597,7 @@ System40 hook:
|
|||||||
data offset dynamically.
|
data offset dynamically.
|
||||||
********************************************************************************************/
|
********************************************************************************************/
|
||||||
|
|
||||||
static void InsertAliceHook1(DWORD addr, DWORD module, DWORD limit)
|
static void InsertAliceHook1(DWORD addr)
|
||||||
{
|
{
|
||||||
if (!addr) {
|
if (!addr) {
|
||||||
ConsoleOutput("vnreng:AliceHook1: failed");
|
ConsoleOutput("vnreng:AliceHook1: failed");
|
||||||
@ -4605,7 +4606,6 @@ static void InsertAliceHook1(DWORD addr, DWORD module, DWORD limit)
|
|||||||
for (DWORD i = addr, s = addr; i < s + 0x100; i++)
|
for (DWORD i = addr, s = addr; i < s + 0x100; i++)
|
||||||
if (*(BYTE *)i == 0xe8) { // Find the first relative call.
|
if (*(BYTE *)i == 0xe8) { // Find the first relative call.
|
||||||
DWORD j = i + 5 + *(DWORD *)(i + 1);
|
DWORD j = i + 5 + *(DWORD *)(i + 1);
|
||||||
if (j > module && j < limit) {
|
|
||||||
while (true) { // Find the first register push onto stack.
|
while (true) { // Find the first register push onto stack.
|
||||||
DWORD c = ::disasm((BYTE *)s);
|
DWORD c = ::disasm((BYTE *)s);
|
||||||
if (c == 1)
|
if (c == 1)
|
||||||
@ -4624,7 +4624,6 @@ static void InsertAliceHook1(DWORD addr, DWORD module, DWORD limit)
|
|||||||
//RegisterEngineType(ENGINE_SYS40);
|
//RegisterEngineType(ENGINE_SYS40);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
ConsoleOutput("vnreng:AliceHook1: failed");
|
ConsoleOutput("vnreng:AliceHook1: failed");
|
||||||
}
|
}
|
||||||
static void InsertAliceHook2(DWORD addr)
|
static void InsertAliceHook2(DWORD addr)
|
||||||
@ -4649,12 +4648,20 @@ static void InsertAliceHook2(DWORD addr)
|
|||||||
// jichi 5/13/2015: Looking for function entries in StoatSpriteEngine.dll
|
// jichi 5/13/2015: Looking for function entries in StoatSpriteEngine.dll
|
||||||
bool InsertAliceHook()
|
bool InsertAliceHook()
|
||||||
{
|
{
|
||||||
DWORD low, high, addr;
|
DWORD addr;
|
||||||
if (GetFunctionAddr("SP_TextDraw", &addr, &low, &high, 0) && addr) {
|
if (addr = (DWORD)GetProcAddress(GetModuleHandleW(L"SACT2.dll"), "SP_TextDraw")) {
|
||||||
InsertAliceHook1(addr, low, low + high);
|
InsertAliceHook1(addr);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (GetFunctionAddr("SP_SetTextSprite", &addr, &low, &high, 0) && addr) {
|
if (addr = (DWORD)GetProcAddress(GetModuleHandleW(L"SACTDX.dll"), "SP_TextDraw")) {
|
||||||
|
InsertAliceHook1(addr);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//if (GetFunctionAddr("SP_SetTextSprite", &addr, &low, &high, 0) && addr) {
|
||||||
|
// InsertAliceHook2(addr);
|
||||||
|
// return true;
|
||||||
|
//}
|
||||||
|
if (addr = (DWORD)GetProcAddress(GetModuleHandleW(L"StoatSpriteEngine.dll"), "SP_SetTextSprite")) { // Artikash 6/27/2018 not sure if this works
|
||||||
InsertAliceHook2(addr);
|
InsertAliceHook2(addr);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -8216,12 +8223,7 @@ void SpecialHookDebonosuScenario(DWORD esp_base, HookParam *hp, BYTE, DWORD *dat
|
|||||||
}
|
}
|
||||||
bool InsertDebonosuScenarioHook()
|
bool InsertDebonosuScenarioHook()
|
||||||
{
|
{
|
||||||
DWORD fun;
|
DWORD addr = Util::FindImportEntry(process_base, (DWORD)lstrcatA);
|
||||||
if (!GetFunctionAddr("lstrcatA", &fun, 0, 0, 0)) {
|
|
||||||
ConsoleOutput("vnreng:Debonosu: failed to find lstrcatA");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
DWORD addr = Util::FindImportEntry(process_base, fun);
|
|
||||||
if (!addr) {
|
if (!addr) {
|
||||||
ConsoleOutput("vnreng:Debonosu: lstrcatA is not called");
|
ConsoleOutput("vnreng:Debonosu: lstrcatA is not called");
|
||||||
return false;
|
return false;
|
||||||
@ -8796,11 +8798,11 @@ bool InsertIGSDynamicHook(LPVOID addr, DWORD frame, DWORD stack)
|
|||||||
i = *(DWORD *)frame;
|
i = *(DWORD *)frame;
|
||||||
i = *(DWORD *)(i+4);
|
i = *(DWORD *)(i+4);
|
||||||
DWORD j, k;
|
DWORD j, k;
|
||||||
if (SafeFillRange(L"mscorlib.ni.dll", &j, &k)) {
|
//if (SafeFillRange(L"mscorlib.ni.dll", &j, &k)) { // Artikash 6/30/2018: Dunno why addresses are needed
|
||||||
while (*(BYTE *)i != 0xe8)
|
while (*(BYTE *)i != 0xe8)
|
||||||
i++;
|
i++;
|
||||||
DWORD t = *(DWORD *)(i + 1) + i + 5;
|
DWORD t = *(DWORD *)(i + 1) + i + 5;
|
||||||
if (t>j && t<k) {
|
//if (t>j && t<k) {
|
||||||
HookParam hp = {};
|
HookParam hp = {};
|
||||||
hp.address = t;
|
hp.address = t;
|
||||||
hp.offset = -0x10;
|
hp.offset = -0x10;
|
||||||
@ -8812,8 +8814,8 @@ bool InsertIGSDynamicHook(LPVOID addr, DWORD frame, DWORD stack)
|
|||||||
//ConsoleOutput("IGS - Please set text(ヂ<>ス<EFBFBD> display speed(表示速度) to fastest(瞬<>");
|
//ConsoleOutput("IGS - Please set text(ヂ<>ス<EFBFBD> display speed(表示速度) to fastest(瞬<>");
|
||||||
//RegisterEngineType(ENGINE_IGS);
|
//RegisterEngineType(ENGINE_IGS);
|
||||||
return true;
|
return true;
|
||||||
}
|
//}
|
||||||
}
|
//}
|
||||||
ConsoleOutput("vnreng:IGS: failed");
|
ConsoleOutput("vnreng:IGS: failed");
|
||||||
return true; // jichi 12/25/2013: return true
|
return true; // jichi 12/25/2013: return true
|
||||||
}
|
}
|
||||||
|
@ -54,68 +54,6 @@ HMODULE currentModule;
|
|||||||
extern DWORD enter_count;
|
extern DWORD enter_count;
|
||||||
//extern LPWSTR current_dir;
|
//extern LPWSTR current_dir;
|
||||||
extern DWORD engine_type;
|
extern DWORD engine_type;
|
||||||
std::unordered_map<std::string, FunctionInfo> functionInfoByName;
|
|
||||||
|
|
||||||
namespace { // unnamed
|
|
||||||
|
|
||||||
void AddModule(DWORD hModule, DWORD size, LPWSTR name)
|
|
||||||
{
|
|
||||||
FunctionInfo info = {0, hModule, size, name};
|
|
||||||
IMAGE_DOS_HEADER *DosHdr = (IMAGE_DOS_HEADER *)hModule;
|
|
||||||
if (IMAGE_DOS_SIGNATURE == DosHdr->e_magic) {
|
|
||||||
DWORD dwReadAddr = hModule + DosHdr->e_lfanew;
|
|
||||||
IMAGE_NT_HEADERS *NtHdr = (IMAGE_NT_HEADERS *)dwReadAddr;
|
|
||||||
if (IMAGE_NT_SIGNATURE == NtHdr->Signature) {
|
|
||||||
DWORD dwExportAddr = NtHdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
|
|
||||||
if (dwExportAddr == 0)
|
|
||||||
return;
|
|
||||||
dwExportAddr += hModule;
|
|
||||||
IMAGE_EXPORT_DIRECTORY *ExtDir = (IMAGE_EXPORT_DIRECTORY*)dwExportAddr;
|
|
||||||
dwExportAddr = hModule+ExtDir->AddressOfNames;
|
|
||||||
for (UINT uj = 0; uj < ExtDir->NumberOfNames; uj++) {
|
|
||||||
DWORD dwFuncName = *(DWORD *)dwExportAddr;
|
|
||||||
char *pcBuffer = (char *)(hModule + dwFuncName);
|
|
||||||
char *pcFuncPtr = (char *)(hModule + (DWORD)ExtDir->AddressOfNameOrdinals+(uj * sizeof(WORD)));
|
|
||||||
WORD word = *(WORD *)pcFuncPtr;
|
|
||||||
pcFuncPtr = (char *)(hModule + (DWORD)ExtDir->AddressOfFunctions+(word * sizeof(DWORD)));
|
|
||||||
info.addr = hModule + *(DWORD *)pcFuncPtr;
|
|
||||||
::functionInfoByName[std::string(pcBuffer)] = info;
|
|
||||||
dwExportAddr += sizeof(DWORD);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AddAllModules()
|
|
||||||
{
|
|
||||||
// jichi 9/26/2013: AVLTree is already zero
|
|
||||||
PPEB ppeb;
|
|
||||||
__asm {
|
|
||||||
mov eax, fs:[0x30]
|
|
||||||
mov ppeb, eax
|
|
||||||
}
|
|
||||||
DWORD temp = *(DWORD *)(&ppeb->Ldr->InLoadOrderModuleList);
|
|
||||||
PLDR_DATA_TABLE_ENTRY it = (PLDR_DATA_TABLE_ENTRY)temp;
|
|
||||||
while (it->SizeOfImage) {
|
|
||||||
AddModule((DWORD)it->DllBase, it->SizeOfImage, it->BaseDllName.Buffer);
|
|
||||||
it = (PLDR_DATA_TABLE_ENTRY)it->InLoadOrderModuleList.Flink;
|
|
||||||
if (*(DWORD *)it == temp)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // unnamed namespace
|
|
||||||
|
|
||||||
DWORD GetFunctionAddr(const char *name, DWORD *addr, DWORD *base, DWORD *size, LPWSTR *base_name)
|
|
||||||
{
|
|
||||||
if (::functionInfoByName.find(std::string(name)) == ::functionInfoByName.end())
|
|
||||||
return FALSE;
|
|
||||||
FunctionInfo functionInfo = ::functionInfoByName[std::string(name)];
|
|
||||||
if (addr) *addr = functionInfo.addr;
|
|
||||||
if (base) *base = functionInfo.module;
|
|
||||||
if (size) *size = functionInfo.size;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL WINAPI DllMain(HINSTANCE hModule, DWORD fdwReason, LPVOID unused)
|
BOOL WINAPI DllMain(HINSTANCE hModule, DWORD fdwReason, LPVOID unused)
|
||||||
{
|
{
|
||||||
@ -163,7 +101,6 @@ BOOL WINAPI DllMain(HINSTANCE hModule, DWORD fdwReason, LPVOID unused)
|
|||||||
|
|
||||||
::running = true;
|
::running = true;
|
||||||
::current_available = ::hookman;
|
::current_available = ::hookman;
|
||||||
AddAllModules();
|
|
||||||
::currentModule = hModule;
|
::currentModule = hModule;
|
||||||
|
|
||||||
pipeThread = CreateThread(nullptr, 0, PipeManager, 0, 0, nullptr);
|
pipeThread = CreateThread(nullptr, 0, PipeManager, 0, 0, nullptr);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user