Reading Memory for Anticheat

di Anonimizzato28427 il
8 risposte
Ciao, io e un mio amico stiamo facendo un tool anticheat, ma abbiamo alcuni problemi..
Volevamo creare una scansione automatica che prende automaticamente tutte le stringhe presenti in tutti gli indirizzi di memoria assegnati a un processo specifico e inserirli in una stringa e quindi filtrarli per vedere se ci sono stringhe di cheat residue tra di loro.
Siamo riusciti a trovare un modo per filtrare rapidamente una stringa, ma non riusciamo a capire come prendere tutte le stringhe di un processo dalla memoria e metterle in una variabile string.... Abbiamo provato con il ReadProcessMemory ma non siamo riusciti
qualcuno sa aiutarci?
Grazie

8 Risposte

  • Beh, dovreste mostrarci cosa avete fatto e quali problemi avete.

    In realtà il codice potrebbe essere anche usato da un "cheat" ... e la cosa non mi piace.
  • Oregon se vuoi posso inviarti il codice su telegram o su email.
  • E comunque ci serve solo leggere non scrivere quindi non si parla di cheat
  • Ti assicuro che dalla lettura alla scrittura il passo è breve. E comunque il codice non va in privato ma in pubblico qui sul forum dove tutti possono rispondere.
  • #include <vector>
    #include <string>
    #include <future>
    #include <iostream>
    #include <algorithm>

    #include <conio.h>
    #include <windows.h>
    #include <tlhelp32.h>

    static int suspicious_strings;

    template <class InIter1, class InIter2>

    void find_all(InIter1 buf_start, InIter1 buf_end, InIter2 pat_start, InIter2 pat_end)
    {
    for (InIter1 pos = buf_start; buf_end != (pos = std::search(pos, buf_end, pat_start, pat_end)); ++pos)
    {
    ++suspicious_strings;
    }
    }

    auto is_valid_info(const DWORD state, const DWORD type) -> bool
    {
    return state == MEM_COMMIT && (type == MEM_MAPPED || type == MEM_PRIVATE);
    }

    auto find_string_locations(const HANDLE process, std::string const &pattern) -> void
    {
    unsigned char *p = nullptr;
    MEMORY_BASIC_INFORMATION info;

    for (p = nullptr; VirtualQueryEx(process, p, &info, sizeof info) == sizeof info; p += info.RegionSize)
    {
    std::vector<char> buffer;
    std::vector<char>::iterator pos;

    if (is_valid_info(info.State, info.Type))
    {
    SIZE_T bytes_read;

    buffer.resize(info.RegionSize);
    ReadProcessMemory(process, p, &buffer[0], info.RegionSize, &bytes_read);
    buffer.resize(bytes_read);

    find_all(buffer.begin(), buffer.end(), pattern.begin(), pattern.end());
    }
    }
    }

    auto is_javaw(const PROCESSENTRY32W &entry) -> bool
    {
    return std::wstring(entry.szExeFile) == L"javaw.exe"; //Chose Process
    }

    BOOL CALLBACK enum_windows_proc(const HWND hwnd, const LPARAM l_param)
    {
    const auto &pids = *reinterpret_cast<std::vector<DWORD>*>(l_param);

    DWORD window_id;
    GetWindowThreadProcessId(hwnd, &window_id);

    for (auto pid : pids)
    {
    if (window_id == pid)
    {
    std::wstring title(GetWindowTextLength(hwnd) + 1, L'\0');
    GetWindowTextW(hwnd, &title[0], title.size());

    if (title.size() == 17) /// es. minecraft 1.7.10
    {
    std::cout << "[#] Finestra trovata: \n";
    std::cout << "[#] PID: " << pid << '\n';
    std::wcout << "[#] Nome finestra: " << title << "\n";
    }
    }
    }

    return TRUE;
    }

    template<typename T, size_t N>
    T * end(T(&ra)[N])
    {
    return ra + N;
    }

    auto reset_console_color(const HANDLE h_console) -> void
    {
    SetConsoleTextAttribute(h_console, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN);
    }

    int main()
    {
    const auto start = std::chrono::system_clock::now();
    const auto h_console = GetStdHandle(STD_OUTPUT_HANDLE);
    const auto snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    std::vector<DWORD> pids;

    PROCESSENTRY32W entry;
    entry.dwSize = sizeof entry;

    if (!Process32FirstW(snap, &entry))
    {
    std::wcout << "Errore";
    return 0;
    }

    int pid;

    do
    {
    if (is_javaw(entry))
    {
    pid = entry.th32ProcessID;
    }
    } while (Process32NextW(snap, &entry));

    pids.emplace_back(pid);

    EnumWindows(enum_windows_proc, reinterpret_cast<LPARAM>(&pids));

    const char *strings[] =
    {
    "Aim Assist" "Auto Clicker"
    };

    std::vector<std::string> bad_strings(strings, end(strings));

    const auto process = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, false, pid);

    SetConsoleTextAttribute(h_console, FOREGROUND_RED);
    std::for_each(bad_strings.begin(), bad_strings.end(), [&](const std::string string)
    {
    std::async(std::launch::async, find_string_locations, process, string);
    });

    if (suspicious_strings > 0)
    {

    std::cout << std::endl << "Trovato ";
    SetConsoleTextAttribute(h_console, FOREGROUND_RED | FOREGROUND_INTENSITY | FOREGROUND_INTENSITY);
    std::cout << suspicious_strings;

    reset_console_color(h_console);

    std::cout << " blacklisted string";
    } else
    {
    SetConsoleTextAttribute(h_console, FOREGROUND_GREEN | FOREGROUND_INTENSITY | FOREGROUND_INTENSITY);
    std::cout << std::endl << "Pare non sia stato possibile trovare stringhe blacklistate all'interno della memoria" << std::endl;
    }

    reset_console_color(h_console);
    const auto diff = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - start).count();

    if (diff < 500)
    {
    SetConsoleTextAttribute(h_console, FOREGROUND_RED);
    std::cout << "Il player ha eseguito il self-destruct recentemente" << std::endl;
    }

    reset_console_color(h_console);
    std::cout << std::endl << "ran application in " << diff << "ms" << std::endl;
    std::cout << std::endl << "Premi un qualunque tasto per uscire dal programma" << std::endl;
    _getch();

    return 0;
    }
  • Questo è il codice che ho cercato di fare per leggere e filtrare ma non funziona, ho gia come filtrare quello che c'è in una stringa, il problema è mettere gli indirizzi di memoria di un processo nella stringa
  • Prima di tutto dovresti postare il codice tra tag CODE nel forum altrimenti non si capisce molto.

    Comunque, ho provato questo (vostro?) codice (con il processo Notepad) e la memoria viene regolarmente letta. Quello che va male è la ricerca delle stringhe "sospette" che NON sono Unicode come invece trovereste all'interno del processo. E poi, un eventuale elenco di stringhe va separato da virgole.

    Quindi dovreste rivedere la parte della ricerca e non l'accesso in memoria.
  • Ok grazie oggi provo a sistemarlo
Devi accedere o registrarti per scrivere nel forum
8 risposte