Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Программирование / Programming (https://forum.zone-game.info/forumdisplay.php?f=98)
-   -   Чтение памяти процесса (https://forum.zone-game.info/showthread.php?t=42178)

Shayne 13.03.2017 21:34

Чтение памяти процесса
 
Собственно через ольгу посмотрел адрес и прочитал сколько нужно, тут вроде всё понятно.
ReadProcessMemory(int hProcess, int lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesRead);
Code: C++
Но после перезапуска приложения адрес меняется, чекать каждый раз руками не вариант, как быть?

n3k0nation 13.03.2017 22:56

Re: Чтение памяти процесса
 
Никак. Память читается по виртуальным адресам, а не физическим. В каждом новом процессе месторасположение нужных данных - будет меняться.
Можно сканировать память процесса на наличие нужных бинарных паттернов и таким образом определять требуемый адрес.

Как пример, но для посикса (когда-то давно писал, тащемта, в винде даже удобнее должно быть, без всяких ptrace):
Код:

void processScanMemory(pid_t pid, address_t ** addresses, int count) {
        if (ptrace(PTRACE_ATTACH, pid, NULL, NULL)) {
                perror("Failed attach to process");
                return;
        }

        uint8_t bPattern[] = {
                        0x48, 0x89, 0x97, 0x00, 0x00, 0x00, 0x00, //mov [rdi+offset], rdx
                        0x0f, 0x84, 0x00, 0x00, 0x00, 0x00, //je adr
                        0xf3, 0xc3, 0x00, 0x00 //repz ret
        };

        uint8_t bMask[] = {
                        0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
                        0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
                        0xff, 0xff, 0x00, 0x00
        };
#define patternSize 4*sizeof(uint32_t)
#define dataSize patternSize+sizeof(uint32_t)
        for (int i = 0; i < count; i++) {
                address_t * adr = addresses[i];
                long int start = adr->start;
                long int end = adr->end;

#ifdef DUMP_X
                char filename[128];
                sprintf(filename, "./%ld_%lx-%lx.dump", (long int)pid, start, end);
                FILE * dumpFd = fopen(filename, "w");
#endif

                fprintf(stdout, "Scanning 0x%lx ... 0%lx\n", adr->start, adr->end);

                uint8_t data[dataSize] = {0};
                for (long int current = start; current < end; current += sizeof(int)) {
                        uint32_t word = ptrace(PTRACE_PEEKDATA, pid, (void *) current, NULL);
                        memmove(data, data + sizeof(uint32_t), dataSize - sizeof(uint32_t));
                        *((uint32_t *)&(data[dataSize - sizeof(uint32_t)])) = word;
                        int finded = -1;
                        for(int j = 0; j < sizeof(uint32_t); j++) {
                                int sub = 1;
                                for(int k = 0; k < patternSize; k++) {
                                        if ((data[k + j] & bMask[k]) != bPattern[k]) {
                                                sub = 0;
                                                break;
                                        }
                                }

                                if(sub) {
                                        finded = j;
                                        break;
                                }
                        }

                        if (finded != -1) {
                                for (int a = 0; a < dataSize; a++) {
                                        fprintf(stdout, "%02x ", data[a] & 0xff);
                                }
                                fprintf(stdout, "\n");
                                fprintf(stdout, "Finded pattern on: 0x%lx (phy offset: 0x%lx)", current, current - start - dataSize - finded);
                        }

#ifdef DUMP_X
                        fwrite(&word, sizeof(uint32_t), 1, dumpFd);
#endif
                }

#ifdef DUMP_X
                fclose(dumpFd);
#endif
        }

        if(ptrace(PTRACE_DETACH, pid, NULL, NULL)) {
                perror("Failed deattach from process\n");
        }
}


VOLKyiv 17.05.2017 21:35

Re: Чтение памяти процесса
 
Смотря какое значение, если это к примеру деньги в игре, они находятся в какой-то структуре, эта структура создается кем-то. Можно найти статический адресс и от него отталкиватся, чтобы менять значение денег. К примеру:
PHP код:

LPDWORD gameAddr = (LPDWORD)0x12345678;
LPDWORD playerAddr = (LPDWORD)((LPDWORD)*(gameAddr 3));
LPDWORD moneyAddr = (LPDWORD)((LPDWORD)(*playerAddr) + 8);
*
moneyAddr 5000

Но лучше всё это делать с помощью структур. Чтобы не запутаться.


Текущее время: 00:05. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot