Where im failing on native dll?


Можете показать свой код?
C++
C++:
#include <windows.h>

// Структура, представляющая кадр стека
struct FFrame
{
public:
    int* ftable;        // Указатель на таблицу функций
    void* Node;         // Указатель на узел
    INT* Object;        // Указатель на объект
    INT* Code;          // Указатель на код
    BYTE* Locals;       // Указатель на локальные переменные
    INT LineNum;       // Номер строки
};

// Тип для указателя на функцию, принимающую структуру FFrame и указатель на void
typedef void (__stdcall*Native)(struct FFrame& TheStack, void* const);

// Тип для указателя на функцию GRegisterNative
typedef BYTE(__stdcall* GRegisterNative_fnType)(INT iNative, const Native& Func);

// Функция, которая будет вызываться вместо оригинальной функции с номером 1247
void __stdcall functionUC(struct FFrame& Stack , void* const)
{
    Stack.Code++;
   
    // Вывод сообщения о загрузке функции functionUC
   MessageBox(nullptr,  L"Load functionUC 1247", L"hook", MB_OK);
}

// Функция для хука функции в модуле "Core.dll"
void hookCore()
{
    // Получение дескриптора модуля "Core.dll"
    auto hCore = GetModuleHandleA("Core.dll");

    // Проверка, найден ли модуль "Core.dll"
    if (hCore) {
        // Получение адреса функции GRegisterNative из модуля "Core.dll"
        GRegisterNative_fnType GRegisterNative_fn = (GRegisterNative_fnType)GetProcAddress(hCore, "?GRegisterNative@@YAEHABQ8UObject@@AEXAAUFFrame@@QAX@Z@Z");

        // Проверка, найден ли адрес функции GRegisterNative
        if (GRegisterNative_fn) {
         
            // Вызов функции GRegisterNative, передавая в качестве аргументов номер функции (1247) и адрес функции functionUC
            GRegisterNative_fn(1247, &functionUC);
        }
    }
}

// Точка входа для DLL
//extern "C" __declspec(dllexport)
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID)
{
    // Обработка события, которое указывает на причину вызова функции DllMain
    switch (ul_reason_for_call)
    {
        // Обработка события DLL_PROCESS_ATTACH, которое происходит при загрузке DLL в процесс
    case DLL_PROCESS_ATTACH:
        // Вызов функции hookCore для выполнения хука
        hookCore();
        break;
    }
    // Возвращение значения TRUE, сигнализируя о успешном завершении функции DllMain
    return TRUE;
}
UnrealScript
C++:
//Обявляю функцию
native(1247) static final function ItemExSort();
//Так вызываю
ItemExSort();
 
C++
C++:
#include <windows.h>

// Структура, представляющая кадр стека
struct FFrame
{
public:
    int* ftable;        // Указатель на таблицу функций
    void* Node;         // Указатель на узел
    INT* Object;        // Указатель на объект
    INT* Code;          // Указатель на код
    BYTE* Locals;       // Указатель на локальные переменные
    INT LineNum;       // Номер строки
};

// Тип для указателя на функцию, принимающую структуру FFrame и указатель на void
typedef void (__stdcall*Native)(struct FFrame& TheStack, void* const);

// Тип для указателя на функцию GRegisterNative
typedef BYTE(__stdcall* GRegisterNative_fnType)(INT iNative, const Native& Func);

// Функция, которая будет вызываться вместо оригинальной функции с номером 1247
void __stdcall functionUC(struct FFrame& Stack , void* const)
{
    Stack.Code++;
  
    // Вывод сообщения о загрузке функции functionUC
   MessageBox(nullptr,  L"Load functionUC 1247", L"hook", MB_OK);
}

// Функция для хука функции в модуле "Core.dll"
void hookCore()
{
    // Получение дескриптора модуля "Core.dll"
    auto hCore = GetModuleHandleA("Core.dll");

    // Проверка, найден ли модуль "Core.dll"
    if (hCore) {
        // Получение адреса функции GRegisterNative из модуля "Core.dll"
        GRegisterNative_fnType GRegisterNative_fn = (GRegisterNative_fnType)GetProcAddress(hCore, "?GRegisterNative@@YAEHABQ8UObject@@AEXAAUFFrame@@QAX@Z@Z");

        // Проверка, найден ли адрес функции GRegisterNative
        if (GRegisterNative_fn) {
        
            // Вызов функции GRegisterNative, передавая в качестве аргументов номер функции (1247) и адрес функции functionUC
            GRegisterNative_fn(1247, &functionUC);
        }
    }
}

