Можете показать свой код?Я уже менял соглашения о вызове мне это не помогло((
Follow along with the video below to see how to install our site as a web app on your home screen.
Примечание: This feature may not be available in some browsers.
Можете показать свой код?Я уже менял соглашения о вызове мне это не помогло((
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;
}
//Обявляю функцию
native(1247) static final function ItemExSort();
//Так вызываю
ItemExSort();
Во-первых, у меня еще на этапе регистрации нативок краш из-заC++
UnrealScriptC++:#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; }
C++://Обявляю функцию native(1247) static final function ItemExSort(); //Так вызываю ItemExSort();
// Тип для указателя на функцию GRegisterNative
typedef BYTE(__stdcall* GRegisterNative_fnType)(INT iNative, const Native& Func);
typedef BYTE(__cdecl* GRegisterNative_fnType)(INT iNative, const Native& Func);
class UObject {};
struct FFrame
{
public:
int* ftable;
void* Node;
UObject* Object; // вот тут INT* Object допустимо
BYTE* Code; // здесь BYTE* а не INT*
BYTE* Locals;
INT LineNum;
};
Спасибо все заработало! Похоже ошибку я допустил с самого начла BYTE* Code; // здесь BYTE* а не INT*, __stdcall я похоже откат сделал и вставил код на форум)И в структуре ошибки. Почему Code стал INT* ? Вот же правильная структура, которой поделился Test:
#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;
}
//Обявляю функцию
native(1247) static final function ItemExSort();
//Так вызываю
ItemExSort();
interlude но я как понял это должно работать и в других хроникахare u testing it on which chronicle?
let me give a try on Interlude, did you inject this dll or let the magic happen from unreal side?interlude but as I understand it should work in other chronicles
Я просто назвал interface.dll и положил в папку system и игра сама подгрузила ее!let me give a try on Interlude, did you inject this dll or let the magic happen from unreal side?
so i guess it might be different on other chroniclesI just named interface.dll and put it in the system folder and the game itself loaded it!
Interlude и High Five точно будет работать в выше хрониках не проверялso i guess it might be different on other chronicles
You can try more inject with cff explorer to Fire.dllso i guess it might be different on other chronicles
Хороший вопрос, тоже интересно. Наверно нужно вытаскивать аргументы из стека. Буду разбиратьсяДопустим мы хотим передать текст из .uc в dll и вывести его как сообщение, как правильно сделать в данном случае?
Лучше наверное полную версию в мануалы добавить чтобы не потерялось если все работает.
epilogue NA 152Which chronicle are u testing it?
на интерлюде можно l2ui назвать, тоже сама загрузится. На хрониках выше вряд ли работает. Я делаю так:Я просто назвал interface.dll и положил в папку system и игра сама подгрузила ее!
__declspec(dllexport) void bind() {};
so on other chronicles we inject on engine.dll the hookCore function?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:
And then in cff explorer:C++:__declspec(dllexport) void bind() {};
Посмотреть вложение 77669
Fast, simple, convenient
// Точка входа для DLLso on other chronicles we inject on engine.dll the hookCore function?
any game dll. l2.exe as wellso on other chronicles we inject on engine.dll the hookCore function?
native(1247) static final function string ItemExSort();
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?
#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);
}
native(1247) final function int DllFunction();
AddSystemMessageString("Message"@DllFunction()); //string Вывод системных сообщений в чат
i tried it with int, but i receive 0 even if i put any value there, is it normal for you?int can be returned like this, I don’t know string yet, and I don’t know how to pass parameters to dll either))
UnrealscriptC++:#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); }
Код:native(1247) final function int DllFunction(); AddSystemMessageString("Message"@DllFunction()); //string Display system messages in chat