• Ищем качественного (не новичок) разработчиков Xenforo для этого форума! В идеале, чтобы ты был фулл стек программистом. Если у тебя есть что показать, то свяжись с нами по контактным данным: https://t.me/DREDD

Вопрос Вопросы по c++ (Read/write memory)

Zeee
Пользователь
Пользователь
Статус
Оффлайн
Регистрация
9 Май 2018
Сообщения
458
Реакции
60
Вопросы ниже
 
Последнее редактирование:
Можно код GetModuleBaseAddress?
 
Можно код GetModuleBaseAddress?
C++:
Expand Collapse Copy
DWORD GetModuleBaseAddress(TCHAR* lpszModuleName, DWORD pId) {
    DWORD dwModuleBaseAddress = 0;
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pId);
    MODULEENTRY32 ModuleEntry32 = { 0 };
    ModuleEntry32.dwSize = sizeof(MODULEENTRY32);

    if (Module32First(hSnapshot, &ModuleEntry32))
    {
        do {
            if (_tcscmp(ModuleEntry32.szModule, lpszModuleName) == 0)
            {
                dwModuleBaseAddress = (DWORD)ModuleEntry32.modBaseAddr;
                break;
            }
        } while (Module32Next(hSnapshot, &ModuleEntry32));


    }
    CloseHandle(hSnapshot);
    return dwModuleBaseAddress;
}
 
используй многобайтовую кодировку, это во первых, во вторых есть функция
GetModuleBaseAddressA
В винапи функции делятся на юникод и не юникод можешь также попробовать GetModuleBaseAddressW
Также ты можешь задавать значение переменным для твоей функции с помощью (LPCWSTR)gamename
 
используй многобайтовую кодировку, это во первых, во вторых есть функция
GetModuleBaseAddressA
В винапи функции делятся на юникод и не юникод можешь также попробовать GetModuleBaseAddressW
Также ты можешь задавать значение переменным для твоей функции с помощью (LPCWSTR)gamename
Код:
Expand Collapse Copy
LPCWSTR gamename = L"Text"; // Как я понял могу поступить так?
-------------
char gamename[] = "Text";
    DWORD gameBaseAddress = GetModuleBaseAddress((LPCWSTR)gamename, pId);  //или так
Я не до конца понимаю, в какой кодировке мне передавать значения - если не сложно можешь объяснить подробнее
 

Вложения

  • 1623085503680.png
    1623085503680.png
    3.3 KB · Просмотры: 23
Код:
Expand Collapse Copy
LPCWSTR gamename = L"Text"; // Как я понял могу поступить так?
-------------
char gamename[] = "Text";
    DWORD gameBaseAddress = GetModuleBaseAddress((LPCWSTR)gamename, pId);  //или так
Я не до конца понимаю, в какой кодировке мне передавать значения - если не сложно можешь объяснить подробнее
GetModuleBaseAddressA((LPCSTR)gamename, pId);
 
Возникла проблема с получением поинтера.
C++:
Expand Collapse Copy
std::vector<DWORD> pointsOffsetsForceJump{ 0x001EE0E8, 0x00 };
std::vector<DWORD> pointsOffsetBhop{ 0x6ECBAC, 0x348 };

uintptr_t GetPointAddress(HANDLE pHandle, uintptr_t pointsAddress, std::vector<DWORD> pointsOffsets)
{
    for (int i = 0; i < pointsOffsets.size() - 1; i++)
    {
        ReadProcessMemory(pHandle, (LPVOID)(pointsAddress + pointsOffsets.at(i)), &pointsAddress, sizeof(pointsAddress), NULL);
        std::cout << "debugginfo: calculating offset = " << pointsAddress << std::endl;
    }
    std::cout << "---------End---------"<< std::endl;
    return pointsAddress += pointsOffsets.at(pointsOffsets.size() - 1);
}

uintptr_t BaseAddress = GetModuleBaseAddress(pId, L"client.dll");
ReadProcessMemory(pHandle, (LPVOID)(BaseAddress), &BaseAddress, sizeof(BaseAddress), NULL);
ForceJump = GetPointAddress(pHandle, BaseAddress, pointsOffsetsForceJump) // этот поинтер я получаю без проблем
Bhop = GetPointAddress(pHandle, BaseAddress, pointsOffsetBhop); // Этот же я не могу