// Точка входа для DLL
//extern "C" __declspec(dllexport)
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID)
{
    // Обработка события, которое указывает на причину вызова функции DllMain
    switch (ul_reason_for_call)
    {
        // Обработка события DLL_PROCESS_ATTACH, которое происходит при загрузке DLL в процесс
    case DLL_PROCESS_ATTACH:
        // Вызов функции hookCore для выполнения хука
        hookCore();
        break;
    }
    // Возвращение значения TRUE, сигнализируя о успешном завершении функции DllMain
    return TRUE;
}
UnrealScript
C++:
//Обявляю функцию
native(1247) static final function ItemExSort();
//Так вызываю
ItemExSort();
Во-первых, у меня еще на этапе регистрации нативок краш из-за
C++:
// Тип для указателя на функцию GRegisterNative
typedef BYTE(__stdcall* GRegisterNative_fnType)(INT iNative, const Native& Func);
тут нужно оставить cdecl:
C++:
typedef BYTE(__cdecl* GRegisterNative_fnType)(INT iNative, const Native& Func);

И в структуре ошибки. Почему Code стал INT* ? Вот же правильная структура, которой поделился Test:

C++:
class UObject {};
struct FFrame
{
public:
    int* ftable;
    void* Node;
    UObject* Object; // вот тут INT* Object допустимо
    BYTE* Code; // здесь BYTE* а не INT*
    BYTE* Locals;
    INT    LineNum;
};
 
Допустим мы хотим передать текст из .uc в dll и вывести его как сообщение, как правильно сделать в данном случае?

Лучше наверное полную версию в мануалы добавить чтобы не потерялось если все работает.
 
И в структуре ошибки. Почему Code стал INT* ? Вот же правильная структура, которой поделился Test:
Спасибо все заработало! Похоже ошибку я допустил с самого начла BYTE* Code; // здесь BYTE* а не INT*, __stdcall я похоже откат сделал и вставил код на форум)
Этот код у меня заработал: c++
C++:
#include <windows.h>
class UObject {};
// Структура, представляющая кадр стека
struct FFrame
{
public:
    int* ftable;        // Указатель на таблицу функций
    void* Node;         // Указатель на узел
    UObject* Object;        // Указатель на объект
    BYTE* Code;          // Указатель на код
    BYTE* Locals;       // Указатель на локальные переменные
    INT LineNum;       // Номер строки
};

// Тип для указателя на функцию, принимающую структуру FFrame и указатель на void
typedef  void(__stdcall*Native)(struct FFrame& TheStack, void* const);

// Тип для указателя на функцию GRegisterNative
typedef BYTE(__cdecl* GRegisterNative_fnType)(INT iNative, const Native& Func);

// Функция, которая будет вызываться вместо оригинальной функции с номером 1247
void __stdcall functionUC(struct FFrame& Stack , void* const)
{
    Stack.Code++;
    
    // Вывод сообщения о загрузке функции functionUC
   MessageBox(nullptr,  L"Load functionUC 1247", L"hook", MB_OK);
}

// Функция для хука функции в модуле "Core.dll"
void hookCore()
{
    // Получение дескриптора модуля "Core.dll"
    auto hCore = GetModuleHandleA("Core.dll");

    // Проверка, найден ли модуль "Core.dll"
    if (hCore) {
        // Получение адреса функции GRegisterNative из модуля "Core.dll"
        GRegisterNative_fnType GRegisterNative_fn = (GRegisterNative_fnType)GetProcAddress(hCore, "?GRegisterNative@@YAEHABQ8UObject@@AEXAAUFFrame@@QAX@Z@Z");

        // Проверка, найден ли адрес функции GRegisterNative
        if (GRegisterNative_fn) {
          
            // Вызов функции GRegisterNative, передавая в качестве аргументов номер функции (1247) и адрес функции functionUC
            GRegisterNative_fn(1247, &functionUC);
        }
    }
}

