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

[tut][c++][c++/cli]operacje w pamięci programu czyli wstęp do zaawansowanego bota


Dubler

Rekomendowane odpowiedzi

Opublikowano

Na początku zacznę tym, iż jest to mój pierwszy tutorial, a talentu humanistycznego nie mam wiec przepraszam za wszelkie błędy. Znaczną część tego co umiem, nauczyłem się na przykładach więc moje słownictwo może być nieścisłe lub nawet "z dupy wzięte". Przede wszystkim liczy się dla mnie żeby pomóc komuś kto też będzie chciał zacząć pisanie botów/trainerów. Wiedzę zdobytą z tego zakresu spożytkowałem niedawno pisząc bota do Tibii, więc będę właśnie na niej opierał większość przykładów.

 

1. Wstęp

Co to są operacje na pamięci? Żeby dokładnie to zrozumieć warto by poznać choć minimalnie jak taka pamięć działa, ale postaram się wytłumaczyć to bez zanudzania was zbytnio na ten temat.

Generalnie pamięć programu składa się z drobnych "komórek" które przybierają różne wartości. Każdy program ma takie "komórki" w których sobie przechowuje różne informacje. I co nas to obchodzi? A no to, że czytając odpowiednią "komórkę" programu możemy przekazać naszemu botowi ile przykładowo mamy hp. To już na pewno dobry wstęp, bo możemy sobie np procedurę żeby bot nas uleczył tylko wtedy kiedy hp będzie mniejsze niż ileś tam. Możemy także nadać za pośrednictwem programu takiej zmiennej wartość, ogranicza nas tylko typ danej zmiennej (a mianowicie jej pojemność). Oczywistym jest że short'owi nie nadamy wartości miliarda.

 

2. Co będzie nam potrzebne

-znajomość składni i podstawowych bibliotek c++

-środowisko i kompilator do wyżej wymienionego języka

 

-handle procesu

-adres "komórki"

 

Co to jest handle? Jest to unikalny dla włączonego w danej chwili programu uchwyt pozwalający komputerowi rozróżnić że chcemy wykonywać operacje np, na Metinie a nie na kalkulatorze czy gg.

Jak pozyskać adres czy handle wyjaśnię w dalszej części.

 

3. Jak zdobyć odpowiedni adres zmiennej.

Najprościej jest to zrobić cheat enginem. Zmienne mogą być mniej lub bardziej zabezpieczone, większość jednak nie jest. Więcej możecie poczytać tu:

http://wiki.cheateng...Memory_Scanning

Jeśli nie wiesz jak szukać adresu szukaj pomocy w dziale cheat engine.

 

Każdy adres cheat-engine'owy składa się z adresu bazowego oraz adresu właściwego. Adres bazowy jest to adres który system dodaje do właściwego. W Windowsie XP jest to zawsze stały adres (0x400000), W nowszych systemach jest on generowany przy każdym włączeniu inny.

 

Dla Tibii 8.6 adres Magic Levela wygląda tak:

Tibia.exe+23FE84

oznacza to że do adresu bazowego (Tibia.exe) dodawany jest adres właściwy: 0x23FE84

 

5. Wreszcie jakiś kod.

Czas przystąpić do programowania właściwego. Najlepiej będzie chyba jak po prostu wkleję kod i go objaśnię. Będzie to przykładowy kod dla Windowsa XP.Jak zdobyć base address możesz przeczytać w "Suplemencie I" post niżej.

 


#include <Windows.h>//biblioteka potrzebna do operacji na pamięci
#include <iostream>
using namespace std;
int main()
{
HWND hwnd;
DWORD ID;
DWORD rw = 0;
HANDLE handle;

int a;
int b = 100;
unsigned int adres = 0x400000 + 0x23FE84; // base_address + adres właściwy

//szukamy handle dla Tibii
hwnd = FindWindow( NULL, "Tibia" );

GetWindowThreadProcessId( hwnd, & ID );
handle = OpenProcess( PROCESS_ALL_ACCESS, false, ID );

// mamy już handle, czas zacząć długo wyczekiwaną operacje (w tym przypadku odczytywanie Magic Levela)

ReadProcessMemory( handle, LPCVOID( adres ), & a, sizeof( a ), & rw );

cout << "Twoj Magic Level to: " << a << endl;

cout << "Podaj wartosc do zmienienia: ";
cin >> b;

//nadajemy nową wartość zmiennej
WriteProcessMemory( handle, LPVOID( adres ), & b, sizeof( int ), & rw );

//koniecznie "rozluźniamy" uchwyt programu
CloseHandle( handle );

getchar();
return true
}

 

