Другое С/С++ Вопрос - Ответ

RTD

Нестандартное звание
Модератор
391
414
Переделал AntiBikeFall (ремень) internal в external. В принципе, он работает. Однако при столкновении на большой скорости игра крашит.
В чем может быть проблема?
Ты не правильно перевел даже близко, оно не могло работать(если говоришь "В принципе, он работает", то ты не набрал достаточную скорость чтобы сработала функция падения), почитай что делает
C++:
*(BYTE*)0x4BA3B9 = 0xE9;
и что
C++:
memset((PVOID)0x4BA3BC, 0x00, 2);
и параметры функции WriteProcessMemory

Я вижу что ты на рандоме пишешь - а вдруг сработает...
 

RTD

Нестандартное звание
Модератор
391
414
Есть такое)
memset использовать не могу:
Посмотреть вложение 55876

BYTE использовать не могу:


Посмотреть вложение 55875
Тебе и не нужно их использовать, ты должен знать что они делают, а ты не знаешь. Вот пример(с мемсет такой же код)
C++:
int bufMoney = 444;
WriteProcessMemory(hProcess, (LPVOID)0xB7CE50, &bufMoney, 4 /*sizeof(DWORD)*/, nullptr); //*(*DWORD)0xB7CE50 = 444
 

ALF

Известный
Проверенный
320
537
Переделал AntiBikeFall (ремень) internal в external. В принципе, он работает. Однако при столкновении на большой скорости игра крашит.
В чем может быть проблема?
C++:
        VirtualProtect((PVOID)0x4BA3B9, 6, PAGE_EXECUTE_READWRITE, NULL);
        VirtualProtect((PVOID)0x4B3296, 3, PAGE_EXECUTE_READWRITE, NULL);
        DWORD one = 0x4BA3B9;
        DWORD two = 0x4BA3BA;
        DWORD three = 0x4BA3BB;
        DWORD four = 0x4BA3BF;
        DWORD five = 0x4BA3BC;
        DWORD six = 0x4B3296;
        one = 0xE9;
        two = 0xA7;
        three = 0x03;
        ReadProcessMemory(hProcess, (LPVOID)0x4BA3B9, &one, sizeof(one), 0);
        ReadProcessMemory(hProcess, (LPVOID)0x4BA3BA, &two, sizeof(two), 0);
        ReadProcessMemory(hProcess, (LPVOID)0x4BA3BB, &three, sizeof(three), 0);
        ReadProcessMemory(hProcess, (LPVOID)0x4BA3BF, &four, sizeof(four), 0);
        WriteProcessMemory(hProcess, (PVOID)(five + 0x00 + 2), &five, 3, 0);
        WriteProcessMemory(hProcess, (LPVOID)(six + 0x90 + 3), (LPVOID)&six, 3, NULL);

Вот такой был интернал:

C++:
        VirtualProtect((PVOID)0x4BA3B9, 6, PAGE_EXECUTE_READWRITE, NULL);
        VirtualProtect((PVOID)0x4B3296, 3, PAGE_EXECUTE_READWRITE, NULL);
        *(BYTE*)0x4BA3B9 = 0xE9;
        *(BYTE*)0x4BA3BA = 0xA7;
        *(BYTE*)0x4BA3BB = 0x03;
        memset((PVOID)0x4BA3BC, 0x00, 2);
        *(BYTE*)0x4BA3BF + 0x90;
        memset((PVOID)0x4B3296, 0x90, 3);
Ты снимаешь протекты текущего процесса, а не в том где ты работаешь с памятью.
Используй экстендед функцию, в ней первый параметр это хендл процесса, остальное всё тоже самое.
Да и вообще снимать протекты тут не надо, так что можешь просто удалить VirtualProtect
 
  • Нравится
Реакции: manukhov

RTD

Нестандартное звание
Модератор
391
414

RTD

Нестандартное звание
Модератор
391
414
@DolgorukovGTA @RTD оценку?

C++:
        DWORD one = 0x4BA3B9;
        DWORD two = 0x4BA3BA;
        DWORD three = 0x4BA3BB;
        DWORD four = 0x4BA3BF;
       
        one = 0xE9;
        two = 0xA7;
        three = 0x03;

        ReadProcessMemory(hProcess, (LPVOID)0x4BA3B9, &one, sizeof(one), 0);
        ReadProcessMemory(hProcess, (LPVOID)0x4BA3BA, &two, sizeof(two), 0);
        ReadProcessMemory(hProcess, (LPVOID)0x4BA3BB, &three, sizeof(three), 0);
        ReadProcessMemory(hProcess, (LPVOID)0x4BA3BF, &four, sizeof(four), 0);

        WriteProcessMemory(hProcess, (LPVOID) * (BYTE*)0x4BA3B9, &one, 1 , nullptr);
        WriteProcessMemory(hProcess, (LPVOID) * (BYTE*)0x4BA3BA, &two, 1, nullptr);
        WriteProcessMemory(hProcess, (LPVOID) * (BYTE*)0x4BA3BB, &three, 1, nullptr);
        WriteProcessMemory(hProcess, (LPVOID) * (BYTE*)0x4BA3BF, &four, 1, nullptr);

        WriteProcessMemory(hProcess, (LPVOID) * (BYTE*)(0x4BA3BF +0x90), &four, 1, nullptr);

        const int i = 0x90;
        const void* newi = &i;

        WriteProcessMemory(hProcess, (LPVOID)0x4BA3BC, 0x00, 2, nullptr);
        WriteProcessMemory(hProcess, (LPVOID)0x4B3296, newi, 3, nullptr);
    }
