LunaHook-mirror/LunaHook/engine32/RPGMaker.cpp

47 lines
1.3 KiB
C++
Raw Normal View History

2024-09-15 07:15:50 +08:00
#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");
}