LunaHook-mirror/LunaHook/engine32/RPGMaker.cpp
恍兮惚兮 39d2a81f4d RPGMaker
2024-09-15 07:15:50 +08:00

47 lines
1.3 KiB
C++

#include "RPGMaker.h"
// https://www.dlsite.com/maniax/work/=/product_id/RJ01240121.html
// ネクロマリア
bool RPGMaker::attach_function()
{
BYTE bytes2[] = {
//clang-format off
0x81, 0xf9, 0xff, 0xff, 0xff, 0x7f,
XX2,
0xb9, 0xff, 0xff, 0xff, 0x7f,
XX2,
0x8b, 0xc2,
0xd1, 0xe8,
0x89, 0x45, 0x0c,
0xb8, 0xff, 0xff, 0xff, 0x7f,
0x2b, 0x45, 0x0c,
0x3b, 0xd0,
XX2,
0xb9, 0xff, 0xff, 0xff, 0x7f,
//clang-format on
};
auto addr = MemDbg::findBytes(bytes2, sizeof(bytes2), processStartAddress, processStopAddress);
if (!addr)
return false;
addr = MemDbg::findEnclosingAlignedFunction(addr, 0x100);
if (!addr)
return false;
HookParam hp;
hp.address = addr;
hp.type = USING_STRING | CODEC_UTF8;
hp.text_fun = [](hook_stack *stack, HookParam *hp, uintptr_t *data, uintptr_t *split, size_t *le)
{
*data = stack->stack[1];
*le = stack->stack[2];
};
hp.filter_fun = [](LPVOID data, size_t *size, HookParam *)
{
if (all_ascii((char *)data, *size))
return false;
std::string result = std::string((char *)data, *size);
result = std::regex_replace(result, std::regex(R"(@c\[\](.*?)@c\[\])"), "$1");
return write_string_overwrite(data, size, result);
};
return NewHook(hp, "RPGMaker");
}