W ten oto sposób napisaliśmy "trainera" który podmieni nam nasz magic level na fakeowy który zadeklarujemy. To tylko przykładowy i praktycznie bezużyteczny kod (chyba że ktoś chce sobie pamiątkowego screen shota cyknąć), ale dość dobrze ukazuje o co tu chodzi.

 

4. Zakończenie

I to już koniec. Myślę że nie ma co więcej tłumaczyć kodu bo jest dość przejrzysty. Dziękuje za poświęcenie kilku minut czasu żeby przeczytać moje "wypociny". Przepraszam że poradnik jest troszkę "urwany", ale nie mam już siły dalej się produkować. Jeśli znowu najdzie mnie ochota na bezinteresowne pomaganie nowym to go bardziej rozwinę. W razie braków w wiedzy przeczytaj suplement(y) poradnika, przejrzyj odnośniki do informacji które podałem, lub po prostu googlaj (od tego głowa nie boli). Miłego programowania i niech spójność kodu będzie z wami :)

 

PS: C++/Cli to moim zdaniem nie najlepszy język do pisania czegokolwiek a już szczególnie botów. Nawet przy dobrym kodzie zdarzają się wycieki pamięci, formy nie są zbyt płynne. Generalnie nie polecam i sugeruję użycie C#/QT/VB/ w ostateczności Javy. Jestem w trakcie pisania bota w tym języku i niestety uważam za wielki gigantyczny błąd iż go wybrałem ale z czystego lenistwa nie chce mi się przepisywać :)

exKVR.png

c++, c++/cli, php, js, css3, lua, au3 and others...

 

Pomoc dla newbich w wymienionych wyżej językach, pisanie botów do Tibii - pisz na gg, może się dogadamy :)

Opublikowano

Suplement I: Jak wyciągnąć base address:

Jeśli korzystamy z CLR (Common Language Runtime czyli projekt w c++/cli) to sprawa jest banalna:

 

 

[size=3]Process^ procesik = Process::GetProcessById(sPid); // process id[/size]
[size=3]HWND hWnd= (HWND)procesik->MainWindowHandle.ToPointer(); // uchwyt używany między innymi do wysyłania klawiszy poprzez sendkey
DWORD base_address = procesik->MainModule;

Przy okazji pokazałem jak wyciągać hwnd czyli inny rodzaj uchwytu służący przede wszystkim do symulacji klawiatury i myszki.

W tym przykładzie zrobiłem szukanie procesu po jego ID ale równie dobrze można zrobić po name. Więcej tutaj:

http://msdn.microsoft.com/en-us/library/z3w4xdc9.aspx

 

Dla C++ znalazłem taką funkcje:

#pragma comment( lib, "psapi" )
DWORD GetModuleBase(HANDLE hProc, string &sModuleName) //pierwszy parametr to HANDLE, drugi to nazwa modułu (np. "Tibia.exe")
{
HMODULE *hModules;
char szBuf[50];
DWORD cModules;
DWORD dwBase = -1;
//------
EnumProcessModules(hProc, hModules, 0, &cModules);
hModules = new HMODULE[cModules/sizeof(HMODULE)];
if(EnumProcessModules(hProc, hModules, cModules/sizeof(HMODULE), &cModules)) {
 for(int i = 0; i < cModules/sizeof(HMODULE); i++) {
	 if(GetModuleBaseName(hProc, hModules[i], szBuf, sizeof(szBuf))) {
	 if(sModuleName.compare(szBuf) == 0) {
		 dwBase = (DWORD)hModules[i];
		 break;
	 }
	 }
 }
}
delete[] hModules;
return dwBase;
}

Funkcja nie moja ale sprawnie działa :)

 

