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

[Tutorial] Podpinanie Dllki


Rekomendowane odpowiedzi

Opublikowano

W tym tutku postaram się wytłumaczyć jak najprościej podpiąć jakikolwiek DLL do aplikacji.

 

Potrzebne narzędzia

1. OllyDbg

2. PEiD

3. LordPE

 

I. Szukanie wolnego miejsca

Na początek musimy znaleźć miejsce na nazwę naszego dlla (im krótsza, tym lepiej). Otwieramy aplikację przy pomocy OllyDbg- File > Open. Po zakończeniu analizy przez OllyDbg ukazuje się okno z deasemblowanym kodem programu. Owy kod znajduje się w sekcji kodu. Na samym końcu sekcji mamy tzw wolne bajty. Aby obliczyć, ile i odkąd zaczynają się owe wolne bajty, należy dokonać kilku kalkulacji:

 

Rozmair_Wolnych_Bajtów = Rozmiar_sekcji_kodu_w_pliku - Wirtualny_rozmiar_sekcji_kodu

Początek_wolnych_bajtów = Wirtualny_rozmiar_sekcji_kodu + ImageBase + BaseOfCode

 

Pytanie, skąd pobrać te wszystkie dane? Do tego przyda nam się PEiD. Otwieramy PEiD i przeciągamy plik na formę lub klikamy w "..." by odnaleźć aplikację. Po otworzeniu pliku zostaną uzupełnione dane:

 

13286942.jpg

 

Naciskamy na ">" obok "EP Section", ukaże się forma z informacją o wszystkich sekcjach w pliku (sekcja kodu jest wyświetlana na początku, u mnie to .text):

 

75137036.jpg

 

Tutaj znajdziemy dwie potrzebne dane- V.Size (Virtual Size) czyli wirtualny rozmiar sekcji, R.Size (RAW size) czyli rozmiar sekcji w pliku. Zapisujemy sobie gdzieś te dane:

 

Rozmiar_sekcji_kodu_w_pliku = 4DC000

Wirtualny_rozmiar_sekcji_kodu = 4DB5AA

 

Formę z informacjami o sekcjach możemy już zamknąć. Wracamy do pierwszej formy i klikamy ">" obok "Subsystem".

 

67296728.jpg

 

Owa forma pokazuje nam więcej informacji dotyczących nagłówka PE (Portable Executable). To właśnie tutaj znajdziemy brakujące dane:

 

ImageBase = 400000

BaseOfCode = 1000

 

Przyda się nam jeszcze jedna dana (na później), mianowicie EntryPoint. Zapisujemy ją sobie:

EntryPoint = 4A066C

 

Można już zamknąć PEiD'a. Mając wszystkie dane możemy obliczyć rozmiar oraz początek wolnych bajtów w sekcji kodu:

 

Rozmair_Wolnych_Bajtów = 4DC000 - 4DB5AA

Początek_wolnych_bajtów = 4DB5AA + 400000 + 1000

 

Ostatecznym wynikiem jest:

 

Rozmiar_Wolnych_Bajtów = A56 (2646 bajtów to jest ok 2.5 kb)

Początek_wolnych_bajtów = 8DC5AA (offset pierwszego z wolnych bajtów)

 

II. Podpinanie DLL'a

