Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Tworzymy bota, C++, WinApi, Qt


bleblable

Rekomendowane odpowiedzi

Opublikowano

Witam,

publikuję dla was poradnik jak stworzyć bota w C/C++ tak jak pisałem w poprzednim poradniku. Poradnik będzie się składał z 21 części [może więcej ale na pewno nie mniej] i mam nadzieję że każdy rozumny użytkownik forum zrozumie jak się do tego zabrać i co dalej z tym zrobić.

 

 

1. WYMAGANIA:

  • MS Visual Studio 2013 [jeżeli nie masz wykupionej wersji professional to pobierz community, ze względu na plugin Qt],
  • Qt 5.4.1
  • reszta wymagań jak z poprzedniego posta: chęci, rozum, cierpliwość...

 

 

2. STARTUP, KONFIGURACJA:

  • Po zainstalowaniu MSVS i Qt, stwórz sobie jakiś workspace [ np. D:\Workspace ], w którym będą 3 foldery : BUILD, 3RD_PARTY, SOURCE.
  • 3RD_PARTY - skopiuj tam foldery lib, include z głównego folderu Qt.
  • SOURCE - tutaj będzie kod źródłowy.
  • BUILD - tutaj kompilator będzie wrzucał gotowy program.
  • Dodaj ścieżki lib, include modyfikując właściwości projektu. Lub użyj wtyczki Qt vs add-in  aby stworzyć projekt.

 

3. CONTENTS:

  • Wyciągamy potrzebne nam informacje za pomocą WinApi i sprawdzamy czy wszystko działa:
    https://youtu.be/WRKLbvuLEAA
  • Podłączanie bibliotek Qt, ustawianie projektu i tworzenie głównego(?) okna (film zawiera kilka pomyłek/błędów, które były poprawione. niestety ze względu na to iż każdy film jest "kręcony" spontanicznie, takie incydenty będą się czasami zdarzały. :)  ):
    https://youtu.be/Gr27sC-e8Gw

 

INFORMACJE DODATKOWE:

  • Aplikacja znajduje się już na platformie GitHub, wystarczy dołączyć do projektu i zrobić forka.
  • Jeżeli masz zamiar uczestniczyć w "rozwoju" projektu na Gicie, pamiętaj aby przed każdym pushem zrobić pull, ponieważ twoje "poprawki" mógł wprowadzić już ktoś inny.
  • Jeżeli uważasz że Twój commit powinien znaleźć się w głównym branchu, poinformuj mnie o tym wysyłając merge requesta, możesz także wysłać wiadomość e-mail lub pw.
  • Masz pomysł co zrobić dalej, jak rozwinąc ten projekt? Napisz swoje sugestie w poście, pw lub e-mailu, jeżeli pomysł będzie ciekawy to na pewno pojawi się on w projekcie jako "TODO".

Efekty jednego dnia wolnego od pracy :

lWxix4K.png

Chcesz wspomóc produkcję tego bota? Masz doświadczenie w programowaniu modułów, tworzeniu GUI czy skryptowaniu [C#]?

napisz na pw : http://www.mpcforum.pl/user/1285262-bleblable/

Opublikowano

Super, nie mogłem się tego doczekać. Właśnie jestem na etapie obiektowości w C++, przeglądałem gotowe projekty na GitHubie, ale wiele rzeczy jest dla mnie niejasnych, w projektach jest dużo plików i nie jestem jeszcze w stanie tego ogarnąć, wysyłają dużo argumentów do funkcji, jest dużo klas itd.
Czekam na więcej, powodzenia!

Opublikowano

Super, nie mogłem się tego doczekać. Właśnie jestem na etapie obiektowości w C++, przeglądałem gotowe projekty na GitHubie, ale wiele rzeczy jest dla mnie niejasnych, w projektach jest dużo plików i nie jestem jeszcze w stanie tego ogarnąć, wysyłają dużo argumentów do funkcji, jest dużo klas itd.

Czekam na więcej, powodzenia!

 

Niestety C++ jest jezykiem, w którym trzeba tworzyć wiele klas i pisać ogrom kodu. Plusem jest za to większa kontrola nad aplikacją aniżeli w językach wysokopoziomowych. Następne części będą nagrywane z komentarzem, gdzie będę tłumaczył wszystko od początku do końca, tak więc mam nadzieję że ten poradnik pozwoli Tobie i innym osobom z tego forum zrozumieć ten "zapomniany" język. :)

Efekty jednego dnia wolnego od pracy :

lWxix4K.png

Chcesz wspomóc produkcję tego bota? Masz doświadczenie w programowaniu modułów, tworzeniu GUI czy skryptowaniu [C#]?

napisz na pw : http://www.mpcforum.pl/user/1285262-bleblable/

Opublikowano

Niestety C++ jest jezykiem, w którym trzeba tworzyć wiele klas i pisać ogrom kodu. Plusem jest za to większa kontrola nad aplikacją aniżeli w językach wysokopoziomowych. Następne części będą nagrywane z komentarzem, gdzie będę tłumaczył wszystko od początku do końca, tak więc mam nadzieję że ten poradnik pozwoli Tobie i innym osobom z tego forum zrozumieć ten "zapomniany" język. :)

Polemizowałbym na temat czy c++ jest wysokopoziomowym językiem programowania czy niskopoziomowym, można się sprzeczać jednak nie ma nigdzie podanych dokładnych informacji.

8LTfBGw.jpg

Opublikowano

Przepisałem sobie dzisiaj ten kod i zadziałał, spróbowałem później zrobić to samo z MAX_HP, ale wyskakiwały nieprawidłowe wartości. Wyczytałem, że Cipsoft "XORuje" adresy, aby zabezpieczyć się przed botterami. Tego już nie sprawdzałem. Może ktoś to potwierdzić?

 

Cała funkcja getBaseAddress jest dla mnie czarną magią, nigdy nie używałem tych poleceń. 

 

Może polecicie coś na początek? Na pewno poczytać o ReadProcessMemory i WriteProcessMemory.

 

Jeszcze jedna sprawa: jak będziesz robił GUI to będziesz korzystał z Qt Designera czy będziesz kodował okienka ręcznie?

Opublikowano

Przepisałem sobie dzisiaj ten kod i zadziałał, spróbowałem później zrobić to samo z MAX_HP, ale wyskakiwały nieprawidłowe wartości. Wyczytałem, że Cipsoft "XORuje" adresy, aby zabezpieczyć się przed botterami. Tego już nie sprawdzałem. Może ktoś to potwierdzić?

 

Cała funkcja getBaseAddress jest dla mnie czarną magią, nigdy nie używałem tych poleceń. 

 

Może polecicie coś na początek? Na pewno poczytać o ReadProcessMemory i WriteProcessMemory.

 

Jeszcze jedna sprawa: jak będziesz robił GUI to będziesz korzystał z Qt Designera czy będziesz kodował okienka ręcznie?

wartość hp, soul, cap, mana itd są xorowane.

W c# robisz to tak:

(base adres + adres_hp) ^ (base adres + adres_xor)

8LTfBGw.jpg

Opublikowano

Polemizowałbym na temat czy c++ jest wysokopoziomowym językiem programowania czy niskopoziomowym, można się sprzeczać jednak nie ma nigdzie podanych dokładnych informacji.

wikipedia :: Język niskiego poziomujęzyk programowania umożliwiający zapis rozkazów maszynowych za pomocą stosunkowo prostych oznaczeń symbolicznych, np. każdy język asemblerowy jest językiem niskiego poziomu.

Tak C++ jest językiem niskopoziomowym.

 

Przepisałem sobie dzisiaj ten kod i zadziałał, spróbowałem później zrobić to samo z MAX_HP, ale wyskakiwały nieprawidłowe wartości. Wyczytałem, że Cipsoft "XORuje" adresy, aby zabezpieczyć się przed botterami. Tego już nie sprawdzałem. Może ktoś to potwierdzić?

 

Cała funkcja getBaseAddress jest dla mnie czarną magią, nigdy nie używałem tych poleceń. 

 

Może polecicie coś na początek? Na pewno poczytać o ReadProcessMemory i WriteProcessMemory.

 

Jeszcze jedna sprawa: jak będziesz robił GUI to będziesz korzystał z Qt Designera czy będziesz kodował okienka ręcznie?

Tak musisz XOR'ować wartości aby dostać adekwatny wynik. Co do Qt, nie lubię designera ani creatora więc wszystko będzie "kodowane" z użyciem stylowania CSS.

 

wartość hp, soul, cap, mana itd są xorowane.

W c# robisz to tak:

(base adres + adres_hp) ^ (base adres + adres_xor)

XOR na adresach zwróci, dziwny [najprawdopodobniej bezużyteczny] adres pamięci.

Dla przykładu masz wartość a = 00001011 (11) i wartość b = 00000111(7)

Używając operatora bitowego XOR ( c = a ^ b ) dostaniemy wynik 00001100 (12)

Tak więc najpierw pobieramy wartości:

__int32 XOR_VALUE = 0;
__int32 HEALTH_VALUE = 0;

ReadProcessMemory(meHandle, (LPVOID)(baseAddress + XOR), &XOR_VALUE, sizeof(__int32), 0);
ReadProcessMemory(meHandle, (LPVOID)(baseAddress + HEALTH), &HEALTH_VALUE, sizeof(__int32), 0);

__int32 meHealth = HEALTH_VALUE ^ XOR_VALUE;

Jeżeli nawet były by to adresy nie powinieneś używać adresu bazowego, tylko adresu pośredniego:

DWORD HEALTH_ADDR = XOR ^ HEALTH;

__int32 health = 0;

ReadProcessMemory(meHandle, (LPVOID)(baseAddress + HEALTH_ADDR), &health, sizeof(__int32), 0);

Efekty jednego dnia wolnego od pracy :

lWxix4K.png

Chcesz wspomóc produkcję tego bota? Masz doświadczenie w programowaniu modułów, tworzeniu GUI czy skryptowaniu [C#]?

napisz na pw : http://www.mpcforum.pl/user/1285262-bleblable/

Opublikowano

 

wikipedia :: Język niskiego poziomujęzyk programowania umożliwiający zapis rozkazów maszynowych za pomocą stosunkowo prostych oznaczeń symbolicznych, np. każdy język asemblerowy jest językiem niskiego poziomu.

Tak C++ jest językiem niskopoziomowym.

 

Tak musisz XOR'ować wartości aby dostać adekwatny wynik. Co do Qt, nie lubię designera ani creatora więc wszystko będzie "kodowane" z użyciem stylowania CSS.

 

XOR na adresach zwróci, dziwny [najprawdopodobniej bezużyteczny] adres pamięci.

Dla przykładu masz wartość a = 00001011 (11) i wartość b = 00000111(7)

Używając operatora bitowego XOR ( c = a ^ b ) dostaniemy wynik 00001100 (12)

Tak więc najpierw pobieramy wartości:

__int32 XOR_VALUE = 0;
__int32 HEALTH_VALUE = 0;

ReadProcessMemory(meHandle, (LPVOID)(baseAddress + XOR), &XOR_VALUE, sizeof(__int32), 0);
ReadProcessMemory(meHandle, (LPVOID)(baseAddress + HEALTH), &HEALTH_VALUE, sizeof(__int32), 0);

__int32 meHealth = HEALTH_VALUE ^ XOR_VALUE;

Ale to jest chyba logiczne, że do każdej opercji na adresach dodajemy czytanie z pamięci procesu, przynajmniej dla mnie.

Co do c++ - na różnych forach się sprzeczaj, dla mnie można dać ten język jako język pośredni (pomiędzy wysokopoziomowym i niskopoziomowym).

8LTfBGw.jpg

Opublikowano

Kiedy można spodziewać się następnej części poradnika?
A i jeszcze powtórzę pytanie: na co warto zwrócić uwagę przy programowaniu botów - chodzi mi o biblioteki, funkcje. Na forum gdzie urzęduje DarkStar są ludzie, którzy ogarniają dosyć dobrze temat programowania, niekonieczne programowanie botów, ale doświadczenie jakieś już mają, a ja nie mam ani doświadczenia ani wiedzy (bo ja tak na prawdę podstaw nie znam, nie należę do osób, które po napisaniu kalkulatora twierdzą, że znają dobrze C++).

Opublikowano

Kiedy można spodziewać się następnej części poradnika?

A i jeszcze powtórzę pytanie: na co warto zwrócić uwagę przy programowaniu botów - chodzi mi o biblioteki, funkcje. Na forum gdzie urzęduje DarkStar są ludzie, którzy ogarniają dosyć dobrze temat programowania, niekonieczne programowanie botów, ale doświadczenie jakieś już mają, a ja nie mam ani doświadczenia ani wiedzy (bo ja tak na prawdę podstaw nie znam, nie należę do osób, które po napisaniu kalkulatora twierdzą, że znają dobrze C++).

Nie ważne co programujesz, ważne jak się do tego zabierasz. Jeżeli potrafisz napisać kalkulator w C++ na 50 różnych sposobów, to napiszesz też inne bardziej wymagające aplikacje.

Mogę Ci tutaj wypisywać "pierdoły" typu: "zacznij od ... a później zrób ... . po tym powinieneś zrobić .. " ale jest to bez sensu. Najważniejsze to poznać składnie a następnie tworzyć to na co masz ochotę. Dla przykładu tego bota, jeżeli znasz składnie to rozbijasz sobie cały program na "mini zadania" i zaczynasz pisać. W trakcie pisania przychodzi taki moment gdzie nie wiesz jak "TO" zrobić i szukasz wskazówek czy też gotowych rozwiązań aby je później przerobić na potrzeby twojej aplikacji.

W kwestii samych bibliotek czy funkcji, jest tego tak wiele, że nie jestem w stanie wylistować chociażby 10%. Jeżeli obecnie szukasz pracy w tym kierunku to można powiedzieć że szukasz igły w stogu siana. Wysyłałem CV do kilkunastu firm na stanowisko programista C\C++ i pomimo tego że jestem w stanie nauczyć się danej biblioteki czy framework'a w pare dni, to i tak na testach masz zadania w których musisz wykorzystać tą bibliotekę. Na każdym z testów miałem inne biblioteki\framework'i, czyli jak możesz się domyślać nie można jasno określić w jaki sposób powinieneś się zabrać do "nauki", ale polecam zacząć od programowania natywnego pod wybraną platformę [MS Windows, Unix\Linux czy Mac].

 

Kolejna część poradnika będzie nagrana dzisiaj [18.07.2015] lub w poniedziałek [20.07.2015] i wrzucona w ten sam dzień. Będzie "nieco" dłuższa ze względu na przygotowanie środowiska do pracy z Qt, ustawianiem całego IDE oraz napisanie głównego okna aplikacji.

Efekty jednego dnia wolnego od pracy :

lWxix4K.png

Chcesz wspomóc produkcję tego bota? Masz doświadczenie w programowaniu modułów, tworzeniu GUI czy skryptowaniu [C#]?

napisz na pw : http://www.mpcforum.pl/user/1285262-bleblable/

Opublikowano

Rozumiem, dzięki wielkie. Może pisanie bota to rzucanie się na głęboką wodę, powinienem zacząć od prostszych rzeczy. Niemniej jednak czekam na kolejne wersje poradnika :)

Opublikowano

Rozumiem, dzięki wielkie. Może pisanie bota to rzucanie się na głęboką wodę, powinienem zacząć od prostszych rzeczy. Niemniej jednak czekam na kolejne wersje poradnika :)

