Trainer do gry.

smail000

Użytkownik
Dołączył
Lipiec 10, 2010
Posty
5
A więc chodzi mi o to aby ktoś napisał coś w tym stylu. Program po odpaleniu masz tabelkę do wpisania a i przycisk który to zmienia (zaraz napisze więcej o tym przycisku) b. A konkretnie program który bedzie zmieniał wartość z 0 na 5 w pamięci programu. Adress to np 0020046. I nie piszcie ,ze mam zajrzeć w jakieś poradniki bo w nich nic o tym jeszcze nie wyczytałem. A chciał bym zobaczyć jak to wszystko wygląda. Narazie potrafie tylko kalkulator w konsoli napisać w DeV C++.

Więc proszę o wyrozumiałość i chęci do pomocy.Dziękuje.
 

grzonu

Były Moderator
Dołączył
Grudzień 26, 2006
Posty
1390
To jak sie nauczysz wiecej to wróc.
Powiem ci ze funkcje WriteProcessMemory twoim przyjacielem. Jak nie umiesz tego zrobic to znak ze musisz jeszcze sie pouczyc.
 

5.56

Użytkownik
Dołączył
Luty 1, 2010
Posty
102
Że mi się nudzi to odpiszę troszkę dłużej:
Firstly, żeby dostać się do procesu masz dwie drogi,
Pierwsza:
FindWindow - czyli szukamy uchwytu do okienka po tytule aplikacji w np.taskmgr
GetProcessId - znajdujemy numerek tejże aplikacji
OpenProcess - z id robimy uchwyt procesu, żeby przeskoczyć ten schodek potrzeba praw administratora(vel "uruchom jako administrator")
Droga druga:
CreateProcess - odpalamy proces od początku, KONIECZNIE podając strukturę PROCESS_INFORMATION!
...I to właściwie tyle, PROCESS_INFORMATION ma membera o fajnej nazwie hProcess :D

Same zapisywanie do procesu? Prościutkie:

VirtualProtectEx - jeżeli atakujemy obszar który nie ma praw do zapisu
WriteProcessMemory - nazwa mówi sama za siebie : DDD

ALE na koniec postraszę trochę - jesteśmy trochę udupieni jeżeli gra ma zabezpieczenie zwane DMA(Dynamic Memory Allocation), czyli wszystko pracuje na pointerach wolololo
But don't worry, można(wszystko można, trzeba mieć tylko dobre buty) to obejść, na chama to nopując opkoda który się do naszego adresu odwołuje(wystarczy wrzucić na to miejsce 0x90,hehe), jeżeli jesteśmy bardziej ambitni i za każdym razem chcemy mieć adres to robimy taki trik, że w miejscu gdzie w rejestrze mamy wskaźnik na nasz adres, robimy skok do wcześniej zainicjalizowanego codecave który tenże adres wyrzuci, albo do określonego miejsca w pamięci z którego sobie to kulturalnie wrzucimy do pointera albo wypisze do pliku, a potem nasz trainer to odczyta.. xD
 

smail000

Użytkownik
Dołączył
Lipiec 10, 2010
Posty
5
Dobra troszke już wiem. A czy ktoś by mi napisał kod programu z ww. funkcjami? Chciał bym zobaczyć jak to zastosować w praktyce. Tak jak pisałem na początku.
 

grzonu

Były Moderator
Dołączył
Grudzień 26, 2006
Posty
1390
2 sprawy:

- OpenProcess nie potrzebuje praw admina o ile otwierasz proces nalezacy do tego samego usera co ty.
- Co do dymanicznej alokacji to zwykle zmienna ktora przechowuje adres pointera ma staly adres. Jesli mowisz tu o mechanizmie ASLR w Windowsie to robi sie to tak ze znajduje sie na liscie modulow procesu jego glowny module(to co zwraca GetModuleHandle(0)) i dodaje do tego RVA tego adresu w pamieci.
 

5.56

Użytkownik
Dołączył
Luty 1, 2010
Posty
102
Kod:
/* --------- TUTORIAL: Making your first Trainer -------- */
/* --------- by Anonymous - posted on mpgh.net   -------- */

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


int stamina;    // will store the stamina value

bool dostamina = false;        // determines if user activated stamina freezing

LPVOID stamina_addr =    (void*) 0x007F1110;        // memory address of the stamina value in the WarRock process

void screen()    // output
{
    system("cls");    // clear the screen
    printf("Hello World! This is my first WarRock trainer!  \n\n");
    
    if(dostamina) printf("[1] - freeze stamina [ENABLED]\n");    // if user enabled stamina freeze, let him know!
    else printf("[1] - freeze stamina [disabled]\n");            // same if it's disabled
}