Teraz już wiesz wszystko co Ci potrzebne do tworzenia botów i trainerów. Miłej zabawy. :-)

 

 

Post być może będzie aktualizowany

exKVR.png

c++, c++/cli, php, js, css3, lua, au3 and others...

 

Pomoc dla newbich w wymienionych wyżej językach, pisanie botów do Tibii - pisz na gg, może się dogadamy :)

  • 3 tygodnie później...
Opublikowano

Niezły tutorial, dopiero uczę się c++ ale mam zwyczaje z PHP wyuczone, a to nawet podobne języki. Tylko jak w C++ wywołać funkcję? Tak jak w php:?

 

baza = GetModuleBase(handle, "nazwaokienka.exe");

(mam zdefiniowane na poczatku etc...)

 

Czy jakoś inaczej?

space-core-o.gif

Opublikowano
DWORD baza = GetModuleBase(handle, "nazwaokienka.exe");

exKVR.png

c++, c++/cli, php, js, css3, lua, au3 and others...

 

Pomoc dla newbich w wymienionych wyżej językach, pisanie botów do Tibii - pisz na gg, może się dogadamy :)

Opublikowano

Ogolnie fajnie i na plus, ale niestety w wiekszosci gier sieciowych sie nie sprawdzi z powodu hackshieldow. Proces albo nie zostanie w ogole znalezniony, tj. uchwyt, albo przy probie otwarcia zostanie wywalony exception. Jedyna obrona przed to 'scalenie' sie pamiecia wykonywalna procesu przez np. dll inject, ale to juz wyzsza szkola ;) No i od visty istnieje cus takiego jak ASLR czyli w skrocie losowosc adresu bazowego modulu.

 

Poczatkujacym sie przyda ;)

Opublikowano
Ogolnie fajnie i na plus, ale niestety w wiekszosci gier sieciowych sie nie sprawdzi z powodu hackshieldow. Proces albo nie zostanie w ogole znalezniony, tj. uchwyt, albo przy probie otwarcia zostanie wywalony exception. Jedyna obrona przed to 'scalenie' sie pamiecia wykonywalna procesu przez np. dll inject, ale to juz wyzsza szkola ;) No i od visty istnieje cus takiego jak ASLR czyli w skrocie losowosc adresu bazowego modulu.

 

Poczatkujacym sie przyda ;)

Chyba po to dalem base address nie?

 

Jak hackshielda obejsc w necie mozna znalesc

exKVR.png

c++, c++/cli, php, js, css3, lua, au3 and others...

 

Pomoc dla newbich w wymienionych wyżej językach, pisanie botów do Tibii - pisz na gg, może się dogadamy :)

Opublikowano

Chyba po to dalem base address nie?

 

Jak hackshielda obejsc w necie mozna znalesc

 

Teraz jest HS Pro, którego dosłownie nie da się obejść, da się włączyć cheaty jedynie przez injectowane DLL'ki w assemblerze + C++.

space-core-o.gif

Opublikowano

Kpisz sobie teraz ;p na c++ nie konczy sie swiat. Rownie dobrze moze byc C# czy dowolny inny jezyk w ktorym mozna dllki pisac...

exKVR.png

c++, c++/cli, php, js, css3, lua, au3 and others...

 

Pomoc dla newbich w wymienionych wyżej językach, pisanie botów do Tibii - pisz na gg, może się dogadamy :)

Opublikowano

Moze i jak obejsc jest, ale co z tego jak to sa stare dane. Nowa wersja hackshielda ma juz duzo wiecej selfcheckow i zlamanie tego nie jest juz takie proste. Poza tym sprobuj napisac bypasser w c#, ciezko co? C++ daje wieksze mozliwosci manipulacji pamiecia procesu, np. przez wstawki asm. Z tego co wiem c# jest tak samo jak java sprowadzany do postaci bajtkodu i wykonywany w obrebie wirtualnego srodowiska, co zapewnia mu pewna przenosnosc.

 

Jak wiemy z c/c++ tak nie jest i dlatego wszelkie bypassy, hacki, exploity sa pisane w tych jezykach. Czasami w innych, ale rzadko.

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...