DLL Injected (czas przeszly) ale co dalej?

0

Witam, udało mi się wszystko ładnie zrobić bibliotekę, która wstrzykuje się w proces aplikacji. Testowałem - biblioteka ładuje się bez zarzutu do procesu. OK wszystko super, ale co robić dalej? Jak mam komunikować się z obsługą zdarzeń tejże wskrzeszonej aplikacji? Wiem tyle, że mam zacząć od DLLMAIN. Proszę o pomoc.

BOOL APIENTRY DllMain(HANDLE hModule, DWORD reason, LPVOID lpReserved)
{
	if(reason == DLL_PROCESS_ATTACH)
	{
              //Jak tu zacząć?? Jak przejąć obsługę zdarzeń bądź też podmienienie jej?
	}
	return true;
}
 
0

skoro Twoja biblioteka dzieli pamięć z daną aplikacją, to możesz sobie np wywołać jakąś funkcję z tej aplikacji, zmienić jakieś zmienne itp. jesli nie znasz podstaw assemblera oraz dobrze C to nie poradzisz sobie

0

Z assemblerem byłby problem - ale nie zamierzam jakoś dogłębnie wdzierać się w program, tylko powierzchownie. Nie da się odbierać informacji, np. poprzez kliknięcie klawisza i takie tam, zmiany nazwy aplikacji itp? No wiesz.. WM_Event, SendMessage, GetMessage itp.

0

http://msdn.microsoft.com/en-us/library/ms644898%28v=vs.85%29.aspx
OldWndProc = (WNDPROC)SetWindowLongPtr(hWnd, GWL_WNDPROC, (LONG_PTR)NewWndProc);

w nowej funkcji robisz co chcesz, nastepnie wywolujesz w niej starą funkcje :) jedyny warunek to to ze funkcja ktora to wywoluje musi miec ta sama przestrzen adresowa (Twoj dll taka posiada)

0

O super. Zaraz przejrzę i odpowiem :)

0

sry, dopiero teraz przejrzałem i funkcja zawraca mi ACCES_DENIED - brak dostępu. I tak jest z każdym procesem. Co tu poradzić ?

0

a wywołujesz ją w dllu czy w kodzie który wstrzykuje dlla?

0

w dll

0

mnie się udało to podpiąć bez żadnych problemów więc na pewno się da. wklej kod dlla

0
 
...
...



LRESULT CALLBACK WindoreProcedure(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);

UINT InjectDLL(char *dll, char *processname, char *windowname)
{
	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,false,GetProcessID(processname));
	if(hProcess != INVALID_HANDLE_VALUE)
	{
		LPVOID address = VirtualAllocEx(hProcess,NULL,strlen(dll),MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);
		if(WriteProcessMemory(hProcess,address,(LPCVOID)dll,strlen(dll),NULL) == 1)
		{
			HMODULE k32 = GetModuleHandle(L"Kernel32");
			HANDLE tHandle = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)GetProcAddress(k32,"LoadLibraryA"),address,0,NULL);
			WaitForSingleObject(tHandle,INFINITE);
	
			DWORD dllAddress;
			GetExitCodeThread(tHandle,&dllAddress);
			CloseHandle(tHandle);
			VirtualFreeEx(hProcess,address,0,MEM_RELEASE);

			tHandle = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)GetProcAddress(k32,"FreeLibrary"),(LPVOID)&address,0,NULL);

			wchar_t temp[25];
			ZeroMemory(temp,sizeof(wchar_t));
			mbstowcs(temp,windowname,sizeof(temp));
			Inject->hwnd = FindWindow(NULL,temp);
			if(Inject->hwnd != NULL)
			{
				Inject->oldProc = (WNDPROC)SetWindowLong(Inject->hwnd,GWL_WNDPROC,(LONG)WindowProcedure);
				if(Inject->oldProc != NULL)
				{
					return DLL_INJECT;
				}
				cout << "ERR: " << GetLastError() << endl;
				return DLL_CEVENT_ERROR;
			}
			return DLL_HWND_ERROR;
		}
		return DLL_WM_ERROR;
	}
	return DLL_OP_ERROR;
}

LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	return 0;
}

0

dawno nie widziałem nic tak głupiego. wiesz w ogóle na czym polega dll injection? jak kopiujesz kod z neta to chociaż zastanów się jak działa.