int main(int argc, char* argv[])
{    
    HANDLE hProcessSnap;    // will store a snapshot of all processes
    HANDLE hProcess = NULL;    // we will use this one for the WarRock process
    PROCESSENTRY32 pe32;    // stores basic info of a process, using this one to read the ProcessID from
    
    hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );    // make process snapshot

    pe32.dwSize = sizeof( PROCESSENTRY32 );        // correct size

    Process32First(hProcessSnap, &pe32);    // read info about the first process into pe32

    do    // loop to find the WarRock process
    {        
        if(strcmp(pe32.szExeFile, "WarRock.exe") == 0)    // if WarRock was found
        {
            hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);    // open it, assigning to the hProcess handle
            break;    // break the loop
        }
    }
    while(Process32Next(hProcessSnap, &pe32));    // loop continued until Process32Next deliver NULL or its interrupted with the "break" above

    CloseHandle( hProcessSnap );    // close the handle (just fuckin do it)

    if(hProcess == NULL)    // self explanatory tbh
    {
        printf("WarRock not found\n\n");
        getch();    // wait for a key press. otherwise the app will just close so fast when the process is not found, you wont know wtf happened.
    }
    else
    {
        screen();    // print the display
        
        char key = ' ';    // make a key variable to store pressed keys
        
        while(key != VK_ESCAPE)    // loop until user presses Escape
        {
            
            if(kbhit())        // if a key was pressed
            {
                key = getch();    // it is saved into "key"

                switch(key)        // here the commands are handled depending on the key that was pressed
                {                // case '1': ... break;  case '2': ... break; and so on
                case '1':
                    dostamina = !dostamina;        // flip the dostamina value true<->false to enable/disable it
                    ReadProcessMemory(hProcess, stamina_addr, &stamina, 4, NULL);    // read the stamina value from the memory into the "stamina" variable
                    break;            
                }

                screen();    // print the display after each key press

            }

            if(dostamina)    // if stamina freeze is activated
                WriteProcessMemory(hProcess, stamina_addr, &stamina, 4, NULL);    // write the stamina value that was saved before with the key press into memory
        }

        CloseHandle(hProcess);    // close the handle
        
    }

    return 0;    // THE END
}

@Grzonu:
Co do pierwszego to może i racja, osobiście takie zdanie wyniosłem po zabawie z aplikacją która potrzebuje zgody UAC aby wystartować >.>
A co do tego drugiego - huh, i owszem, ma stały adres, ale na początek(tj.z tego co i ja próbowałem) - łatwiej zanopować jakiś zuy opkod aniżeli dostać się do tego pointera(mi w każdym razie kiepsko te pointery wychodziły ;<). Ale taka technika(czyt.skakanie po pointerach) jest zainplementowana chociażby w CE,heh.


Swoją drogą jeżeli już jesteśmy w temacie gamehackingu - z jakiej okazji udupili WOGH? Toć oni nie wciskali SUPERVIPTRAINERPACK za 20$ jak mpgh oO
 

grzonu

Były Moderator
Dołączył
Grudzień 26, 2006
Posty
1390
Nie wiem o co ci chodzi w ostatnich 2 linjkach twojej wypowiedzi ale to raczej offtop.

Nie powiedzialbym ze latwiej zanopowac jakis fragment kodu. Jesli mamy jakies wskazniki ktore wskazuja na to pamiec to jest to duzo lepsza metoda. A modyfikacja kodu to juz ostatecznosc. Bo np. aplikacja moze wykrywac modyfikacje kodu a wtedy masz dodatkowa robote zeby to wylaczyc.
 

5.56

Użytkownik
Dołączył
Luty 1, 2010
Posty
102
I owszem, łatwiej i użyteczniej wziąć sobie pointer i z niego korzystać, ale z punktu widzenia smaila chyba będzie łatwiej wrzucić te 0x90 nawet kilka razy i udupić dekrementację amunicji czy czego tam sobie jeszcze wymyślimy ;x

Aplikacja wykrywająca modyfikację kodu? Okej, ale zacznijmy od tego że mówimy o gamehackingu ograniczającego się do gier SP, gdzie trainery z opcją "unlimited hp"(jak to jest zrobione? : D) to codzienność,a z biegiem czasu i umiejętności...Bypassy w sieci znaleźć można, a co!
 

grzonu

Były Moderator
Dołączył
Grudzień 26, 2006
Posty
1390
Moze jak najdzie mnie wena to nasrobie kawalek kodu i dam ci binarke zebys ja scrackowal tak zeby nie wykryla modyfikacji kodu. Co jak kod bedzie sie w locie deszyfrowywal i szyfrowal spowrotem. Jak do gry wejda drivery ?
 

5.56

Użytkownik
Dołączył
Luty 1, 2010
Posty
102
Znając życie i tak nie dam rady, ale z ciekawości mogę spróbować : D
A drivery...no cóż, podobno wszystko da radę obejść, mimo to ja się na tym ni cholery nie znam xD
 

grzonu

Były Moderator
Dołączył
Grudzień 26, 2006
Posty
1390
racja wszystko sie da. Ale wlasnie trzeba wybierac mozliwosc jak najlatwiejsza ale i jednoczescnie najskuteczniejsza. Wiec jesli zanopowanie kilku bajtow jest skuteczne ale obejscie zabezpieczen zeby moc to zrobic juz nie to chyba lepiej skozystac z pointerow.
 
Do góry Bottom