Ja zacząłem C++ od napisania silnika do gry, więc chyba im "głębiej się rzucisz" tym lepiej :)

Efekty jednego dnia wolnego od pracy :

lWxix4K.png

Chcesz wspomóc produkcję tego bota? Masz doświadczenie w programowaniu modułów, tworzeniu GUI czy skryptowaniu [C#]?

napisz na pw : http://www.mpcforum.pl/user/1285262-bleblable/

Opublikowano

Może chodzi o zniechęcenie się, nie wiem. Na razie nie kumam kiedy i jakie typy przypisywać zmiennym w takich programach.

Co do "typów" zmiennych, to musisz zapamiętać jedno: operujesz w zasadzie na adresach pamięci a nie na "typach i zmiennych". Twój program po odpaleniu ląduje w całości w RAM'ie gdzie jeden adres to jeden bajt, mając świadomość tego, powinieneś myśleć raczej w stylu "ile bajtów to zajmie/zajmuje". Możesz się posługiwać samymi char'ami, co było by nie lada wyzwaniem, ale tak na prawdę w ten sposób to działa:

char some_int[4] = {'0', 'a', 'c' '-'};
__int32 converted_int = (__int32)some_int;

w tym przykładzie zrobiłem inta z 4 bajtów.

Możesz także zapamiętać podstawowe typy danych;

// BYTE 8bit/1byte
BYTE a = '0'; // tak samo jak char a = '0'; może przyjąć wartość od 0 do 255
sizeof(BYTE) == sizeof(char)

// WORD 16bits/2bytes
WORD b = 1337; // tak samo jak single b = 1337; może przyjąć wartość od 0 do 65,535
sizeof(WORD) == sizeof(single)

// DWORD 32bits/4bytes [zwane inaczej double word]
DWORD c = 32168; // tak samo jak __int32 c = 32168; może przyjąć wartość od 0 do 4,294,967,295
sizeof(DWORD) == sizeof(__int32)

Efekty jednego dnia wolnego od pracy :

lWxix4K.png

Chcesz wspomóc produkcję tego bota? Masz doświadczenie w programowaniu modułów, tworzeniu GUI czy skryptowaniu [C#]?

napisz na pw : http://www.mpcforum.pl/user/1285262-bleblable/

Opublikowano

Coś mi zaczyna świtać w głowie, dziękuje.

Zaraz obczajam drugą część poradnika.

 

Jeszcze zapytam tak z ciekawości: czemu akurat Qt? Nic do tego środowiska nie mam, zżera mnie ciekawość :)

Opublikowano

Coś mi zaczyna świtać w głowie, dziękuje.

Zaraz obczajam drugą część poradnika.

 

Jeszcze zapytam tak z ciekawości: czemu akurat Qt? Nic do tego środowiska nie mam, zżera mnie ciekawość :)