Wracamy do OllyDbg. Naciskamy kombinację CTRL + G (ppm > Goto > Expression) i wpisujemy adres pierwszego z wolnych bajtów. Jak widać jest tam pełno wyzerowanych bajtów (zdarzają się także NOP'y (hex 90)).

 

30285221.jpg

 

Wybieramy pozycję, na której znajdzie się nazwa DLLki oraz kod ładujący ją. Aby dodać nazwę pliku DLL, należy kliknąć ppm w wybrane miejsce, po czym wybrać Follow in dump > Selection. Tabela Dump będzie wskazywać miejsce, które zaznaczyliśmy. Zaznaczamy kilka bajtów i naciskamy spację:

 

10612030.jpg

 

Naciskamy na pierwszą kropkę w polu ASCII i piszemy nazwę DLLki, po czym klikamy OK. Nazwa jest już gotowa do użycia.

 

29327662.jpg

 

Musimy zapisać sobie offset nazwy DLLki, by móc jej za chwile użyć. Zapisuję więc:

 

Moja_nazwa_dllki = 8DC5CA

 

Musimy teraz znaleźć funkcję LoadLibraryA, która załaduje naszą DLLkę. Szukać jej będziemy w importach. Naciskamy kombinację klawiszy CTRL + N (ppm > Search for > Name (label) in current module). Naszym oczom ukaże się okno z nazwami (import/export). Wystukujemy na klawiaturze szukaną nazwę, tj. LoadLibraryA (pisany tekst wyświetli się w tytule nowego okna):

 

92966680.jpg

 

Po naciśnięciu ENTER przejdziemy do listy instrukcji, które korzystają z LoadLibraryA. Klikamy na któregokolwiek CALL'a i ponownie naciskamy ENTER by przejść do podglądu kodu. Odr razu po tej operacji naciskamy spację, by móc edytować kod:

 

47361209.jpg

 

Kopiujemy całą linijkę i gdzieś ją sobie zapisujemy oraz klikamy CANCEL. Zapisuję więc:

 

LoadLibrary = CALL DWORD PTR DS:[8DD208]

 

Wszystko, co potrzebne już mamy, teraz czas zabrać się za napisanie kodu ładującego DLL. Na początek deklaracja funkcji LoadLibrary:

HMODULE WINAPI LoadLibrary(
 __in  LPCTSTR lpFileName
);

Jak widać, funkcja wymaga podania tylko i wyłącznie nazwy pliku. Przed rozpoczęciem wpisywania kodu, musimy obliczyć wirtualny adresEntryPoint. Ten co zapisaliśmy to RVA (Relative Virtual Address). Działanie wygląda następująco:

 

VAEP = RVAEP + ImageBase

VAEP = 4A066C + 400000

VAEP = 8A066C

 

Można więc zaczynać kod. Na początek wybieramy miejsce, w którym owy kod się znajdzie (oczywiście w wolnych bajtach). Gdy już się zdecydujemy, zaznaczamy pozycję i klikamy spację by przejść do edycji.

 

PUSH 8DC5CA ; nazwa naszej dllki
CALL DWORD PTR DS:[8DD208]
JMP 8A066C ; skocz na początek programu

 

83764045.jpg

 

Zanim przejdziemy do zapisywania naszej pracy, musimy zapisać sobie początek naszego nowego kodu. Zapisuję:

 

Początek_Kodu = 8DC5DE

 

Aby zapisać naszą pracę, klikamy ppm wybierając Copy > Select all, po czym ponownie klikamy ppm i tym razem wybieramy Copy to executable > selection. Pojawi się nowe okno, w nim naciskamy ppm wybierając Save file, nazywamy nasz plik i klikamy Zapisz.

 

III. Edycja nagłówka PE

To jeszcze nie koniec pracy. Teraz należy tylko wskazać początek programu na nasz nowy kod. Aby to zrobić, skorzystamy z LordPE. Odpalamy więc LordPE i naciskamy PE Editor. Wybieramy naszą aplikację i naszym oczom okazuje się forma:

 

p11b.jpg

 

Edytowaną wartością będzie oczywiście EntryPoint. Zanim jednak zmienimy tą wartość, musimy obliczyć RVA początku naszego kodu:

 

RVAEP = Początek_Kodu - ImageBase

RVAEP = 8DC5DE - 400000

RVAEP = 4DC5DE

 

p12ph.jpg

Teraz pozostaje nacisnąć "Save" i dll podpięty ;)

 

Źródła:

- http://msdn.microsoft.com/en-us/library/ms684175%28VS.85%29.aspx - LoadLibrary

YOU MUST DIE

- Ganon, Koridai

  • 3 miesiące temu...
  • 1 miesiąc temu...
Opublikowano

mam pytanie , jak już dll jest załadowana to jak moge z zewnątrz wywołać funkcje w niej zawartą

liczylem na barce lecz ona niemogla wygrac.

Przez kibicow ktorzy przy rzutach roznych wolnych swiecili w messiego laserami

Opublikowano

tzw. inną dllką ?

 

Musisz znać jej adres ( jest eksportowana funkcja ? ) i typ oraz jakie typy argumentów przyjmuje

 

i potem masz 2 opcje, albo robisz sobie na nią wskaźnik np.

void (__cdecl *funkcja)(int arg1) = (void (__cdecl *)(int ))0xADRES

albo w asemblerze

 

void funkcja( int arg1 )
{
  DWORD dwCall = 0xADRES;
  __asm 
 {
      push arg1
      call dwCall
     // ewentualna modyfikacja rejestru ESP.. Trzeba w debuggerze popatrzeć na wywołanie funkcji
 }
}

 

:)

  • 1 miesiąc temu...
Opublikowano

Sry ale tego nie ogarniam , ale mam pytanie jak to zmienie to też normalnie bd mógł to włańczać ??

I co się tam zmieni ??

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...