2024-08-12 21:00:40 +08:00

92 lines
3.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
// v8这样做比用剪贴板好但。。。太难了而且版本兼容性不太好
typedef void *(*FunctionTemplateNew_t)(void *, void *, void *, void *, void *, int, int, int);
typedef void *(*FunctionTemplateGetFunction_t)(void *, void *, void *);
typedef void *(*FunctionSetName_t)(void *, void *);
typedef void *(*Global_t)(void *, void *);
typedef void *(*SetObject_t)(void *, void *, void *, void *, void *);
Global_t Global;
SetObject_t SetObject;
FunctionTemplateNew_t FunctionTemplateNew;
FunctionTemplateGetFunction_t FunctionTemplateGetFunction;
FunctionSetName_t FunctionSetName;
#define fnFunctionTemplateNew "?New@FunctionTemplate@v8@@SA?AV?$Local@VFunctionTemplate@v8@@@2@PAVIsolate@2@P6AXABV?$FunctionCallbackInfo@VValue@v8@@@2@@ZV?$Local@VValue@v8@@@2@V?$Local@VSignature@v8@@@2@HW4ConstructorBehavior@2@@Z"
#define fnFunctionTemplateGetFunction "?GetFunction@FunctionTemplate@v8@@QAE?AV?$MaybeLocal@VFunction@v8@@@2@V?$Local@VContext@v8@@@2@@Z"
#define fnFunctionSetName "?SetName@Function@v8@@QAEXV?$Local@VString@v8@@@2@@Z"
#define fnGlobal "?Global@Context@v8@@QAE?AV?$Local@VObject@v8@@@2@XZ"
#define fnSetObject "?Set@Object@v8@@QAE?AV?$Maybe@_N@2@V?$Local@VContext@v8@@@2@V?$Local@VValue@v8@@@2@1@Z"
void tryinsertglobalfunction(void *isolate)
{
SetObject = (SetObject_t)GetProcAddress(hmodule, fnSetObject);
Global = (Global_t)GetProcAddress(hmodule, fnGlobal);
FunctionTemplateNew = (FunctionTemplateNew_t)GetProcAddress(hmodule, fnFunctionTemplateNew);
FunctionTemplateGetFunction = (FunctionTemplateGetFunction_t)GetProcAddress(hmodule, fnFunctionTemplateGetFunction);
FunctionSetName = (FunctionSetName_t)GetProcAddress(hmodule, fnFunctionSetName);
void *context;
void *v8string;
void *script;
void *useless;
void *FunctionTemplate;
void *unknown;
void *v12[7];
ConsoleOutput("%p %p %p %p %p", SetObject, Global, FunctionTemplateNew, FunctionTemplateGetFunction, FunctionSetName);
GetCurrentContext(isolate, &context);
ConsoleOutput("context %p", context);
auto f = FunctionTemplateNew(&FunctionTemplate, context, Method, v12[0], 0, 0, 1, 0);
ConsoleOutput("FunctionTemplate %p %p", *(void **)f, unknown);
void *Function = FunctionTemplateGetFunction(FunctionTemplate, &unknown, context);
auto string = NewFromUtf8(&v8string, isolate, "hello", 1, -1);
ConsoleOutput("%p %p", *(void **)string, v8string);
FunctionSetName(*(void **)Function, *(void **)string);
auto global = Global(context, &unknown);
SetObject(*(void **)global, &unknown, context, *(void **)string, *(void **)Function);
}
*/
#include <node.h>
using namespace v8;
void NODE_SET_METHOD_X(const char *name,
v8::FunctionCallback callback)
{
v8::Isolate *isolate = v8::Isolate::GetCurrent();
v8::HandleScope handle_scope(isolate);
v8::Local<v8::Context> context = isolate->GetCurrentContext();
v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate,
callback);
v8::Local<v8::Function> fn = t->GetFunction(context).ToLocalChecked();
v8::Local<v8::String> fn_name = v8::String::NewFromUtf8(isolate, name,
v8::NewStringType::kInternalized)
.ToLocalChecked();
fn->SetName(fn_name);
context->Global()->Set(context, fn_name, fn).Check();
}
extern "C" __declspec(dllexport) void utf8interaction(char *utf8)
{
// 用来和lunahook交互
utf8[0] += 10;
}
void Method(const FunctionCallbackInfo<Value> &args)
{
Isolate *isolate = Isolate::GetCurrent();
HandleScope scope(isolate);
auto locals = args[0]->ToString(isolate->GetCurrentContext()).ToLocalChecked();
auto size = locals->Utf8Length(isolate);
auto buff = std::make_unique<char[]>(size + 1);
locals->WriteUtf8(isolate, buff.get());
utf8interaction(buff.get());
args.GetReturnValue().Set(String::NewFromUtf8(isolate, buff.get()).ToLocalChecked());
}
extern "C" __declspec(dllexport) void globalfunction()
{
NODE_SET_METHOD_X("hello", Method);
}