Подпишитесь на наш Telegram-канал, чтобы всегда быть в курсе важных обновлений! Перейти

C++ Указать memory r/w в коде

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
24 Фев 2021
Сообщения
23
Реакции
1
Надо в 3 частях правильно указать memory r/w. Как его правильно прописать?

C++:
Expand Collapse Copy
uintptr_t getBaseAddress(uintptr_t pid){
    // add  memory r/w code  #1
    return NULL;
}

template <typename T> T read(uintptr_t pid, uintptr_t address) {
    T t{};
    // add  memory r/w code #2
    return t;
}

template <typename T> void write(uintptr_t pid, uintptr_t address, T& buffer) {
    // add  memory r/w code #3
}
 
C++:
Expand Collapse Copy
template <typename T> T read(HANDLE hProcess, const uintptr_t address, int size) {
    T t{};
    ReadProcessMemory(hProcess, address, t,  size,  NULL);
    return t;

}

template <typename T> void write(HANDLE hProcess, uintptr_t address, int size, T& buffer) {
     WriteProcessMemory(hProcess,  address, buffer,  size,  NULL);

}

Только вот смысл использования темплейтов..?
 
C++:
Expand Collapse Copy
template <typename T> T read(HANDLE hProcess, const uintptr_t address, int size) {
    T t{};
    ReadProcessMemory(hProcess, address, t,  size,  NULL);
    return t;

}

template <typename T> void write(HANDLE hProcess, uintptr_t address, int size, T& buffer) {
     WriteProcessMemory(hProcess,  address, buffer,  size,  NULL);

}

Только вот смысл использования темплейтов..?
Это удобно. В коде можно будет считывать переменные/структуры как
C++:
Expand Collapse Copy
Glow_t GlowObj = Read<Glow_t>(GlowManager + (GlowIndex * 0x38))
например.
Единственный случай когда будет удобнее считывать их как массив, это для строк или больших кусков памяти в которых потом уже что-то делать (С целью оптимизации кол-ва использований WPM/RPM), во всех остальных случаях как по мне будет гораздо удобнее считывать значение через функцию-обёртку с шаблоном а не считывать четыре байта в массив и потом делать *(int*)&bytes чтобы сконвертировать эти четыре байта в число.
 
спасибо))
C++:
Expand Collapse Copy
template <typename T> T read(HANDLE hProcess, const uintptr_t address, int size) {
    T t{};
    ReadProcessMemory(hProcess, address, t,  size,  NULL);
    return t;

}

template <typename T> void write(HANDLE hProcess, uintptr_t address, int size, T& buffer) {
     WriteProcessMemory(hProcess,  address, buffer,  size,  NULL);

}

Только вот смысл использования темплейтов..?
я пробую инжект не обычный написать xd, благодарю)
 
C++:
Expand Collapse Copy
template <typename T> T read(HANDLE hProcess, const uintptr_t address, int size) {
    T t{};
    ReadProcessMemory(hProcess, address, t,  size,  NULL);
    return t;

}

template <typename T> void write(HANDLE hProcess, uintptr_t address, int size, T& buffer) {
     WriteProcessMemory(hProcess,  address, buffer,  size,  NULL);

}

Только вот смысл использования темплейтов..?
Не проще создать класс, в котором можно в констукторе получать дескриптор процесса и передавать это значение в переменную?
 
Не проще создать класс, в котором можно в констукторе получать дескриптор процесса и передавать это значение в переменную?
Автор попросил добавить в код рид&райт, я добавил, остальное не ко мне) хотя лучше было бы, наверное, сделать hProcess ссылкой, Handle толстый вроде...
Тут в целом идея использования темплейта и тайпнейма плоха, ну и функция в темплейте у него void, что является плохой идеей, в купе с функциями, возвращающими булы.
 
Автор попросил добавить в код рид&райт, я добавил, остальное не ко мне) хотя лучше было бы, наверное, сделать hProcess ссылкой, Handle толстый вроде...
Тут в целом идея использования темплейта и тайпнейма плоха, ну и функция в темплейте у него void, что является плохой идеей, в купе с функциями, возвращающими булы.
Чем конкретно плохо использование темплейта? Если про то что мы не возвращаем BOOL ещё понятно, хотя по идее единственная ситуация где это может создать проблемы это при чтении read-only памяти или out of memory, ибо в остальных случаях у тебя зафейлится ещё на этапе открытия хэндла, то чем темплейт не угодил я даже представить не могу.
 
Последнее редактирование:
Чем конкретно плохо использование темплейта?
В принципе - ничем) Но конкретно в данной ситуации - это странно. По-факту, темплейт функция, которая вызывает другую функцию - плохая идея. Это можно сделать только при желании сокращения кол-ва аргументов, которые всегда +- одинаковые (как, например, хэндл процесса, который, как говорил алмир, можно получать с помощью конструктора класса), но ведь тут их кол-во глобально то и не уменьшается, всего на пару штук.
Зато после этого сокращения мы получаем лишний вызов функции - вызов функции-темплейта, которая вызывает уже сам read/write.
Думаю, что лучше уж лишний раз напрячься и дописать пару лишних аргументов, чем жертвовать производительностью (пусть даже и незначительно), ну и C+P уже готового шаблона функции никто не отменял)
 
Зато после этого сокращения мы получаем лишний вызов функции - вызов функции-темплейта, которая вызывает уже сам read/write.
__forceinline, дальше компилятор сам соптимизирует до того что было бы при прямом вызове ReadProcessMemory.
но ведь тут их кол-во глобально то и не уменьшается, всего на пару штук.
учитывая что RPM/WPM используются часто, эта пара аргументов которые и так NULL каждый раз писать смысла я лично не вижу, к тому-же тут ещё в RPM автоматически есть буфер с его размером через sizeof(), и мы сравниваем
C++:
Expand Collapse Copy
DWORD SomeCoolValue{};
ReadProcessMemory(hProcess, 0xDEADBEEF, &SomeCoolValue, sizeof(DWORD), NULL)
с
C++:
Expand Collapse Copy
DWORD SomeCoolValue = Read<DWORD>(hProcess, 0xDEADBEEF)
и как по мне, второй вариант гораздо приятнее. лучше конечно сделать класс для работы с памятью и хэндл не передавать в аргументе.
 
Назад
Сверху Снизу