zastanów się co robisz:

  1. wrzucasz adres biblioteki dll do pamieci procesu celu.
  2. wywolujesz funkcje LoadLibraryA z kernel32.dll i jako parametr podajesz wskaznik do sciezki na dlla
  3. odczytujesz co zwrocilo wywolanie powyzszej funkcji (zwrocil uchwyt modulu dll)
  4. zwalniasz pamiec adresu biblioteki dll

dotąd jest ok. dobrze skopiowane itd

i teraz zaczyna się szczyt głupoty:
5. wywalasz biblioteke z pamieci wywolujac funkcje FreeLibrary (<-- wtf?)
6. szukasz okna ktoremu chcesz podpiac biblioteke (o_O)
7. probujesz podpiac swoja procedure okna oknu ktore przed chwila znalazles (bez komentarza...)

pytałem

a wywołujesz ją w dllu czy w kodzie który wstrzykuje dlla?

to jest według Ciebie dll?

jak poprawic?

  • wywal z kodu podpunkty od 5-7
  • zapomnij o tym programie powyzej, w tym momencie kontrole powinna przejac biblioteka dll
  • w punkcie wejscia dll'a, znajdz szukane okno i wtedy podmien ta funkcje.
0

"dll". Tobie chodzi o dllmain? Jeśli tak, to zauważ, że ładowanie dll'ki zewnętrznym programem powoduje wysłanie wiadomości DLL_ATTACH_PROCESS, a nie w momencie wstrzyknięcia kodu do jakiegokolwiek procesu. Szukane okno.. Dobra to skąd ja mam je niby wziąć jak nie z FindWindow i dlaczego właśnie nie mogę tego zrobić po wstrzyknięciu kodu, tylko w innym obszarze?

0

dll jak sama nazwa wskazuje to biblioteka ladowana dynamicznie, a nie program ktory laduje ta biblioteke (na dodatek innemu programowi)

dlatego:

http://msdn.microsoft.com/en-us/library/ms633591%28v=vs.85%29.aspx
zobacz na tabelkę:
GWL_WNDPROC/-4
Sets a new address for the window procedure.
You cannot change this attribute if the window does not belong to the same process as the calling thread.

skad wziac okno? podpowiem (czytaj w tej kolejnosci):
GetCurrentProcessId
http://blogs.msdn.com/b/oldnewthing/archive/2006/02/23/537856.aspx
EnumThreadWindows
EnumChildWindows
IsWindowVisible

okno możesz pobrać również FindWindow, ale musisz byc w 100% pewien ze bedzie to okno aplikacji w ktorej jest dll'ka a nie kopia tej samej aplikacji

0

Ahh w tenże sposób, dzięki - sprawdze ;)

0

Do wątku udało mi się dotrzeć, lecz z wątku do nowej procedury nie. Czy to ma coś związek z tym? Wydaje mi sie ze watek i proces naleza do okna, ktorego szukam.
Kod:

BOOL CALLBACK ThreadProcess(HWND hwnd, LPARAM lParam)
{
	if(IsWindowVisible(hwnd) == 1)
	{
		Inject.hwnd = hwnd;
		Inject.oldProc = (WNDPROC)SetWindowLong(hwnd,GWL_WNDPROC,(LONG)WindowProcedure);
		cout << "Thread Process ujrzano";
		SetWindowText(hwnd,L"Zmieniona nazwa");
	}
	return true;
}

W wątku procesu wszystko ładnie pięknie działa, lecz jak już wspomniałem procedurka nie daje znaku życia.

LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	SetWindowText(hwnd,L"Ratatatata");
	cout << "DZIALA";
	return 0;
}
0
  1. co według Ciebie mialoby wywolywac funkcje BOOL CALLBACK ThreadProcess(HWND hwnd, LPARAM lParam) ?
  2. jakbys wszystkie przechwycone komunikaty zamiast przekazywac dalej oznaczal jako przetworzone to bys sie zdziwil jak aplikacja potrafi sie zwiesic (uzyj funkcji http://msdn.microsoft.com/en-us/library/ms633571%28v=vs.85%29.aspx)
  3. wklej kod całego dlla (nie kod który wstrzykuje tylko dlla)
0
  1. co według Ciebie mialoby wywolywac funkcje BOOL CALLBACK ThreadProcess(HWND hwnd, LPARAM lParam) ?

Mówiłem Ci przecież, że do tego miejsca działa jak należy, ale jak już ci zależy to wywołuję tą funkcją, którą samą mi podałeś...
EnumThreadWindows(..);

Funkcja, którą ją wywołuje (sprawdzanie zgodności procesów)

 
int GetThreadFromProcessID(int processid)
{
	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0);

	THREADENTRY32 th32;
	th32.dwSize = sizeof(THREADENTRY32);

	while(Thread32Next(hSnapshot,&th32) == 1)
	{
		if(th32.th32OwnerProcessID == processid)
		{
			EnumThreadWindows(th32.th32ThreadID,ThreadProcess,NULL);
			return 1;
			break;
		}
	};
	CloseHandle(hSnapshot);
	return 0;
}

