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] Dll Injection - W Praktyce


Rekomendowane odpowiedzi

Opublikowano

Witam, opiszę wam jedną z technik wykonania naszego kodu w kontekście innego procesu.

Dziś zajmiemy się wstrzykiwaniem dll'ki ( DLL Injection ).

 

W tym celu będziemy potrzebować :

 

- kompilatora c++,

- klienta Tibi,

- trochę wolnego czasu.

 

1.Opis metody

 

Najpierw musimy napisać bibliotekę dll w której to znajdzie się nasz kod.

Następnie napiszemy injectora który wstrzyknie naszą dll do procesu.

 

 

2. Wykonanie

 

1. Tworzenie DLL

Nasza dll, na potrzeby tego kursu, nie będzie robiła zbyt wiele, gdyż nie taki jest cel tego tuta.

Na razie wystarczy nam prosta funkcja MessageBox.

 

 

#include <windows.h>


BOOL WINAPI
DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) 
{
     if(fdwReason==DLL_PROCESS_ATTACH) 
     {

        MessageBox(0,"Działa","CG",0);          

     }

return TRUE;
}

 

Co my tu mamy ?

 

Na początku ofc załączamy biblioteki.

 

Następnie tworzymy funkcje DllMain.

Funkcja DllMain nie wiele się różni od zwykłego main'a, jest wywoływana za każdym razem gdy dll jest ładowana

i gdy jest zakańczana.

 

W parametrze fdwReason jest przekazywana informacja o tym czy dll jest ładowana czy jest zakańczana.

 

Jeżeli Dll jest ładowana ( DLL_PROCESS_ATTACH ) to ma nam wywołać MessageBox'a.

 

Dobrze, Dll'elke już mamy.

 

Teraz czas na nieco trudniejsze zadanie. Czas na :

 

 

2. Pisanie Injectora

Nasz Injector będzie :

 

  • Otwierał pamięc procesu.
  • Rezerwował miejsce na nazwe naszej dll i wpisywał je.
  • Tworzył nowy wątek który załaduje naszą dll i w rezultacie wykona nasz kod w kontekście danego procesu, w tym przypadku Tibi.

 

 

Kod :

#include <windows.h>
#include <iostream>
using namespace std;

int main()
{
   DWORD pid;
   cout << "PID : ";
   cin >> pid;


   HANDLE hproc = OpenProcess(PROCESS_ALL_ACCESS,0,pid);

   LPVOID adr = 
   VirtualAllocEx (
                   hproc,
                  (LPVOID)0,
                  (SIZE_T)0x1000,
                  MEM_COMMIT | MEM_RESERVE,
                  PAGE_EXECUTE_READWRITE
                  );

   WriteProcessMemory (hproc, adr, "coding_gods.dll",256,NULL);

   HANDLE hthread = CreateRemoteThread 
   (hproc,
    NULL,
    0,
    (LPTHREAD_START_ROUTINE)
    GetProcAddress(GetModuleHandle("kernel32"),"LoadLibraryA"),
    adr,
    0,
    NULL);

   CloseHandle(hthread);
   CloseHandle(hproc);
   cout <<  "code-gods.org\n";
   cin.get();
   cin.get();
}

 

Najpierw pobieramy PID procesu do którego chcemy wstrzyknąc dll :

 

pida.png

 

 

Następnie otwieramy proces po jego PID'dzie i zapisujemy uchwyt tego procesu do zmiennej hproc.

Ja tutaj ustawiłem prawa dostępu PROCESS_ALL_ACCESS ale przy poważniejszych projektach należy zawsze dawac tylko te prawa które naprawde potrzebujemy. Więcej informacji :

msdn

msdn#1

 

Następnie alokujemy pamięc, jak widac używamy tu uchwytu do procesu który otworzyliśmy. Ta funkcja zwraca nam adres pierwszego bajtu zarezerwowanej pamięci.

Więcej informacji :

msdn

 

Kolejnym krokiem będzie zapisanie nazwy dll'ki, używamy do tego funkcji WriteProcessMemory.

Zauważcie że wpisujemy naszą nazwe do zarezerwowanego wcześniej fragmentu pamięci.

Więcej informacji :