Qt tylko dla tego, że jest łatwe. Wyobraź sobie teraz jeżeli poradnik był by robiony w całości w WinApi gdzie żeby narysować główne okno musisz napisać mniej więcej coś takiego:

// PRZYKŁAD ZE STRONY http://www.winprog.org/tutorial/simple_window.html
#include <windows.h>

const char g_szClassName[] = "myWindowClass";

// Step 4: the Window Procedure
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CLOSE:
            DestroyWindow(hwnd);
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
        break;
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wc;
    HWND hwnd;
    MSG Msg;

    //Step 1: Registering the Window Class
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = 0;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = g_szClassName;
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    if(!RegisterClassEx(&wc))
    {
        MessageBox(NULL, "Window Registration Failed!", "Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    // Step 2: Creating the Window
    hwnd = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        g_szClassName,
        "The title of my window",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
        NULL, NULL, hInstance, NULL);

    if(hwnd == NULL)
    {
        MessageBox(NULL, "Window Creation Failed!", "Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    // Step 3: The Message Loop
    while(GetMessage(&Msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}

Tak więc jak widzisz... Qt to po prostu rozsądny wybór.

Efekty jednego dnia wolnego od pracy :

lWxix4K.png

Chcesz wspomóc produkcję tego bota? Masz doświadczenie w programowaniu modułów, tworzeniu GUI czy skryptowaniu [C#]?

napisz na pw : http://www.mpcforum.pl/user/1285262-bleblable/

Opublikowano

Dokończyłem dzisiaj kurs, Qt wydaje się byc na prawdę wporzo.

 

Zastanawiam się jak zaimplementować odczytywanie zmiennej załóżmy HP i Mana, tak aby jej wartości były nie odczytywane co sekundę, ale szybciej. Nie wiem czy nie trzeba będzie użyć volatile i jakiś krótki sleep. Nie wiem też jak wywołać jakieś czary, sama funkcja, która ustalałaby % hp,mp od którego miałby bot healować wydaje się prosta.

Opublikowano

Dokończyłem dzisiaj kurs, Qt wydaje się byc na prawdę wporzo.

 

Zastanawiam się jak zaimplementować odczytywanie zmiennej załóżmy HP i Mana, tak aby jej wartości były nie odczytywane co sekundę, ale szybciej. Nie wiem czy nie trzeba będzie użyć volatile i jakiś krótki sleep. Nie wiem też jak wywołać jakieś czary, sama funkcja, która ustalałaby % hp,mp od którego miałby bot healować wydaje się prosta.

Właśnie ostatnio próbowałem nagrać "prawidłowy" system odczytu danych, ale OBS coś mi szwankował i teraz muszę cofać projekt do ostatniego commita, po czym próbować nagrać jeszcze raz. Niestety nie będzie to odczyt w pętli a "on-demand", czyli tak jak powinno to działać. Weźmy dla przykładu moduł healera:

void Healer::onTimerTick()
{
if(_player->GetHealth() < 100)
//.. coś tam dalej...

unsigned __int32 Player::GetHealth()
{
    unsigned __int32 h = memory_reader->read<__int32>(HEALTH_ADDR);
    h ^= memory_reader->read<__int32>(XOR_ADDR);
    return h;
}

Dzięki tej metodzie cały "silnik"/"rdzeń" bota będzie sprawniejszy i będziemy mogli API, które umożliwi nam pisanie pluginów.

 

Jeszcze się tak spytam z ciekawości, będziesz robił na pakietach czy symulacje ;p?

Będzie jedno i drugie, z większym naciskiem na symulację.

Efekty jednego dnia wolnego od pracy :

lWxix4K.png

Chcesz wspomóc produkcję tego bota? Masz doświadczenie w programowaniu modułów, tworzeniu GUI czy skryptowaniu [C#]?

napisz na pw : http://www.mpcforum.pl/user/1285262-bleblable/

Opublikowano

@bleblable

Zapowiada się fajnie :P

Qt bardzo fajne sam zrobiłem w nim swojego bota, co prawda od strony designu nie jest źle ale od strony kodu... zawsze gdy już rozwinę jakoś sensownie projekt to mam takie myśli "a mogłem to wszystko napisać inaczej" :D

Powodzenia w nagrywaniu. :)

Bot do gry NosTale:


[bOT] NosBota 1.3v

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...