#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 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"); }