Да у меня работает возможно вы не весь код скопировали. RESULT_DECLAND
i tried it with int, but i receive 0 even if i put any value there, is it normal for you?
i tried with the last code that u sent its like thisДа у меня работает возможно вы не весь код скопировали. RESULT_DECL
#define RESULT_DECL void*const Result
#include <windows.h>
#include "stdafx.h"
//#define P_FINISH Stack.Code++;
class UObject {};
// Структура, представляющая кадр стека
struct FFrame
{
public:
int* ftable; // Указатель на таблицу функций
void* Node; // Указатель на узел
UObject* Object; // Указатель на объект
BYTE* Code; // Указатель на код
BYTE* Locals; // Указатель на локальные переменные
INT LineNum; // Номер строки
};
// Тип для указателя на функцию, принимающую структуру FFrame и указатель на void
typedef void(__stdcall*NativeFunc)(struct FFrame& TheStack, void* const);
// Тип для указателя на функцию GRegisterNative
typedef BYTE(__cdecl* GRegisterNative_fnType)(INT iNative, const NativeFunc& Func);
// Функция, которая будет вызываться вместо оригинальной функции с номером 1247
//void __stdcall functionUC(struct FFrame& Stack, void* const)
void __stdcall functionUC(struct FFrame& Stack, void* const)
{
Stack.Code++;
// Запишите результат в Result
*(int*)Result = 10 + 2;
MessageBox(nullptr, L"Load functionUC ", 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;
}
i tried with the last code that u sent its like this
// Тип для указателя на функцию, принимающую структуру FFrame и указатель на void
typedef void(__stdcall*NativeFunc)(struct FFrame& TheStack, void* const);
// Тип для указателя на функцию GRegisterNative
typedef BYTE(__cdecl* GRegisterNative_fnType)(INT iNative, const NativeFunc& Func);
// Функция, которая будет вызываться вместо оригинальной функции с номером 1247
//void __stdcall functionUC(struct FFrame& Stack, void* const)
void __stdcall functionUC(struct FFrame& Stack, void* const)
{
Stack.Code++;
// Запишите результат в Result
*(int*)Result = 10 + 2;
MessageBox(nullptr, L"Load functionUC ", L"hook", MB_OK);
}
#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);
}
int count;
// Тип для указателя на функцию, принимающую структуру FFrame и указатель на void
typedef void(__stdcall* Native)(FFrame&, void*const );
// Тип для указателя на функцию GRegisterNative
typedef BYTE(__cdecl* GRegisterNative_fnType)(INT iNative, const Native& Func);
// Функция, которая будет вызываться вместо оригинальной функции с номером 1247
void __stdcall functionUC(struct FFrame& Stack , void* Result)
{
Stack.Code++;
// Извлечение результата
int result = *(int*)Result;
// Теперь вы можете использовать *param для получения значения этого параметра
MessageBox(nullptr, (LPCWSTR)(L"Load functionUC " + std::to_wstring(result)).c_str(), L"hook", MB_OK);
*(int*)Result = count++; //Выводим результат
}
native(1247) final function int DllFunction();
local int test;
test = 1000;
test = DllFunction();
AddSystemMessageString("Message"@test); //string Вывыод системных сообщений в чат
По идее перебираешь стек, как и почему это вопрос к тем кто сделал FFrame.Кто может мне объяснить как это работает?))
В MessageBox я получаю 1000 которая записана в unrealscript в переменной test))
Не могу понять как это вообще сработало?
C++:int count; // Тип для указателя на функцию, принимающую структуру FFrame и указатель на void typedef void(__stdcall* Native)(FFrame&, void*const ); // Тип для указателя на функцию GRegisterNative typedef BYTE(__cdecl* GRegisterNative_fnType)(INT iNative, const Native& Func); // Функция, которая будет вызываться вместо оригинальной функции с номером 1247 void __stdcall functionUC(struct FFrame& Stack , void* Result) { Stack.Code++; // Извлечение результата int result = *(int*)Result; // Теперь вы можете использовать *param для получения значения этого параметра MessageBox(nullptr, (LPCWSTR)(L"Load functionUC " + std::to_wstring(result)).c_str(), L"hook", MB_OK); *(int*)Result = count++; //Выводим результат }
UnrealScript
Код:native(1247) final function int DllFunction(); local int test; test = 1000; test = DllFunction(); AddSystemMessageString("Message"@test); //string Вывыод системных сообщений в чат
так у тебя возврат идет в test параметр. При вызове функции в параметр Result пишется ссылка на параметр куда идет запись.Кто может мне объяснить как это работает?))
В MessageBox я получаю 1000 которая записана в unrealscript в переменной test))
Не могу понять как это вообще сработало?
C++:int count; // Тип для указателя на функцию, принимающую структуру FFrame и указатель на void typedef void(__stdcall* Native)(FFrame&, void*const ); // Тип для указателя на функцию GRegisterNative typedef BYTE(__cdecl* GRegisterNative_fnType)(INT iNative, const Native& Func); // Функция, которая будет вызываться вместо оригинальной функции с номером 1247 void __stdcall functionUC(struct FFrame& Stack , void* Result) { Stack.Code++; // Извлечение результата int result = *(int*)Result; // Теперь вы можете использовать *param для получения значения этого параметра MessageBox(nullptr, (LPCWSTR)(L"Load functionUC " + std::to_wstring(result)).c_str(), L"hook", MB_OK); *(int*)Result = count++; //Выводим результат }
UnrealScript
Код:native(1247) final function int DllFunction(); local int test; test = 1000; test = DllFunction(); AddSystemMessageString("Message"@test); //string Вывыод системных сообщений в чат
int count;//Счетчик
// Тип для указателя на функцию, принимающую структуру FFrame и указатель на void
typedef void(__stdcall* Native)(FFrame&, void*const );
// Тип для указателя на функцию GRegisterNative
typedef BYTE(__cdecl* GRegisterNative_fnType)(INT iNative, const Native& Func);
// Функция, которая будет вызываться вместо оригинальной функции с номером 1247
void __stdcall functionUC(struct FFrame& Stack , void* Result)
{
Stack.Code++;
// Извлечение результата
int result = *(int*)Result;
// Выведем что пришло из скрипта
MessageBox(nullptr, (LPCWSTR)(L"Load functionUC " + std::to_wstring(result)).c_str(), L"hook", MB_OK);
*(int*)Result = ++count; //Выводим результат
}
}
//Объявим функцию
native(1247) final function int DllFunction();
.......................................................................................................
//Где нибудь в функции вызовем:
//Первый вариант
AddSystemMessageString("Message"@dllCommand(1)); //Отправить в dll число 1 и вернуть результат
//Второй вариант
dllCommand(2); //Просто отправить в dll число 2
.......................................................................................................
//Обработчик вызова
function int DllCommand(int id){
id = DllFunction();
return id;
}
Я примерно понимаю но пока не могу понять как передать получить параметры правильно(так у тебя возврат идет в test параметр. При вызове функции в параметр Result пишется ссылка на параметр куда идет запись.
struct FFrame
{
public:
int* ftable;
void* Node;
UObject* Object;
BYTE* Code;
BYTE* Locals;
INT LineNum;
inline INT ReadInt()
{
INT Result;
Result = *(INT*)Code;
Code += sizeof(INT);
return Result;
}
}
Буду пробовать изучать спасибо! я просто мало сталкивался с c++параметры извлекаются так же из code. Пример
Мне кажется я нашел причину и ошибка исчезла теперь Stack.Code++ использую один раз.параметры извлекаются так же из code. Пример
Code += sizeof(INT)+1;
В самой функции не корректно сдвигать. Так как у структур параметры идут без переключения до конца. Но в целом можно и так оставить.Буду пробовать изучать спасибо! я просто мало сталкивался с c++
Я проверил ваш код работает но после выполняя зависает Stack.Code++; использую
Test
Заработало использовал 2 раза Stack.Code++; до и после выполнения код
Мне кажется я нашел причину и ошибка исчезла теперь Stack.Code++ использую один раз.
Я правильно сделал?
C++:Code += sizeof(INT)+1;
Что если передать число не 1000, а 1 или 5? У меня фигня какая-то с такими числамиКто может мне объяснить как это работает?))
В MessageBox я получаю 1000 которая записана в unrealscript в переменной test))
Не могу понять как это вообще сработало?
C++:int count; // Тип для указателя на функцию, принимающую структуру FFrame и указатель на void typedef void(__stdcall* Native)(FFrame&, void*const ); // Тип для указателя на функцию GRegisterNative typedef BYTE(__cdecl* GRegisterNative_fnType)(INT iNative, const Native& Func); // Функция, которая будет вызываться вместо оригинальной функции с номером 1247 void __stdcall functionUC(struct FFrame& Stack , void* Result) { Stack.Code++; // Извлечение результата int result = *(int*)Result; // Теперь вы можете использовать *param для получения значения этого параметра MessageBox(nullptr, (LPCWSTR)(L"Load functionUC " + std::to_wstring(result)).c_str(), L"hook", MB_OK); *(int*)Result = count++; //Выводим результат }
UnrealScript
Код:native(1247) final function int DllFunction(); local int test; test = 1000; test = DllFunction(); AddSystemMessageString("Message"@test); //string Вывыод системных сообщений в чат
Интересно. Видимо какие-то приколы в uc скриптах
callTestNative( 6666 ); // передается как int
callTestNative( 5 ); // передается как byte
function callNative()
{
local int testArg;
testArg = 6666;
callTestNative( testArg ); // а вот так аргумент вообще не передается
return;
}
Я сделал так как Test предложил, думаю так правильней будет.Интересно. Видимо какие-то приколы в uc скриптах
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
class UObject {};//Пустышка
// Структура, представляющая кадр стека
struct FFrame
{
public:
int* ftable; // Указатель на таблицу функций
void* Node; // Указатель на узел
UObject* Object; // Указатель на объект
BYTE* Code; // Указатель на код
BYTE* Locals; // Указатель на локальные переменные
INT LineNum; // Номер строки
inline INT Param1()
{
INT Result;
Result = *(INT*)Code;
Code += sizeof(INT) + 1;
return Result;
}
inline INT Param2()
{
INT Result;
Result = *(INT*)Code;
Code += sizeof(INT) + 1;
return Result;
}
};
int countR;
// Тип для указателя на функцию, принимающую структуру FFrame и указатель на void
typedef void(__stdcall* Native)(FFrame&, void*const );
// Тип для указателя на функцию GRegisterNative
typedef BYTE(__cdecl* GRegisterNative_fnType)(INT iNative, const Native& Func);
// Функция, которая будет вызываться вместо оригинальной функции с номером 1247
void __stdcall functionUC(struct FFrame& Stack , void* Result)
{
Stack.Code++;
// Извлечение результата
int param1 = Stack.Param1();
// Извлечение результата
int param2 = Stack.Param2();
std::wstring message = L"\nParam2 " + to_wstring(param2);
MessageBox(nullptr, message.c_str(), L"hook", MB_OK);
*(int*)Result = countR++; //Выводим результат
}
// Функция для хука функции в модуле "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();
CreateThread(0, 0, LPTHREAD_START_ROUTINE(hookCore), 0, 0, 0);
break;
}
// Возвращение значения TRUE, сигнализируя о успешном завершении функции DllMain
return TRUE;
}
have the same question, made some tests with std::string, char but nothingThe question remains: how to transfer not int, but text from uc to dll.
For example, I press a button in the interface and a message with text from the uc code pops up through the dll.
Проверил который код дал Test так и есть как ты описалИнтересно. Видимо какие-то приколы в uc скриптах
C++:callTestNative( 6666 ); // передается как int callTestNative( 5 ); // передается как byte
Если нельзя будет передать текст из uc в dll, тогда единственный вариант костылить как всегда.Проверил который код дал Test так и есть как ты описал
Это 100% можно сделать. Постараюсь разобраться каким образом, пока что времени на это нет. И сначала мне нужно понять почему в моих скриптах переменные не передаются в нативную функциюЕсли нельзя будет передать текст из uc в dll
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?