Вопрос Вызов функи

Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
324
Реакции[?]
24
Поинты[?]
12K
Не знаю как правильно поставить вопрос, но почему например когда я вызываю функу из RunFrame. то она срабатывает а когда вызываю со своих файлов то он чето херово робит.
Например следующий код работает нормально:
C++:
somewhere in Main.h
void HookedRunFrame()
{
SetModel(Object,ModelName);
return OriignalRunFrame();
}
А вот этот не работает
Cheat
void Hack(void*)
{
SetModel(Object.,Modelname)
}

Main.h
:
C++:
void HookedRunFrame()
{
Hack(Object)
return OriignalRunFrame();
}
 
Пользователь
Статус
Оффлайн
Регистрация
5 Июл 2022
Сообщения
1,000
Реакции[?]
86
Поинты[?]
23K
Не знаю как правильно поставить вопрос, но почему например когда я вызываю функу из RunFrame. то она срабатывает а когда вызываю со своих файлов то он чето херово робит.
Например следующий код работает нормально:
C++:
somewhere in Main.h
void HookedRunFrame()
{
SetModel(Object,ModelName);
return OriignalRunFrame();
}
А вот этот не работает
Cheat
void Hack(void*)
{
SetModel(Object.,Modelname)
}

Main.h
:
C++:
void HookedRunFrame()
{
Hack(Object)
return OriignalRunFrame();
}
попробуй:

main.h:
void Hack()
{
    SetModel(Object, Modelname)
}

call:
void HookedRunFrame()
{
    Hack()
    return OriignalRunFrame();
}
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Не знаю как правильно поставить вопрос, но почему например когда я вызываю функу из RunFrame. то она срабатывает а когда вызываю со своих файлов то он чето херово робит.
Например следующий код работает нормально:
C++:
somewhere in Main.h
void HookedRunFrame()
{
SetModel(Object,ModelName);
return OriignalRunFrame();
}
А вот этот не работает
Cheat
void Hack(void*)
{
SetModel(Object.,Modelname)
}

Main.h
:
C++:
void HookedRunFrame()
{
Hack(Object)
return OriignalRunFrame();
}
нифига не понял, ты хочешь сказать что у тебя "сырой" код работает но если его завернуть в функцию и вызвать ее в том же контексте то уже не работает?
и что такое Object, это глобал? как он объявлен?
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
663
Реакции[?]
104
Поинты[?]
67K
скинь норм код не понятно чето сначалотподумал дело в том что не мейн трейд а потомпонял шо хз
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
324
Реакции[?]
24
Поинты[?]
12K
C++:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////Cheat.h
typedef ..........Func;
Func oSetModel;


void SetModel(void* Object)
{
oSetModel(object,trees::pumpkin);
}