Объясните что я делаю не так, спасибо :)
 
Возникла проблема с получением поинтера.
C++:
Expand Collapse Copy
std::vector<DWORD> pointsOffsetsForceJump{ 0x001EE0E8, 0x00 };
std::vector<DWORD> pointsOffsetBhop{ 0x6ECBAC, 0x348 };

uintptr_t GetPointAddress(HANDLE pHandle, uintptr_t pointsAddress, std::vector<DWORD> pointsOffsets)
{
    for (int i = 0; i < pointsOffsets.size() - 1; i++)
    {
        ReadProcessMemory(pHandle, (LPVOID)(pointsAddress + pointsOffsets.at(i)), &pointsAddress, sizeof(pointsAddress), NULL);
        std::cout << "debugginfo: calculating offset = " << pointsAddress << std::endl;
    }
    std::cout << "---------End---------"<< std::endl;
    return pointsAddress += pointsOffsets.at(pointsOffsets.size() - 1);
}

uintptr_t BaseAddress = GetModuleBaseAddress(pId, L"client.dll");
ReadProcessMemory(pHandle, (LPVOID)(BaseAddress), &BaseAddress, sizeof(BaseAddress), NULL);
ForceJump = GetPointAddress(pHandle, BaseAddress, pointsOffsetsForceJump) // этот поинтер я получаю без проблем
Bhop = GetPointAddress(pHandle, BaseAddress, pointsOffsetBhop); // Этот же я не могу

Объясните что я делаю не так, спасибо :)
Используй мой гайд лучше, у тебя вероятно поинтер неверный
 
uintptr_t BaseAddress = GetModuleBaseAddress(pId, L"client.dll");
ReadProcessMemory(pHandle, (LPVOID)(BaseAddress), &BaseAddress, sizeof(BaseAddress), NULL);
Это что блять такое, ты получаешь вирт адрес во внешнем процессе, и затем считываешь по нему указатель и записываешь прочитанное в базу, шта?
Ты читаешь PE заголовок дллки client.dll и у тебя вместо базового адреса какая-то ботва будет MHz етц, это чтение бред.
 
Используй мой гайд лучше, у тебя вероятно поинтер неверный
Ссылку можно?
Это что блять такое, ты получаешь вирт адрес во внешнем процессе, и затем считываешь по нему указатель и записываешь прочитанное в базу, шта?
Ты читаешь PE заголовок дллки client.dll и у тебя вместо базового адреса какая-то ботва будет MHz етц, это чтение бред.
Я попросил помочь разобраться тк с памятью работаю часа три от силы, а не просто критику - спасибо :smile:
1623162805421.png

1623162826386.png
 
а не просто критику - спасибо
А я и не критикую, мне вообще пофиг на этот код, тебе ответили что это чтение БРЕД и его нужно удалить, но если ты этого не сообразил то прими это на свой счет.
Как и предсказано оно выдает 9460301 == 905A4D == MZh, т.е. ты действительно читаешь 4 байта от PE заголовка на кой то хуй, а я даже не запускаю твой код.
 
А я и не критикую, мне вообще пофиг на этот код, тебе ответили что это чтение БРЕД и его нужно удалить, но если ты этого не сообразил то прими это на свой счет.
Ну если пофиг то зачем ты написал что это бред, думаешь я просто так попросил помощь из за крутого кода ? и сам не понимаю что где то написал бред?
Как и предсказано оно выдает 9460301 == 905A4D == MZh, т.е. ты действительно читаешь 4 байта от PE заголовка на кой то хуй, а я даже не запускаю твой код.
Спасибо за подсказку, но на кой хуй ты пишешь "А я даже не запускаю твой код" серьезно? если ты человек, который давно изучил плюсы, умеет работать с памятью - прошу не сравнивай меня с собой, я только начал этот путь.
 
прошу не сравнивай меня с собой, я только начал этот путь
Ты прав, что-то я слишком агрессивно хд
В общем, попробуй удалить эту строку, функция GetModuleBaseAddress уже должна выдавать тебе правильный адрес базы, ничего читать из нее не нужно.
Так же стоит добавить проверки после чтения любого адреса, что он не nullptr.
 
Назад
Сверху Снизу