Мдаааа.... Ты опять даже близко не подошел. Все что тебе нужно в моих сообщениях, но ты их не понял и никак не применил(если ваще читал). Код за тебя никто писать не будет, я тебе подсказал все что нужно, а ты продолжаешь пихать отсебятину которая не будет работать даже в теории. Продолжай писать на рандоме и у тебя ничего не получится или попытайся понять что и как работает
 

DolgorukovGTA

Известный
Проверенный
652
345
@DolgorukovGTA @RTD оценку?

C++:
        DWORD one = 0x4BA3B9;
        DWORD two = 0x4BA3BA;
        DWORD three = 0x4BA3BB;
        DWORD four = 0x4BA3BF;
       
        one = 0xE9;
        two = 0xA7;
        three = 0x03;

        ReadProcessMemory(hProcess, (LPVOID)0x4BA3B9, &one, sizeof(one), 0);
        ReadProcessMemory(hProcess, (LPVOID)0x4BA3BA, &two, sizeof(two), 0);
        ReadProcessMemory(hProcess, (LPVOID)0x4BA3BB, &three, sizeof(three), 0);
        ReadProcessMemory(hProcess, (LPVOID)0x4BA3BF, &four, sizeof(four), 0);

        WriteProcessMemory(hProcess, (LPVOID) * (BYTE*)0x4BA3B9, &one, 1 , nullptr);
        WriteProcessMemory(hProcess, (LPVOID) * (BYTE*)0x4BA3BA, &two, 1, nullptr);
        WriteProcessMemory(hProcess, (LPVOID) * (BYTE*)0x4BA3BB, &three, 1, nullptr);
        WriteProcessMemory(hProcess, (LPVOID) * (BYTE*)0x4BA3BF, &four, 1, nullptr);

        WriteProcessMemory(hProcess, (LPVOID) * (BYTE*)(0x4BA3BF +0x90), &four, 1, nullptr);

        const int i = 0x90;
        const void* newi = &i;

        WriteProcessMemory(hProcess, (LPVOID)0x4BA3BC, 0x00, 2, nullptr);
        WriteProcessMemory(hProcess, (LPVOID)0x4B3296, newi, 3, nullptr);
    }
Ты же указатель передаёшь.
 

DolgorukovGTA

Известный
Проверенный
652
345
😭

C++:
        const int i = 0x90;
        const void*i = &i;

        WriteProcessMemory(hProcess, (LPVOID)0x4BA3BC, 0x00, 2, nullptr);
        WriteProcessMemory(hProcess, (LPVOID)0x4B3296, &i , 3, nullptr);
Зачем многоуровневый указатель? И у тебя переменная имеет такой же идентификатор (имя), что и указатель на неё. Обычно к переменным-указателям добавляют "ptr" в конец или "p" в начало.
 

DolgorukovGTA

Известный
Проверенный
652
345
Посмотреть вложение 56066

C++:
       typedef unsigned char BYTE;

        BYTE one = 0xE9;
        BYTE two = 0xA7;
        BYTE three = 0x03;
        BYTE four = (0x4BA3BF + 0x90);

        WriteProcessMemory(hProcess, (LPVOID)0x4BA3B9, &one, 1 , nullptr);
        WriteProcessMemory(hProcess, (LPVOID)0x4BA3BA, &two, 1, nullptr);
        WriteProcessMemory(hProcess, (LPVOID)0x4BA3BB, &three, 1, nullptr);
     
        const int i = 0x90;
        const void* iptr = &i;

        WriteProcessMemory(hProcess, (LPVOID)0x4BA3BC, 0x00, 2, nullptr);
        WriteProcessMemory(hProcess, (LPVOID)0x4B3296, &i , 3, nullptr);


        WriteProcessMemory(hProcess, (LPVOID)(0x4BA3BF + 0x90),&four, 1, nullptr);
Что ты творишь? Я тебе такого не советовал. Передавай в функцию указатель, он берётся при помощи операнда &. Либо же создай переменную-указатель и передавай её.
upd: @T4yz1e, почувствуй разницу на этом примере:
C:
uint8_t number = 8;
uint8_t* pNumber = &number;

printf("%p\n", pNumber); // выведет адрес переменной, на которую ссылается указатель
printf("%i\n", number); // выведет значение переменной
printf("%i\n", *pNumber); // разыменуем указатель, выведет значение
 
Последнее редактирование:

DolgorukovGTA

Известный
Проверенный
652
345
@T4yz1e, небольшой пример для тебя:
C:
#include <stdio.h>
#include <stdint.h>


void f(void* param)
{
    uint8_t* pNumber = (uint8_t*)param; // типизируем указатель
    uint8_t number = *pNumber; // разыменовываем указатель
    printf("%i\n", number);
}


int main()
{
    uint8_t number = 88;
    void* pNumber = (void*)&number; // типизируем указатель
    f(pNumber); // вызываем функцию
    return 0;
}