This commit is contained in:
恍兮惚兮 2024-10-31 13:54:24 +08:00
parent 95187cd225
commit 552f76b43e

View File

@ -1,26 +1,30 @@
#include"cef.h" #include "cef.h"
typedef wchar_t char16; typedef wchar_t char16;
typedef struct _cef_string_wide_t { typedef struct _cef_string_wide_t
{
wchar_t *str; wchar_t *str;
size_t length; size_t length;
void (*dtor)(wchar_t *str); void (*dtor)(wchar_t *str);
} cef_string_wide_t; } cef_string_wide_t;
typedef struct _cef_string_utf8_t { typedef struct _cef_string_utf8_t
{
char *str; char *str;
size_t length; size_t length;
void (*dtor)(char *str); void (*dtor)(char *str);
} cef_string_utf8_t; } cef_string_utf8_t;
typedef struct _cef_string_utf16_t { typedef struct _cef_string_utf16_t
{
char16 *str; char16 *str;
size_t length; size_t length;
void (*dtor)(char16 *str); void (*dtor)(char16 *str);
} cef_string_utf16_t; } cef_string_utf16_t;
static void hook_cef_string_utf16_t(hook_stack *stack, HookParam *hp, uintptr_t *data, uintptr_t *split, size_t *len) static void hook_cef_string_utf16_t(hook_stack *stack, HookParam *hp, uintptr_t *data, uintptr_t *split, size_t *len)
{ {
if (auto p = (_cef_string_utf16_t*)stack->stack[1]) { if (auto p = (_cef_string_utf16_t *)stack->stack[1])
{
*data = (DWORD)p->str; *data = (DWORD)p->str;
*len = p->length; // for widechar *len = p->length; // for widechar
@ -32,12 +36,14 @@ static void hook_cef_string_utf16_t(hook_stack* stack, HookParam *hp, uintptr_t
break; break;
if (!s) if (!s)
s = hp->address; s = hp->address;
if (hp->type & USING_SPLIT) *split = s; if (hp->type & USING_SPLIT)
*split = s;
} }
} }
static void hook_cef_string_wide_t(hook_stack *stack, HookParam *hp, uintptr_t *data, uintptr_t *split, size_t *len) static void hook_cef_string_wide_t(hook_stack *stack, HookParam *hp, uintptr_t *data, uintptr_t *split, size_t *len)
{ {
if (auto p = (_cef_string_wide_t*)stack->stack[1]) { if (auto p = (_cef_string_wide_t *)stack->stack[1])
{
*data = (DWORD)p->str; *data = (DWORD)p->str;
*len = p->length; // for widechar *len = p->length; // for widechar
@ -49,12 +55,14 @@ static void hook_cef_string_wide_t(hook_stack* stack, HookParam *hp, uintptr_t*
break; break;
if (!s) if (!s)
s = hp->address; s = hp->address;
if (hp->type & USING_SPLIT) *split = s; if (hp->type & USING_SPLIT)
*split = s;
} }
} }
static void hook_cef_string_utf8_t(hook_stack *stack, HookParam *hp, uintptr_t *data, uintptr_t *split, size_t *len) static void hook_cef_string_utf8_t(hook_stack *stack, HookParam *hp, uintptr_t *data, uintptr_t *split, size_t *len)
{ {
if (auto p = (_cef_string_utf8_t*)stack->stack[1]) { if (auto p = (_cef_string_utf8_t *)stack->stack[1])
{
*data = (DWORD)p->str; *data = (DWORD)p->str;
*len = p->length; // for widechar *len = p->length; // for widechar
@ -66,16 +74,18 @@ static void hook_cef_string_utf8_t(hook_stack* stack, HookParam *hp, uintptr_t*
break; break;
if (!s) if (!s)
s = hp->address; s = hp->address;
if (hp->type & USING_SPLIT) *split = s; if (hp->type & USING_SPLIT)
*split = s;
} }
} }
bool InsertlibcefHook(HMODULE module) bool InsertlibcefHook(HMODULE module)
{ {
if (!module)return false; if (!module)
return false;
bool ret = false; bool ret = false;
struct libcefFunction
struct libcefFunction { // argument indices start from 0 for SpecialHookMonoString, otherwise 1 { // argument indices start from 0 for SpecialHookMonoString, otherwise 1
const char *functionName; const char *functionName;
size_t textIndex; // argument index size_t textIndex; // argument index
short lengthIndex; // argument index short lengthIndex; // argument index
@ -101,11 +111,13 @@ bool InsertlibcefHook(HMODULE module)
{"cef_string_wide_set", 1, 0, USING_STRING | CODEC_UTF16 | NO_CONTEXT, NULL}, // ok {"cef_string_wide_set", 1, 0, USING_STRING | CODEC_UTF16 | NO_CONTEXT, NULL}, // ok
{"cef_string_wide_to_utf16", 1, 0, USING_STRING | CODEC_UTF16 | NO_CONTEXT, NULL}, {"cef_string_wide_to_utf16", 1, 0, USING_STRING | CODEC_UTF16 | NO_CONTEXT, NULL},
{"cef_string_wide_to_utf8", 1, 0, USING_STRING | CODEC_UTF16 | NO_CONTEXT, NULL}, {"cef_string_wide_to_utf8", 1, 0, USING_STRING | CODEC_UTF16 | NO_CONTEXT, NULL},
{"cef_string_wide_clear",0,0,USING_STRING|CODEC_UTF16,hook_cef_string_wide_t} {"cef_string_wide_clear", 0, 0, USING_STRING | CODEC_UTF16, hook_cef_string_wide_t}};
}; for (auto func : funcs)
for (auto func : funcs) { {
if (FARPROC addr = ::GetProcAddress(module, func.functionName)) { if (FARPROC addr = ::GetProcAddress(module, func.functionName))
if (addr == 0)continue; {
if (addr == 0)
continue;
hp.address = (DWORD)addr; hp.address = (DWORD)addr;
hp.type = func.hookType; hp.type = func.hookType;
hp.offset = func.textIndex * 4; hp.offset = func.textIndex * 4;
@ -120,11 +132,22 @@ bool InsertlibcefHook(HMODULE module)
ConsoleOutput("libcef: failed to find function address"); ConsoleOutput("libcef: failed to find function address");
return ret; return ret;
} }
bool libcefhook(HMODULE module) { namespace
{
bool ceffileter(void *data, uintptr_t *size, HookParam *hp)
{
auto s = std::wstring((wchar_t *)data, *size / 2);
if (s == *(std::wstring *)(hp->user_value))
return false;
*(std::wstring *)(hp->user_value) = s;
return true;
};
}
bool libcefhook(HMODULE module)
{
// https://vndb.org/v12297 // https://vndb.org/v12297
// 魔降ル夜ノ凜 Animation ダウンロード版 // 魔降ル夜ノ凜 Animation ダウンロード版
if (module == 0)return false;
auto [minAddress, maxAddress] = Util::QueryModuleLimits(module); auto [minAddress, maxAddress] = Util::QueryModuleLimits(module);
ConsoleOutput("check v8libcefhook %p %p", minAddress, maxAddress); ConsoleOutput("check v8libcefhook %p %p", minAddress, maxAddress);
const BYTE bytes[] = { const BYTE bytes[] = {
@ -146,38 +169,51 @@ bool libcefhook(HMODULE module) {
0xc3 0xc3
}; };
auto addr = reverseFindBytes(bytes, sizeof(bytes), minAddress, maxAddress); // 対魔忍ユキカゼAnimation
const BYTE bytes2[] = {
0x51,
0x57,
0x52,
0x50,
0xff, 0xd6,
0x83, 0xc4, 0x10,
0x8b, 0x4d, XX,
0x89, 0xc6,
0x31, 0xe9,
0xe8, XX4,
0x89, 0xF0,
0x83, 0xC4, 0x18,
0x5e,
0x5f,
0x5b,
0x5d,
0xc3
HookParam hp;
hp.address = addr+6;
hp.offset=get_stack(1);
hp.filter_fun=[] (void* data, uintptr_t * size, HookParam*) {
std::wstring s = L"";
int i = 0;
for (; i < *size /2; i++) {
auto c = ((LPWSTR)data)[i];
if (c == L'[') {
break;
}
else {
s += c;
}
}
strReplace(s,L"<br>",L"\n");
static std::wstring last;
if(s==last)return false;
last=s;
return write_string_overwrite(data,size,s);
}; };
bool succ = false;
for (auto addrs : {Util::SearchMemory(bytes, sizeof(bytes), PAGE_EXECUTE_READWRITE, minAddress, maxAddress), Util::SearchMemory(bytes2, sizeof(bytes2), PAGE_EXECUTE_READWRITE, minAddress, maxAddress)})
{
for (auto addr : addrs)
{
HookParam hp;
hp.address = addr + 4;
hp.offset = get_stack(1);
hp.filter_fun = ceffileter;
hp.newlineseperator = L"<br>";
hp.length_offset = 2;
hp.type = USING_STRING | CODEC_UTF16 | NO_CONTEXT; hp.type = USING_STRING | CODEC_UTF16 | NO_CONTEXT;
ConsoleOutput("v8libcefhook %p", addr); hp.user_value = (DWORD) new std::wstring;
succ |= NewHook(hp, "libcef");
return NewHook(hp, "v8libcefhook");
} }
bool cef::attach_function(){ }
return succ;
}
bool cef::attach_function()
{
auto hm = GetModuleHandleW(L"libcef.dll"); auto hm = GetModuleHandleW(L"libcef.dll");
if (!hm)
return false;
// InsertlibcefHook(hm); // InsertlibcefHook(hm);
return libcefhook(hm); return libcefhook(hm);