Kod na wstrzyknięcie:

bool InjectDLL(char *dll, char *processname)
{
	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,false,GetProcessID(processname));
	if(hProcess != INVALID_HANDLE_VALUE)
	{
		LPVOID address = VirtualAllocEx(hProcess,NULL,strlen(dll),MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);
		if(WriteProcessMemory(hProcess,address,(LPCVOID)dll,strlen(dll),NULL) == 1)
		{
			HMODULE k32 = GetModuleHandle(L"Kernel32");
			HANDLE tHandle = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)GetProcAddress(k32,"LoadLibraryA"),address,0,NULL);
			WaitForSingleObject(tHandle,INFINITE);
	
			DWORD dllAddress;
			GetExitCodeThread(tHandle,&dllAddress);
			CloseHandle(tHandle);
			VirtualFreeEx(hProcess,address,0,MEM_RELEASE);

			GetThreadFromProcessID(GetProcessID(processname));
			return true;
		}
	}
	return false;
}
 

Procedura, którą wywołuje w ThreadProcess:

LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	SetWindowText(hwnd,L"Ratatatata");
	cout << "dziala";
	switch(msg)
	{
		case WM_PAINT:
		{
			cout << "...";
		}
	}
	return CallWindowProc(Inject.oldProc,hwnd,msg,wParam,lParam);
}
 
0

wiesz co... ja już nie mam siły Ci pomagać. znajdź sobie na necie jakiś gotowy kod z użyciem dll injection i go użyj albo chociaż spróbuj zrozumieć.

0

Jezu kochany - albo ja jasno się nie wyrażam albo Ty. M.in "wywołanie" pewnie coś innego pod tym rozumiesz, jeżeli jesteś spec od tego, a ja zgłoosiłem temat do pomocy to powiedz, w którym obszarze robię coś nie tak oh..

0

Sory, ze jestem natrętny i namolny, gdyż robię double , ale przeczytałem wszystko na msdnie o tych funkcjach, przeszperałem google o injectingu i jest podobnie jak w moim kodzie lecz bez podmieniania/zmieniania procedury i w tym momencie nie wiem co zrobić (a o tych funkcjach również czytałem) lecz otrzymuję GetLastError, który zaraz wyjaśnię i zwracam się do Ciebie oraz innych tu obecnych o pomoc, którzy wiedzą co zrobić. Ok przejdę do rzeczy, gdy program przejdzie do sekcji ThreadProcess kod się wykonuje, lecz próbując wywowałać SetWindowLong (nową procedure) to otrzymuję GetLastError o treści: 183 - ERROR_ALREADY_EXISTS (Nie można utworzyć, gdyż już istnieje). I co ja biedak mam poradzić ;p

0

fragment Twojego kodu na wstrzyknięcie:

bool InjectDLL(char *dll, char *processname)
{
        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,false,GetProcessID(processname));
        if(hProcess != INVALID_HANDLE_VALUE)
        {
                LPVOID address = VirtualAllocEx(hProcess,NULL,strlen(dll),MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);
                if(WriteProcessMemory(hProcess,address,(LPCVOID)dll,strlen(dll),NULL) == 1)
                {
                        HMODULE k32 = GetModuleHandle(L"Kernel32");
                        HANDLE tHandle = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)GetProcAddress(k32,"LoadLibraryA"),address,0,NULL);
                        WaitForSingleObject(tHandle,INFINITE);
 
                        DWORD dllAddress;
                        GetExitCodeThread(tHandle,&dllAddress);
                        CloseHandle(tHandle);
                        VirtualFreeEx(hProcess,address,0,MEM_RELEASE);
 
                        //GetThreadFromProcessID(GetProcessID(processname)); // <-- z tym wynocha w ogole
                        return true;
                }
        }
        return false;
}

