let mp = __setupMP();
struct node::initializeValues_t *
*(_QWORD *)(structure + 24) = node::Environment* // по адресу structure + 24 записывается node::Environment*
*((_DWORD *) structure + 8) => int exec_argc // тут наоборот: передается аргумент такого типа из этого адреса
*((_QWORD *) structure + 5) => const char* const* exec_argv // тут аналогично второму
qword_1814D8FC0 = (__int64)v8_platform;
result = (struct node::initializeValues_t *)&qword_1814D8FC0;
return result;
, где qword_1814D8FC0 - непонятно что, но не используется больше нигде, а значит равноценно локальной переменной. Подозреваю, что (__int64) - то, во что компилер превратил *, но VS ругается на такую запись. v8_platform - обьявленная вот так:static struct {
// код
} v8_platform;
BOOL APIENTRY DllMain( HMODULE hModule, DWORD dwReason, LPVOID lpReserved) {
LoadLibrary(L"D:/node.dll");
}
HINSTANCE hGetProcIDDLL = LoadLibrary("C:\\Documents and Settings\\User\\Desktop\\test.dll");
f_funci funci = (f_funci)GetProcAddress(hGetProcIDDLL, "funci");
// тут хукнуть
typedef v8::MaybeLocal<v8::Script>(v8::Script::*CompileFunc)(v8::Local<v8::Context>, v8::Local<v8::String>, v8::ScriptOrigin*);
uintptr_t AddressOfCompile = 0;
v8::MaybeLocal<v8::Script> __fastcall HookedCompile(v8::Local<v8::Context> context, v8::Local<v8::String> source, v8::ScriptOrigin* origin)
{
std::cout << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << std::endl;
v8::Script::CompileFunc originalCompile = (v8::Script::CompileFunc) AddressOfCompile;
return originalCompile(context, source, origin);
}
const uint8_t* OUR_CODE_IN_UINT8 = sub_14001D570(&v134);
if ( OUR_CODE_IN_UINT8[3] >= 0x10ui64 )
OUR_CODE_IN_UINT8 = (_QWORD *)*OUR_CODE_IN_UINT8;
v49 = (__int64 *)v8::String::NewFromOneByte(isolate, OUR_CODE_IN_UINT8, 0i64, v83);
Local<String> OUR_CODE = *v49;
if ( !*v49 )
{
v8::V8::ToLocalEmpty();
OUR_CODE = *v49;
}
v52 = v8::Script::Compile(context, OUR_CODE);
typedef int func(void);
func* f = (func*)0xdeadbeef;
int i = f();