Как я могу вызвать метод во внутренней DLL С++ для игры Unity?C#

Место общения программистов C#
Ответить
Anonymous
 Как я могу вызвать метод во внутренней DLL С++ для игры Unity?

Сообщение Anonymous »

Моя цель — вызвать функцию, которая получает текущее количество посетителей, но я не совсем понимаю, как это сделать, чтобы не привести к сбою игры. Я хорошо разбираюсь в C++, но я новичок в реверс-инжиниринге и работе со стеком.
Вот функция, которую я хочу использовать:

Код: Выделить всё

"Signature": "int32_t User__get_VisitorsCount (User_o* __this, const MethodInfo* method);",
Когда я подключаю функцию и печатаю значения, она работает:

Код: Выделить всё

void Mods::HookGetShoppingVisitorsCount(void* thisPtr) {
Utils::HookData& hook = hooks[1];

// Unhook
Unhook(hook.address, hook.originalBytes, 5);

WriteToConsole("VisitorsCount getter accessed");

uintptr_t ebpValue;
uintptr_t valueAtEBPPlus8;

__asm {
mov ebpValue, ebp          // Capture the current EBP
mov eax, [ebp + 0x8]       // Capture the value at EBP + 0x8
mov valueAtEBPPlus8, eax   // Store it in valueAtEBPPlus8
}

// Log EBP
WriteToConsole("EBP Value: %p", FOREGROUND_GREEN | FOREGROUND_INTENSITY, ebpValue);
WriteToConsole("Value at [EBP + 0x8]: %p", FOREGROUND_GREEN | FOREGROUND_INTENSITY, valueAtEBPPlus8);

// Capture the this pointer
userPointer = static_cast(thisPtr);

// Print the user pointer
if (userPointer) {
WriteToConsole("User pointer: %p", FOREGROUND_GREEN | FOREGROUND_INTENSITY, userPointer);
} else {
WriteToConsole("User pointer null", FOREGROUND_RED | FOREGROUND_INTENSITY);
}

if (!originalShoppingVisitorsCount) {
originalShoppingVisitorsCount = reinterpret_cast(hook.address);
}

// Call the original function
int visitorsCount = originalShoppingVisitorsCount(thisPtr);

// Log the visitor count
WriteToConsole("Shopping Visitors Count: %d", FOREGROUND_GREEN | FOREGROUND_INTENSITY, visitorsCount);

// Re-hook
// Hook(hook.address, (void*)(&Mods::HookGetShoppingVisitorsCount), 5, hook.originalBytes);
}
Это значение возвращает:

Код: Выделить всё

ShoppingVisitorsCount getter accessed! at [2024-09-09 04:53:52]
EBP Value: 00F2E7DC at [2024-09-09 04:53:52]
Value at [EBP + 0x8]: 48C40AA0 at [2024-09-09 04:53:52]
User pointer captured: 48C40AA0 at [2024-09-09 04:53:52]
Visitors Count: 2 at [2024-09-09 04:53:52]
но при вызове функции происходит сбой игры
Вызов кода:

Код: Выделить всё

void Hacks::CallUserFunction() {
if (userPointer) {

WriteToConsole("Gold: %ld", FOREGROUND_GREEN | FOREGROUND_INTENSITY, userPointer->gold->_value);
WriteToConsole("Gems: %ld", FOREGROUND_GREEN | FOREGROUND_INTENSITY, userPointer->gems->_value);
WriteToConsole("Coins: %ld", FOREGROUND_GREEN | FOREGROUND_INTENSITY, userPointer->coins->_value);
WriteToConsole("XP: %ld", FOREGROUND_GREEN | FOREGROUND_INTENSITY, userPointer->xp->_value);

// Get the base addy of dll
uintptr_t baseAddress = BaseAddy;
if (!baseAddress) {
WriteToConsole("Failed to get base address!", FOREGROUND_RED | FOREGROUND_INTENSITY);
return;
}

// base address
WriteToConsole("Base Address: %p", FOREGROUND_GREEN | FOREGROUND_INTENSITY, baseAddress);

// real address of the VisitorsCount function
uintptr_t realAddress = baseAddress + 0xC810E0;

// MethodInfo pointer
uintptr_t methodInfoAddress = baseAddress + 0x263CCA8;

// Read the MethodInfo pointer
const void* methodInfo = nullptr;
try {
methodInfo = *reinterpret_cast(methodInfoAddress);   // Deref
if (!methodInfo) {
WriteToConsole("MethodInfo pointer null", FOREGROUND_RED | FOREGROUND_INTENSITY);
return;
}
} catch (...) {
WriteToConsole("Exception while dereferencing MethodInfo!", FOREGROUND_RED | FOREGROUND_INTENSITY);
return;
}

// Log MethodInfo addresses
WriteToConsole("Real Address: %p", FOREGROUND_GREEN | FOREGROUND_INTENSITY, realAddress);
WriteToConsole("MethodInfo Address: %p", FOREGROUND_GREEN | FOREGROUND_INTENSITY, methodInfo);

typedef int32_t(__thiscall* ShoppingVisitorsCountFunc)(User* user, const void* methodInfo);

ShoppingVisitorsCountFunc GetShoppingVisitorsCount = reinterpret_cast(realAddress);

WriteToConsole("User Pointer: %p", FOREGROUND_GREEN | FOREGROUND_INTENSITY, userPointer);

if (!GetShoppingVisitorsCount) {
WriteToConsole("Function pointer is null!", FOREGROUND_RED | FOREGROUND_INTENSITY);
return;
}

// Log all
std::ofstream logFile(R"(C:\Users\****\Documents\Code\log.txt)", std::ios::app);  // Append mode
if (logFile.is_open()) {
logFile 

Подробнее здесь: [url]https://stackoverflow.com/questions/78964723/how-can-i-call-a-method-in-c-internal-dll-for-a-unity-game[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»