msdn

 

II przechodząc do sedna sprawy, tworzymy nowy wątek. Pierwszy argument to uchwyt do procesu w którym utworzony zostanie nowy wątek, następnie ustawiamy atrybuty wątku, dajemy defaultowe, rozmiar stosu też ustawiamy jako domyślny.

4 parametrem będzie adres początkowy naszego wątku.

My chcemy załadowac dll, więc musimy dac tutaj adres LoadLibrary.

Jak go znaleźc ? Z tego powodu że ta funkcja jest absolutnie potrzebna do działania aplikacji jest ona na samym początku.

I w każdym procesie jest ona w tym samym miejscu. Więc wystarczy pobrać adres tej funkcji w naszym procesie i robiąc to automatycznie mamy adres tej funkcji we wszystkich procesach.

 

Ok, następnym parametrem będzie parametr do funkcji LoadLibrary.

LoadLibrary potrzebuje tylko nazwy naszej dll.

Więc podajemy adres do którego wcześniej tę nazwę wpisaliśmy.

Więcej informacji :

msdn

 

Na końcu standardowo zamykamy uchwyty.

 

Teraz zmieniamy nazwę dll na "coding_gods.dll" i kopiujemy ją wraz z injectorem do folderu tibi.

 

Efekt :

 

tibiinjection.png

 

Zauważcie że nasz injector stał się uniwersalny ! Wystarczy podać PID dowolnego procesu !

Należy jednak pamiętać że niektóre programy mają zabezpieczenia przed tego typu ingerencją w ich pamieć.

 

Do zobaczenia wkrótce !

 

Zabraniam kopiowania i rozpowszechniania bez mojej zgody

 

 

Orginał : coding-gods.org

liczylem na barce lecz ona niemogla wygrac.

Przez kibicow ktorzy przy rzutach roznych wolnych swiecili w messiego laserami

Opublikowano

Może być ale nie jest napisane jak skompilować dll'kę więc początkujący mogą tam się wyłożyć ;)

RAsfepN.png
Opublikowano

I jeszcze nie napisałem jak zainstalować tibie ;/ Kurde, ten tut jest tylko dla bardzo zaawansowanych . Sorry !

liczylem na barce lecz ona niemogla wygrac.

Przez kibicow ktorzy przy rzutach roznych wolnych swiecili w messiego laserami

Opublikowano

Ten tut jest tylko po to, żeby zostały ściągnięte %% ;]

 

Tibia działa też pod Linuksem, a tut jest tylko pod WinApi, więc brakuje też info, że pod linuksem nie działa.

Ludzie mogą się pogubić...

Ta sygnatura jest pusta.

Opublikowano

Jupi jestem w 10% i w 1% który by w ogóle wiedział o czym tu mowa:d

chyba też zainteresuje się czymś innym niż autoit mozna w ten sposób np wysyłać polecenia np cos ala send("{up}") itd??

Do
$wiek+=1
Until ŻycieGetMsg() = -3

zbieram +

Opublikowano

Myśle że wygląda to trochę inaczej niż sobie to wyobrażasz.

 

Można by np. zrobic hooka na np. GetAsnycKey czy z czego ta gra korzysta i zmieniac zwracaną wartosc na tą przez nas podaną.

 

He, to nawet dobry pomysł, ide to wyprubowac ;P

liczylem na barce lecz ona niemogla wygrac.

Przez kibicow ktorzy przy rzutach roznych wolnych swiecili w messiego laserami

Opublikowano

WAŹNE :

DLL nalezy kompilować kompilatorem języka C !

liczylem na barce lecz ona niemogla wygrac.

Przez kibicow ktorzy przy rzutach roznych wolnych swiecili w messiego laserami

Opublikowano

Witam

 

Mam błędy przy kompilacji dll.

 

[Linker Error] undefined reference to 'WinMain@16'
ld returned 1 exit status

- Czy powodem tego jest to, że używam kompilatora Dev-C++ ?

- Jeżeli tak to czy mógłbyś dodać listing pod ten kompilator albo wyjaśnic jak poprawnie skompilować dll?

 

Z góry dzięki.

Opublikowano

Witam

 

Mam błędy przy kompilacji dll.

 