plik dll (dam ci kod mojego - przechwytuje nacisniete klawisze w firefoxie):

#include <windows.h>
#include <stdio.h>
#include <map>
#include <tlhelp32.h>

extern "C"
{
  BOOL WINAPI DllMain(HINSTANCE, DWORD, LPVOID);
}

typedef std::map<HWND, WNDPROC> TWindows;
TWindows windows;

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  if (message == WM_KEYUP)
   {
    char tekst[1000];
    char wndclass[1024];
    GetClassName(hWnd,wndclass,1024);
    sprintf(tekst,"klasa=%s\nHWND=%d\nklawisz=%c\nVK/wParam=%d\nlParam=%08X",wndclass,(int)hWnd,(char)wParam,wParam,(unsigned int)lParam);

    MessageBox(hWnd, tekst, "test", MB_OK);
   }

  TWindows::iterator f = windows.find(hWnd);
  if (f!=windows.end())
    return CallWindowProc(f->second,hWnd,message,wParam,lParam);

  MessageBox(NULL, "Jesli ten komunikat sie wyswietla to znaczy ze cos spierdoliles!", "test", MB_OK);
  return 0;
}

void ListThreads(unsigned int processID)
{
  HANDLE hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, processID );
  if(hProcessSnap == INVALID_HANDLE_VALUE)
    return;

  THREADENTRY32 threadEntry;
  threadEntry.dwSize = sizeof(threadEntry);
  if(!Thread32First(hProcessSnap,&threadEntry))
   {
    CloseHandle(hProcessSnap);
    return;
   }

  if(processID == threadEntry.th32OwnerProcessID)
    EnumThreadWindows(threadEntry.th32ThreadID,EnumThreadWndProc,NULL);

  while(Thread32Next(hProcessSnap,&threadEntry))
   {
    if(processID == threadEntry.th32OwnerProcessID)
      EnumThreadWindows(threadEntry.th32ThreadID,EnumThreadWndProc,NULL);
   }
  CloseHandle(hProcessSnap);
}

BOOL CALLBACK EnumThreadWndProc(HWND hwnd,LPARAM lParam)
{
  char wndclass[100];
  GetClassName(hwnd,wndclass,100);

  if (strcmp(wndclass,"MozillaWindowClass")==0)
   {
    TWindows::iterator f = windows.find(hwnd);
    if (f==windows.end())
      windows[hwnd] = (WNDPROC)SetWindowLong((HWND)hwnd,GWL_WNDPROC,(LONG)WndProc);
   }
  EnumChildWindows(hwnd,EnumThreadWndProc,NULL);

  return TRUE;
}

DWORD WINAPI MainThread(void* P)
{
  ListThreads(GetCurrentProcessId());

  /* jeśli będziesz chciał zrobić jakiegoś timera albo coś w ten deseń, to odkomentuj to
  MSG msg;
  BOOL ret;

  while ((ret=GetMessage(&msg, NULL, NULL, NULL)))
   {
    if (ret!=-1)
      DispatchMessage(&msg);
   }
  */
  return 0;
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
{
  switch( fdwReason )
  {
      case DLL_PROCESS_ATTACH:
          CreateThread(NULL, 0, MainThread, NULL, 0, NULL); // tutaj nie musi byc tego watku
          break;
      case DLL_PROCESS_DETACH:
          //MessageBox(NULL, "zamykajacy sie firefox!", "test", MB_OK);
          break;
  }
  return TRUE;
}

jutro usuwam ten post, żeby nie zostało dla potomnych. przemysl co robisz zle

0

Dzięki krwq, ale błąd wychaczyłem w czymś innym i będziesz się śmiał do końca życia (ja pier..).... Literówkę popełniłem w podawaniu nazwy dllki xD

0

Hmm .. słuchajcie, mam dziwną sprawę. Zrobiłem już injector, stosowałem dll-kę krwq i inne z neta, ale nie działają. Niby dll-ka ładuje się poprawnie, ale programy nie reagują. Użyłem między innymi kodu podanego tutaj wcześniej

0

Zrobiłem już injector, stosowałem dll-kę krwq i inne z neta, ale nie działają. Niby dll-ka ładuje się poprawnie, ale programy nie reagują.

Coś masz źle.

0

Double post

0

Double post

1 użytkowników online, w tym zalogowanych: 0, gości: 1