// Точка входа для DLL
//extern "C" __declspec(dllexport)
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID)
{
    // Обработка события, которое указывает на причину вызова функции DllMain
    switch (ul_reason_for_call)
    {
        // Обработка события DLL_PROCESS_ATTACH, которое происходит при загрузке DLL в процесс
    case DLL_PROCESS_ATTACH:
        // Вызов функции hookCore для выполнения хука
        hookCore();
        break;
    }
    // Возвращение значения TRUE, сигнализируя о успешном завершении функции DllMain
    return TRUE;
}
Unrealscript:
Код:
//Обявляю функцию
native(1247) static final function ItemExSort();
//Так вызываю
ItemExSort();
 
Which chronicle are u testing it?
 
Допустим мы хотим передать текст из .uc в dll и вывести его как сообщение, как правильно сделать в данном случае?

Лучше наверное полную версию в мануалы добавить чтобы не потерялось если все работает.
Хороший вопрос, тоже интересно. Наверно нужно вытаскивать аргументы из стека. Буду разбираться
Which chronicle are u testing it?
epilogue NA 152
Я просто назвал interface.dll и положил в папку system и игра сама подгрузила ее!
на интерлюде можно l2ui назвать, тоже сама загрузится. На хрониках выше вряд ли работает. Я делаю так:
C++:
__declspec(dllexport) void bind() {};
И потом в cff explorer:
1723917161223.png
Быстро, просто, удобно
 
Adding only interface.dll on file and logging it opened the game but triggering the native function it gives me this CE


Good question, also interesting. You probably need to pop arguments from the stack. I'll look into it

epilogue AND 152

on interlude you can call it l2ui, it will also boot itself. It hardly works on the chronicles above. I do this:
C++:
__declspec(dllexport) void bind() {};
And then in cff explorer:
Посмотреть вложение 77669
Fast, simple, convenient
so on other chronicles we inject on engine.dll the hookCore function?
 
Последнее редактирование модератором:
got it thanks, what about sending like a text for UC? on some tutorials from native functions it was supposed to create some kind of Result Variable for it
 
Anyone know how is it possible to receive data from the dll? like on this unrealscript its supposed to return a string but how send this string on dll?

Код:
native(1247) static final function string ItemExSort();

i heard about something related to create a variable named called Result which will have the Data to pass, i tried it with std::string but didnt worked. Maybe need use the FString from unreal?


C++:
void __stdcall functionUC(struct FFrame& Stack, void* const)
{
    Stack.Code++;
    
    //P_FINISH;
    // Вывод сообщения о загрузке функции functionUC
    MessageBox(nullptr, L"Load functionUC 1247", L"hook", MB_OK);

    std::string Result = "Just a test";
}
 
Anyone know how is it possible to receive data from the dll? like on this unrealscript its supposed to return a string but how send this string on dll?

int можно вернуть так, string пока не знаю, и как передать параметры в dll тоже пока не знаю))
C++:
#define RESULT_DECL void*const Result
typedef  void(__stdcall*Native)(struct FFrame& TheStack, RESULT_DECL);
typedef BYTE(__cdecl* GRegisterNative_fnType)(INT iNative, const Native& Func);

// Функция, которая будет вызываться вместо оригинальной функции с номером 1247
void __stdcall functionUC(struct FFrame& Stack , RESULT_DECL)
{

    Stack.Code++;
   
// Запишите результат в Result
    *(int*)Result = 2 + 10;

   MessageBox(nullptr,  L"Load functionUC ", L"hook", MB_OK);
 
}
Unrealscript
Код:
native(1247) final function int DllFunction();

AddSystemMessageString("Message"@DllFunction()); //string Вывод системных сообщений в чат
 
AND
int can be returned like this, I don’t know string yet, and I don’t know how to pass parameters to dll either))
C++:
#define RESULT_DECL void*const Result
typedef  void(__stdcall*Native)(struct FFrame& TheStack, RESULT_DECL);
typedef BYTE(__cdecl* GRegisterNative_fnType)(INT iNative, const Native& Func);

// Function that will be called instead of the original function with number 1247
void __stdcall functionUC(struct FFrame& Stack , RESULT_DECL)
{

    Stack.Code++;
  
// Write the result to Result
    *(int*)Result = 2 + 10;

   MessageBox(nullptr,  L"Load functionUC ", L"hook", MB_OK);
 
}
Unrealscript
Код:
native(1247) final function int DllFunction();

AddSystemMessageString("Message"@DllFunction()); //string Display system messages in chat
i tried it with int, but i receive 0 even if i put any value there, is it normal for you?
 
Назад
Сверху Снизу