[Linker Error] undefined reference to 'WinMain@16'
ld returned 1 exit status

- Czy powodem tego jest to, że używam kompilatora Dev-C++ ?

- Jeżeli tak to czy mógłbyś dodać listing pod ten kompilator albo wyjaśnic jak poprawnie skompilować dll?

 

Z góry dzięki.

 

Skompiluj do kodu obiektowego kompilatorem gcc a potem użyj dllwrap

RAsfepN.png
Opublikowano

nie, nie trzeba się tak męczyć.

 

W dev-cpp dajesz nowy projekt i tu wybierasz typ projektu DLL.

Następnie wybierasz język C i możesz zaczynać.

 

Ja też pisałem to w środowisku dev-cpp i używałem standardowych kompilatorów. Więc jeśli zastosujesz to co Ci napisałem nie powinno być problemów.

liczylem na barce lecz ona niemogla wygrac.

Przez kibicow ktorzy przy rzutach roznych wolnych swiecili w messiego laserami

Opublikowano

Fajnie się wszystko kompiluje ale masz mały błąd. Tam gdzie jest funkcja main w kodzie od injectora nie dałeś klamry na końcu :)

GrottyCracker22.png
Opublikowano

Dzięki !

 

Fixed ;)

liczylem na barce lecz ona niemogla wygrac.

Przez kibicow ktorzy przy rzutach roznych wolnych swiecili w messiego laserami

  • 4 miesiące temu...
Opublikowano

To ja się podepnę pod temat w pytaniem nieco innym

 

za pomocą DLLInjection można wywołać funkcje zahaczonej aplikacji, np. niech będzie to X gra w której da się otworzyć mapę przywołując funkcję _MapOpen();

 

Potrzebuję informacji jak znaleźć:

* Bazowy adres funkcji (mam IDA Pro i OllyDbg na dysku)

* Parametry funkcji, oraz ich typ

Opublikowano
Bazowy adres funkcji (mam IDA Pro i OllyDbg na dysku)

 

Nie ma uniwersalnej reguły, która do tego doprowadzi. Musisz szukać "punktów odniesienia", logicznego działania funkcji. Szukaj stringów, które może ona wypisywać/wywoływać, API, sekwencje kodu. IDA i olly w zupełności Ci do tego wystarczy.

 

Parametry funkcji, oraz ich typ

Parametry mogą być zależne od konwencji wywołania funkcji. Programy skompilowane w C++ mają głównie funkcje z konwencją cdecl (w vc++ to jest standardowe ustawienie, można zmienić). Ta konwencja charakteryzuje się odkładaniem argumentów na stos od końca (najpierw ostatni argument, na końcu pierwszy) oraz pozbywaniem argumentów ze stosu po wywołaniu funkcji (po natrafieniu na instrukcję ret):

 

push argument2
push argument1
call funkcja
add esp, 8 ;sprzątaj stos

 

Cdecl może przyjąć różne ilości argumentów.

 

Podobną do cdecl jest konwencja stdcall, funkcja ta sama dba o stos (przy instrukcji ret jest ilość bajtów do zwolnienia ze stosu)

push ebp
mov ebp, esp ;początek funkcji
...
ret 8 ;zwolnij 8 bajtów ze stosu - 2 argumenty

;wywołanie jak w przypadku cdecl jednakże po powrocie rejestr ESP ma wartość jak przed wywołaniem

push argument2
push argument1
call funkcja

 

Trzecia konwencja, o której warto wspomnieć to thiscall, to wywołanie do metod klas z C++. Argumenty są przekazywane jak w stdcall z tą różnicą, że wskaźnik na klasę (this) jest przekazywany przez rejestr (w VC++ jest to ecx).

 

push argument2
push argument1
mov ecx ds:[adreswskaznikanaklase]
call funkcja

 

Ostatnim typem jest fastcall, ta konwencja przekazuje argumenty przez rejestry i stos (w zależności od ilości)

 

mov edx, argument2
mov ecx, argument1
call funkcja

 

To jest niewielki wykładzik o konwencjach, na pewno coś pomyliłem zatem zalecam do lektury na ten temat.

YOU MUST DIE

- Ganon, Koridai

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...