This commit is contained in:
恍兮惚兮 2024-12-07 19:56:15 +08:00
parent 01d1e803af
commit 84b0cee362
4 changed files with 77 additions and 58 deletions

View File

@ -1159,18 +1159,17 @@ bool Krkrtextrenderdll()
if (GetProcAddress(module, "V2Link") == 0) if (GetProcAddress(module, "V2Link") == 0)
return false; return false;
bool b1 = [module]() auto [minAddress, maxAddress] = Util::QueryModuleLimits(module);
bool b1 = [=]()
{ {
auto [minAddress, maxAddress] = Util::QueryModuleLimits(module);
BYTE bytes[] = { BYTE bytes[] = {
0x81, 0xEC, 0xFC, 0x00, 0x00, 0x00}; 0x81, 0xEC, 0xFC, 0x00, 0x00, 0x00};
auto addr = MemDbg::findBytes(bytes, sizeof(bytes), minAddress, maxAddress); auto addr = MemDbg::findBytes(bytes, sizeof(bytes), minAddress, maxAddress);
if (addr == 0) if (!addr)
return false; return false;
addr = MemDbg::findEnclosingAlignedFunction(addr); addr = MemDbg::findEnclosingAlignedFunction(addr);
if (addr == 0) if (!addr)
return false; return false;
ConsoleOutput("textrender %p", addr);
HookParam hp; HookParam hp;
hp.address = (DWORD)addr; hp.address = (DWORD)addr;
hp.offset = get_stack(2); hp.offset = get_stack(2);
@ -1178,9 +1177,8 @@ bool Krkrtextrenderdll()
return NewHook(hp, "krkr_textrender"); return NewHook(hp, "krkr_textrender");
}(); }();
bool b2 = [module]() bool b2 = [=]()
{ {
auto [minAddress, maxAddress] = Util::QueryModuleLimits(module);
BYTE bytes[] = { BYTE bytes[] = {
0xFF, XX, 0xFF, XX,
0x88, XX, XX, XX, 0x88, XX, XX, XX,
@ -1194,9 +1192,8 @@ bool Krkrtextrenderdll()
0xB0, 0x01, 0xB0, 0x01,
0xC3}; 0xC3};
auto addr = MemDbg::findBytes(bytes, sizeof(bytes), minAddress, maxAddress); auto addr = MemDbg::findBytes(bytes, sizeof(bytes), minAddress, maxAddress);
if (addr == 0) if (!addr)
return false; return false;
ConsoleOutput("textrender %p", addr);
HookParam hp; HookParam hp;
hp.address = addr - 0xb; hp.address = addr - 0xb;
hp.offset = get_reg(regs::eax); hp.offset = get_reg(regs::eax);
@ -1204,52 +1201,39 @@ bool Krkrtextrenderdll()
hp.filter_fun = KiriKiriZ_msvcFilter; hp.filter_fun = KiriKiriZ_msvcFilter;
return NewHook(hp, "krkr_textrender"); return NewHook(hp, "krkr_textrender");
}(); }();
return b1 || b2; auto b3 = [=]()
}
void KiriKiriZ3Filter(TextBuffer *buffer, HookParam *)
{
auto text = reinterpret_cast<LPWSTR>(buffer->buff);
CharFilter(buffer, L'\x000A');
if (cpp_wcsnstr(text, L"%", buffer->size / sizeof(wchar_t)))
{ {
StringFilterBetween(buffer, L"%", 1, L"%", 1); auto [minAddress, maxAddress] = Util::QueryModuleLimits(module, 0, PAGE_READONLY);
} char tjs[] = "tTJSVariant::tTJSVariant(const tjs_char *)";
} auto addr = MemDbg::findBytes(tjs, sizeof(tjs), minAddress, maxAddress);
if (!addr)
bool InsertKiriKiriZHook3() return false;
{ addr = MemDbg::findPushAddress(addr, minAddress, maxAddress);
if (!addr)
/* return false;
* Sample games: addr = MemDbg::findEnclosingAlignedFunction(addr);
* https://vndb.org/r109253 if (!addr)
*/ return false;
const BYTE bytes[] = { HookParam hp;
0x66, 0x83, 0x3F, 0x00, // cmp word ptr [edi],00 << hook here hp.address = addr;
0x75, 0x06, // jne Imouto_no_Seiiki.exe+195C1 hp.offset = get_stack(2);
0x33, 0xDB, // xor ebx,ebx hp.type = CODEC_UTF16 | USING_STRING | DATA_INDIRECT;
0x89, 0x1E, // mov [esi],ebx hp.text_fun = [](hook_stack *stack, HookParam *hp, TextBuffer *buffer, uintptr_t *split)
0xEB, 0x1B // jmp Imouto_no_Seiiki.exe+195DC {
auto text = *(wchar_t **)stack->stack[2];
if (hp->user_value == stack->retaddr)
return;
if (text[0] == L'%')
{
hp->user_value = stack->retaddr;
return;
}
buffer->from(text);
};
return NewHook(hp, "krkr_textrender");
}; };
return b1 || b2 || b3();
ULONG range = min(processStopAddress - processStartAddress, MAX_REL_ADDR);
ULONG addr = MemDbg::findBytes(bytes, sizeof(bytes), processStartAddress, processStartAddress + range);
if (!addr)
{
ConsoleOutput("KiriKiriZ3: pattern not found");
return false;
}
HookParam hp;
hp.address = addr;
hp.offset = get_reg(regs::edi);
hp.split = get_reg(regs::edx);
hp.type = NO_CONTEXT | CODEC_UTF16 | USING_STRING | USING_SPLIT;
hp.filter_fun = KiriKiriZ3Filter;
ConsoleOutput("INSERT KiriKiriZ3");
return NewHook(hp, "KiriKiriZ3");
} }
namespace namespace
{ {
@ -1298,8 +1282,7 @@ namespace
bool InsertKiriKiriZHook() bool InsertKiriKiriZHook()
{ {
auto ok = Krkrtextrenderdll(); auto ok = Krkrtextrenderdll();
ok = InsertKiriKiriZHook3() || ok; ok = kagparser();
ok = kagparser() || ok;
return InsertKiriKiriZHook2() || InsertKiriKiriZHook1() || ok; return InsertKiriKiriZHook2() || InsertKiriKiriZHook1() || ok;
} }
namespace namespace

View File

@ -543,7 +543,15 @@ namespace
return buffer->clear(); return buffer->clear();
last = s; last = s;
} }
void F010052300F612000(TextBuffer *buffer, HookParam *hp)
{
auto s = buffer->strA();
s = std::regex_replace(s, std::regex(R"(#r(.*?)\|(.*?)#)"), "$1");
s = std::regex_replace(s, std::regex(R"(@r(.*?)@\d)"), "$1");
strReplace(s, R"(\c)", "");
strReplace(s, R"(\n)", "");
buffer->from(s);
}
auto _ = []() auto _ = []()
{ {
emfunctionhooks = { emfunctionhooks = {
@ -679,6 +687,10 @@ namespace
{0x801AE35A, {CODEC_UTF8, 7, 0, PCSG01011, 0, "PCSG01011"}}, {0x801AE35A, {CODEC_UTF8, 7, 0, PCSG01011, 0, "PCSG01011"}},
// 真紅の焔 真田忍法帳 // 真紅の焔 真田忍法帳
{0x80025064, {CODEC_UTF8, 0, 0, 0, PCSG00833, "PCSG01158"}}, {0x80025064, {CODEC_UTF8, 0, 0, 0, PCSG00833, "PCSG01158"}},
// 月影の鎖 ~狂爛モラトリアム~
{0x8007AA94, {0, 1, 0, 0, F010052300F612000, "PCSG00991"}},
// 月影の鎖 ~錯乱パラノイア~
{0x8000E8E0, {0, 0, 0, 0, F010052300F612000, "PCSG00794"}},
}; };
return 1; return 1;

View File

@ -1036,14 +1036,28 @@ namespace
buffer->size -= 1; buffer->size -= 1;
} }
} }
void F0100FD4016528000(TextBuffer *buffer, HookParam *hp)
{
auto s = buffer->strA();
static std::string last;
if (endWith(last, s))
{
buffer->clear();
last = s;
return;
}
last = s;
s = std::regex_replace(s, std::regex(R"(@v\d+)"), "");
s = std::regex_replace(s, std::regex(R"(@t\d+)"), "");
s = std::regex_replace(s, std::regex(R"(@\w+)"), "");
buffer->from(s);
}
void F01001BB01E8E2000(TextBuffer *buffer, HookParam *hp) void F01001BB01E8E2000(TextBuffer *buffer, HookParam *hp)
{ {
auto s = buffer->strW(); auto s = buffer->strW();
s = std::regex_replace(s, std::wregex(L"<[^>]*>"), L""); s = std::regex_replace(s, std::wregex(L"<[^>]*>"), L"");
buffer->from(s); buffer->from(s);
} }
void F0100B0C016164000(TextBuffer *buffer, HookParam *hp) void F0100B0C016164000(TextBuffer *buffer, HookParam *hp)
{ {
@ -1090,7 +1104,8 @@ namespace
void F0100CB700D438000(TextBuffer *buffer, HookParam *hp) void F0100CB700D438000(TextBuffer *buffer, HookParam *hp)
{ {
auto s = buffer->strA(); auto s = buffer->strA();
s = std::regex_replace(s, std::regex(R"(<RUBY><RB>(.*?)<\/RB><RT>(.*?)<\/RT><\/RUBY>)"), "$1"); s = std::regex_replace(s, std::regex(R"(<RUBY><RB>(.*?)<\/RB><RT>(.*?)<\/RT><\/RUBY>)"),
"$1");
s = std::regex_replace(s, std::regex("<[^>]*>"), ""); s = std::regex_replace(s, std::regex("<[^>]*>"), "");
static std::string last; static std::string last;
if (last == s) if (last == s)
@ -3553,6 +3568,8 @@ namespace
{0x80020958, {0, 0, 0, 0, F0100D8B019FC0000<false>, 0x0100D8B019FC0000ull, "1.0.0"}}, {0x80020958, {0, 0, 0, 0, F0100D8B019FC0000<false>, 0x0100D8B019FC0000ull, "1.0.0"}},
// FANTASIAN Neo Dimension // FANTASIAN Neo Dimension
{0x81719ea0, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F01001BB01E8E2000, 0x01001BB01E8E2000ull, "1.0.0"}}, {0x81719ea0, {CODEC_UTF16, 0, 0, ReadTextAndLenDW<0>, F01001BB01E8E2000, 0x01001BB01E8E2000ull, "1.0.0"}},
// アイキス3cute
{0x804C18C4, {CODEC_UTF8, 1, 0, 0, F0100FD4016528000, 0x0100FD4016528000ull, nullptr}}, // 1.0.0 && 1.0.2
}; };
return 1; return 1;

View File

@ -700,6 +700,11 @@ namespace ppsspp
auto s = buffer->strA(); auto s = buffer->strA();
buffer->from(s.substr(1, s.size() - 2)); buffer->from(s.substr(1, s.size() - 2));
} }
void ULJM06032(TextBuffer *buffer, HookParam *hp)
{
StringFilter(buffer, "@n", 2);
StringFilter(buffer, "\x81\x90", 2); //
}
void ULJM05456(TextBuffer *buffer, HookParam *hp) void ULJM05456(TextBuffer *buffer, HookParam *hp)
{ {
static std::string last; static std::string last;
@ -1003,6 +1008,8 @@ namespace ppsspp
// Confidential Money 300日で3000万ドル稼ぐ方法 // Confidential Money 300日で3000万ドル稼ぐ方法
{0x881BD00, {CODEC_UTF16, 1, 0, ULJM06143, 0, "ULJM06143"}}, {0x881BD00, {CODEC_UTF16, 1, 0, ULJM06143, 0, "ULJM06143"}},
{0x882555C, {CODEC_UTF16, 2, 0, ULJM06143_1, 0, "ULJM06143"}}, {0x882555C, {CODEC_UTF16, 2, 0, ULJM06143_1, 0, "ULJM06143"}},
// アルカナ・ファミリア 幽霊船の魔術師
{0x881A214, {0, 0, 0, 0, ULJM06032, "ULJM06032"}},
}; };