class BinaryObjectSystem
{
...
void SetObjects()
{
for (const auto& object : g_BinaryObjectSystem->objects)
                {
                    if (object)
                    {

                        SetModel(object);
                        
                    }
                }

}
...
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////Main.h
void HookerRunFrame()
{
...
g_BinaryObjectSystem->SetObjects();
...
}
Выше код не робит, ничего не происходит. Но стоит мне сделать вот так,и всё зароботает:


C++:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////Cheat.h
typedef ..........Func;
Func oSetModel;


void SetModel(void* Object)
{
oSetModel(object,trees::pumpkin);
}

class BinaryObjectSystem
{
...
void SetObjects()
{

}
...
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////Main.h
void HookerRunFrame()
{
...
for (const auto& object : g_BinaryObjectSystem->objects)
                {
                    if (object)
                    {

                      oSetModel(object,trees::pumpkin);
                        
                    }
                }
...
}
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
C++:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////Cheat.h
typedef ..........Func;
Func oSetModel;


void SetModel(void* Object)
{
oSetModel(object,trees::pumpkin);
}

class BinaryObjectSystem
{
...
void SetObjects()
{
for (const auto& object : g_BinaryObjectSystem->objects)
                {
                    if (object)
                    {

                        SetModel(object);
                      
                    }
                }

}
...
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////Main.h
void HookerRunFrame()
{
...
g_BinaryObjectSystem->SetObjects();
...
}
Выше код не робит, ничего не происходит. Но стоит мне сделать вот так,и всё зароботает:


C++:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////Cheat.h
typedef ..........Func;
Func oSetModel;


void SetModel(void* Object)
{
oSetModel(object,trees::pumpkin);
}

class BinaryObjectSystem
{
...
void SetObjects()
{

}
...
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////Main.h
void HookerRunFrame()
{
...
for (const auto& object : g_BinaryObjectSystem->objects)
                {
                    if (object)
                    {

                      oSetModel(object,trees::pumpkin);
                      
                    }
                }
...
}
это ты криво сюда вставил или у тебя так написано?
C++:
void SetModel(void* Object)
{
oSetModel(object,trees::pumpkin);
}
Object арг и неизвестная какая-то переменная object(буква O в разном регистре) передается в oSetModel
в конце концов сделай лог и/или брейкпоинт и перепроверь что всё вызывается и с нужными параметрами
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
324
Реакции[?]
24
Поинты[?]
12K
это ты криво сюда вставил или у тебя так написано?
C++:
void SetModel(void* Object)
{
oSetModel(object,trees::pumpkin);
}
Object арг и неизвестная какая-то переменная object(буква O в разном регистре) передается в oSetModel
в конце концов сделай лог и/или брейкпоинт и перепроверь что всё вызывается и с нужными параметрами
это я просто с руки написал чтобы, там норм аргумент просто так прикол даже в гайде было написано что нужно вызывать из ранфрейма а не из своей дллки, лии как оно работает вообще не понимаю.
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
это я просто с руки написал чтобы, там норм аргумент просто так прикол даже в гайде было написано что нужно вызывать из ранфрейма а не из своей дллки, лии как оно работает вообще не понимаю.
ранфрейм в мейн треде исполняется, а твой дллмейн из треда который тебе инжектор создал/угнал, так то да надо из мейн треда всё вызывать
ты пробовал в одном файле сделать ради теста? мб у тебя там хуйня просто с переменными и транслейшн юнитами?
в любом случае ты сделал лог бп и тд проверил всё?
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
324
Реакции[?]
24
Поинты[?]
12K
ранфрейм в мейн треде исполняется, а твой дллмейн из треда который тебе инжектор создал/угнал, так то да надо из мейн треда всё вызывать
ты пробовал в одном файле сделать ради теста? мб у тебя там хуйня просто с переменными и транслейшн юнитами?
в любом случае ты сделал лог бп и тд проверил всё?
та я решил хуярить все в ранфрейме по сути голыми вызовами, заебался дебажить)) самое смешное что триченжер помог сделать мой опыт со скинченжеру, там ведь тоже есть функа ::Spawn внутри которой есть SetModel или что-то такое)))
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
та я решил хуярить все в ранфрейме по сути голыми вызовами, заебался дебажить)) самое смешное что триченжер помог сделать мой опыт со скинченжеру, там ведь тоже есть функа ::Spawn внутри которой есть SetModel или что-то такое)))
сегодня заебался завтра ебаться не придется. пиздуй вернись пофикси - можешь бекап проекта на всякий сделать; сейчас пофиксишь - опыт получишь, некст раз не будешь так делать
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
663
Реакции[?]
104
Поинты[?]
67K
сегодня заебался завтра ебаться не придется. пиздуй вернись пофикси - можешь бекап проекта на всякий сделать; сейчас пофиксишь - опыт получишь, некст раз не будешь так делать
о кстати либералист не знаешь нормального способа как сделать ченжер? кроме там ребилда демо режимо и фикса анимок вручную? а то видел какойто xnkenzo вроде писал что можно без этого и разы проще сделать... хотя скорее всего он просто потроллить решил)
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
о кстати либералист не знаешь нормального способа как сделать ченжер? кроме там ребилда демо режимо и фикса анимок вручную? а то видел какойто xnkenzo вроде писал что можно без этого и разы проще сделать... хотя скорее всего он просто потроллить решил)
не знаю про "простые" способы без костылей, ведь некоторую работу в игре делает сервер а если он ее не будет делать(потому что реальных шмоток нет) то придется ее делать самому
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
324
Реакции[?]
24
Поинты[?]
12K
сегодня заебался завтра ебаться не придется. пиздуй вернись пофикси - можешь бекап проекта на всякий сделать; сейчас пофиксишь - опыт получишь, некст раз не будешь так делать
Не хочу создавать лишний тред уже, но можешь дать несколько советов вообще про ранфрейм? Типа чего не нужно делать в ранфрейме и своими файликами чита. А так же, как правильно аллоцировать память? Типа не против если я гдето создам оператором new. Ну вот например чтобы удобно хранить всякие штуки про героев:
C++:
struct PlayerData;
std::vector<PlayerData*> playersData;
struct PlayerData
{
C_BaseEntity* EntityHero;
const char* Name;
Vector Position;
int AbilitiesIndices[7];
bool IsEnemy;
}
Можно ли гдето, даже в том в лупе сделать:
C++:
for(C_BaseEntity* ent = EntitySystem->GetFirstEnt(); ent; ent = EntitySystem->GetNextEnt(ent))
{
...
bool FoundHero = false;
for(const auto& obj : playersData)
{
if(obj->EntityHero == ent)
{
FoundHero= true;
}
}
if(!FoundHero)
{
PlayerData* pd = new PlayerData(); //////////////////// Можно ли так аллоцировать память под свои структуры?
...
playersData.insert(pd); ///////////////////////
}
...
}
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Не хочу создавать лишний тред уже, но можешь дать несколько советов вообще про ранфрейм? Типа чего не нужно делать в ранфрейме и своими файликами чита. А так же, как правильно аллоцировать память? Типа не против если я гдето создам оператором new. Ну вот например чтобы удобно хранить всякие штуки про героев:
(возможно в чем-то ошибаюсь)
ну во-первых new/delete хуйня, есть std::unique_ptr который делает то же самое но у него есть деструктор который делете вызывает.
C++:
std::vector<std::unique_ptr<PlayerData>> playersData;
...
auto my_data = std::make_unqiue<PlayerData>();
my_data->blablabla... //ну или в ктор сразу параметры
playersData.push_back(std::move(my_data));
ну либо нахуй тебе ваще нужны указатели если ты в векторе сами объекты напрямую можешь хранить? std::vector<PlayerData> + emplace_back или PlayerData my_data{}; my_data.govno = 123; playersData.push_back(std::move(my_data))

