mirror of
https://github.com/HIllya51/LunaHook.git
synced 2024-11-27 15:54:03 +08:00
54 lines
1.5 KiB
C++
54 lines
1.5 KiB
C++
#include "NNNConfig.h"
|
|
bool NNNConfig::attach_function()
|
|
{
|
|
// blackcyc
|
|
// 夢幻廻廊
|
|
// 復讐の女仕官ハイネ ~肢体に刻まれる淫欲のプログラム~
|
|
// https://vndb.org/v24955
|
|
const BYTE bytes[] = {
|
|
//clang-format off
|
|
0x68, 0xE8, 0x03, 0x00, 0x00, 0x6a, 0x00,
|
|
//clang-format on
|
|
|
|
};
|
|
auto addr = MemDbg::findBytes(bytes, sizeof(bytes), processStartAddress, processStopAddress);
|
|
if (addr == 0)
|
|
return false;
|
|
|
|
addr = addr + sizeof(bytes);
|
|
for (int i = 0; i < 5; i++)
|
|
{
|
|
if (*(BYTE *)addr == 0xe8)
|
|
{
|
|
addr += 1;
|
|
break;
|
|
}
|
|
addr += 1;
|
|
}
|
|
uintptr_t offset = *(uintptr_t *)(addr);
|
|
uintptr_t funcaddr = offset + addr + 4;
|
|
const BYTE check[] = {0x83, 0xEC, 0x1C};
|
|
auto checkoffset = MemDbg::findBytes(check, sizeof(check), funcaddr, funcaddr + 0x20);
|
|
|
|
if (checkoffset == 0)
|
|
offset = get_stack(5);
|
|
else
|
|
offset = get_stack(6);
|
|
HookParam hp;
|
|
hp.address = funcaddr;
|
|
hp.offset = offset;
|
|
hp.type = USING_STRING;
|
|
hp.text_fun = [](hook_stack *stack, HookParam *, uintptr_t *data, uintptr_t *split, size_t *len)
|
|
{
|
|
// 当前文本可以过滤重复,上一条文本会按照换行符切分不停刷新。
|
|
static std::unordered_map<uintptr_t, std::string> everythreadlast;
|
|
if (everythreadlast.find(stack->retaddr) == everythreadlast.end())
|
|
everythreadlast[stack->retaddr] = "";
|
|
auto thisstr = std::string((char *)*data);
|
|
if (everythreadlast[stack->retaddr] == thisstr)
|
|
return;
|
|
everythreadlast[stack->retaddr] = thisstr;
|
|
*len = everythreadlast[stack->retaddr].size();
|
|
};
|
|
return NewHook(hp, "NNNhook");
|
|
} |