во-вторых глобальные переменные в длл умирают при вызове ентрипоинта(не дллмейна а той функцию которая его вызывает(дллмейн это не самая главная функция - есть являющаяся частью рантаймы майкрософтовской самая мега-главная функция-обертка которая уже потом дллмейн вызывает)) с DLL_PROCESS_DETACH. собственно если у тебя этого не происходит(ммап блаблабла) то глобалы и статики не будут умирать, так что если у тебя гдето логика в деструкторах то учитывай это

в-третьих по факту память это только виртуальные странички(ну есть еще физическая память но не суть), т.е. системный вызов NtAllocateVirtualMemory, всё остальное - malloc, new(он маллок юзает) и тд это просто обертки которые обычно заблаговременно резервируют некий кусок памяти и потом по кусочкам раздают его по запросу, либо аллоцируют новый виртуальный кусок если надо, и не спешат деаллоцировать память при освобождении а могут сохранять ее чтобы потом в будущем ее уже раздавать, в общем это "менеджеры" аллокаций. у них там свои "таблицы" сколько где в каких страничках "свободного" места и тд; есть системный менеджер(RtlCreateHeap и тд), его твоя длл и будет юзать(RtlCreateHeap хендл возвращает, там у каждой длл/exe свой хендл на свой менеджер); в сурс движке юзается tier0!g_pMemAlloc. главное не нарушать целостность этих "таблиц", т.е. не удалять то что аллоцированно чужим менеджером и не аллоцировать своим то что потом будет удалять чужой менеджер, не удалять дважды и тд.
кароче главное что тебе нужно понимать это то что реальные аллокации происходят системным вызовом, существует системный менеджер Rtl...Heap(new malloc и тд его юзают), концепции передачи/хранения объектов с владением(кто взял/получил/хранит объект тот и несет ответственность за удаление и тд) и просмотром(просто взяли посмотреть, не управляют жизнью и смертью объекта), а также где чья юрисдикция(какие вещи габен будет через свой g_pMemAlloc удалять(например если ты редактируешь(элементы добавляешь) в CUtlVector где-нибудь габеновский то тебе надо через его аллокатор это делать потому что потом рано или поздно он полезет удалять память из под этого вектора и если она не аллоцирована его аллокатором то это ему очень не понравится), какие ты сам будешь удалять и тд).

в-четвертых, при чем здесь ранфрейм и файлы? хук ранфрейма дает тебе КОНТЕКСТ, т.е. ПОТОК, т.е. та виндосовская хуйня которая запускается на ядре процессора, у которой в регистрах лежат свои данные и тд; работа с игровой хуйней прежде всего должна происходить в игровом контексте, как минимум из соображений синронизации(ты не можешь параллельно на своем ядре процессора итерировать сущности, потому что их в любой момент другое ядро может удалить к хуям одновременно с тем как ты с ними работаешь; если ты хукаешь ранфрейм(или другие функции) то ты получаешь прежде всего запуск кода на том же самом ядре(ну точнее в том же контексте), и в строго определенном порядке, до или после того как игра будет делать какието нужные/ненужные тебе вещи). файлы же в свою очередь это просто translation unit'ы(.c(pp) файлы) которые имеют закрепленные за ними переменные/функции(или упомянания чужих(из других спп файлов) переменных/функций)(internal linkage это то что принадлежит юниту, extern[al linkage] это упомянания вещей из других юнитов(мол они где-то есть пусть линкер сам ищет среди всей кучи юнитов данную вещь и "вставляет" ее сюда оттуда)), которые линкер собирает воедино(грубо говоря из кучи .cpp файлов делает один большой мега-cpp файл(это не так но суть примерно такая же) который потом в .exe/dll превращается)(.h(pp) файлы это просто ничего не значащий сам по себе мусор который компилятор в прямом смысле вставляет напрямую(ctrl+c, ctrl+v) в спп файлы когда видит #include)

в-пятых, т.к. ранфрейм в другом потоке то естественно если у тебя какойто мультитрединг/тредлокал шлак то надо с этим аккуратно быть, например в дравлисты всякие лучше не добавлять(без синхронизации. мьютекс хотя бы какой-нибудь. чтобы не было такого что ты на одном ядре читаешь а на другом пишешь в этот же самый момент. ничем хорошим не закончится) т.к. рендер(чтение из этих дравлистов) в другом потоке(не в мейн треде) происходит и тд.; аллокации впринципе должны быть тредсейф(т.е. либо нечего там синхронизировать либо есть механизмы синхронизации), читай документацию майкрософтовской рантаймы(ну судя по настройкам компилятора связанных с рантаймой, по названиям опций Multithreaded можно судить что да там тредсейф)
 
Сверху Снизу