Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Problem mit DLL Injection

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
11.11.2008, 18:40 Uhr
~Grabgewalt
Gast


Hallo ich versuche gerade ein Programm zu schreiben, dass beliebige dlls in beliebige Prozesse injected. Das Problem ist, dass der betreffenden Prozess abstürzt nachdem die dll ihre Aufgabe erfüllt hat. Ich nehme an das es an VirtualFreeEx liegt, aus irgendeinem Grund schlägt die Funtion bei mir fehl. Bitte um Hilfe.

PS: In der dll wird nichts besonderes gemacht, auch mit einer "leeren" dll krieg ich das Problem mit dem Absturz.


C++:
#include <windows.h>
#include <cstdio>
#include <tlhelp32.h>
#include <iostream>
#include <conio.h>

using namespace std;


typedef HINSTANCE (*fpLoadLibrary)(char*);
typedef LPVOID (*fpGetProcAddress)(HINSTANCE, char*);
typedef void (*fpFunktion)(void);

struct INJECTSTRUCT
{
      fpLoadLibrary LoadLibrary;
      fpGetProcAddress GetProcAddress;
      char path[255];
      char func[255];
};


DWORD WINAPI threadstart(LPVOID addr)
{
    HINSTANCE hDll;
    fpFunktion funktion;
    INJECTSTRUCT * is = (INJECTSTRUCT*)addr;      
    hDll = is->LoadLibrary(is->path);
    funktion = (fpFunktion)is->GetProcAddress(hDll, is->func);
    funktion();
    return 0;
}
void threadend()
{
}

//...Debug_Privileg setzen

void listproc()
{
        HANDLE hSnap, hTemp;
    PROCESSENTRY32 pe;
    pe.dwSize = sizeof(PROCESSENTRY32);

    //EnableDebugPrivilege();
    hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    
    if(Process32First(hSnap, &pe))
    {
        do
        {
            hTemp = OpenProcess(PROCESS_ALL_ACCESS, 0, pe.th32ProcessID);
            if(hTemp)
            {
                printf("%4d\t%s\n", pe.th32ProcessID, pe.szExeFile);
                CloseHandle(hTemp);
            }
        }
        while(Process32Next(hSnap, &pe));
    }
}




int main()
{

   HANDLE hProc;
   LPVOID start, thread;
   DWORD funcsize, written;
   HINSTANCE hDll;
   INJECTSTRUCT is;
   DWORD id;

   EnableDebugPrivilege();
   listproc();

   hDll = LoadLibrary("KERNEL32");
   is.LoadLibrary = (fpLoadLibrary)GetProcAddress(hDll, "LoadLibraryA");
   is.GetProcAddress = (fpGetProcAddress)GetProcAddress(hDll, "GetProcAddress");
   strcpy(is.path, "DLL.dll");
   strcpy(is.func, "Funktion");

   funcsize = (DWORD)threadend-(DWORD)threadstart;

   printf("Process ID: ");
   scanf("%d", &id);

   hProc = OpenProcess(PROCESS_ALL_ACCESS, false, id);
   if(!hProc)
       MessageBox ( NULL, "Unable to open process", "DLL Injector", MB_OK);


   printf("Prozess Handle:       %x", hProc);


   //start = VirtualAllocEx(hProc, 0, funcsize+sizeof(INJECTSTRUCT), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
   if(!(start = VirtualAllocEx(hProc, 0, funcsize+sizeof(INJECTSTRUCT), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE)))
       MessageBox ( NULL, "Failed to allocate memory", "DLL Injector", MB_OK);

   printf("Memory:               %x\n", start);


   if(!(WriteProcessMemory(hProc, start, (LPVOID)&is, sizeof(INJECTSTRUCT), NULL)))
        MessageBox ( NULL, "WriteProcessMemory(hProc, start, (LPVOID)&is, sizeof(INJECTSTRUCT), NULL) failed", "DLL Injector", MB_OK);

   thread = (LPVOID)((DWORD)start+sizeof(INJECTSTRUCT));

  if(!(WriteProcessMemory(hProc, thread, (LPVOID)threadstart, funcsize, NULL)))
        MessageBox ( NULL, "WriteProcessMemory(hProc, thread, (LPVOID)threadstart, funcsize, NULL) failed", "DLL Injector", MB_OK);


   if(!(CreateRemoteThread(hProc, NULL, 0, (LPTHREAD_START_ROUTINE)thread, start, 0, NULL)))
       MessageBox ( NULL, "Failed to Create remote thread", "DLL Injector", MB_OK);

   if(!(VirtualFreeEx(hProc,NULL,funcsize+sizeof(INJECTSTRUCT),MEM_RESERVE|MEM_COMMIT)))

        MessageBox ( NULL, "Failed to release allocated memory", "DLL Injector", MB_OK);


    CloseHandle(hProc);
    return 0;
}



Wie gesagt, die DLL macht sogar was sie soll, aber danach stürzt der Prozess in den injected wurde ab.

Danke schonmal.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.11.2008, 19:34 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,
außer das das eine recht zweifelhafte sache ist, ne dll in nen prozess zu schmuggeln, würde ich vermuten das du logischerweise erst bei beendigung der remote-anwendung den speicher freigeben darfst.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.11.2008, 19:49 Uhr
~Grabgewalt
Gast


klingt sehr logisch, habs versucht ändert leider immernoch nichts.

habs mal bisschen verbessert und auch an VirtualFreeEx rumgebastelt:


C++:
[...]
   CloseHandle(hProc);

   if(!(VirtualFreeEx(hProc,start,0,MEM_RELEASE)))
        MessageBox ( NULL, "Failed to release allocated memory", "DLL Injector", MB_OK);

    return 0;


Ich kriege ne nachricht aus meiner dll, einfach ne message box, und danach kriegt ich die fehlermeldung von VirtualFreeEx. Also bin ich der Meinung, dass es irgendwie daran liegen muss.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.11.2008, 19:58 Uhr
~Grabgewalt
Gast


ok das ergibt auch kein sinn so wie ichs jetzt gemacht habe^^ virtualfreeex mit hProc das vorher geschlossen wurde is natürlich blödsinn.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
11.11.2008, 20:49 Uhr
~Grabgewalt
Gast


So hab nochmal bisschen drüber nachgedacht, aber komme irgendwie nicht weiter.


C++:
if(!(hThread = CreateRemoteThread(hProc, NULL, 0, (LPTHREAD_START_ROUTINE)thread, start, 0, NULL)))
       MessageBox ( NULL, "Failed to Create remote thread", "DLL Injector", MB_OK);

WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);

if(!(VirtualFreeEx(hProc,start,NULL,MEM_RELEASE)))
        MessageBox ( NULL, "Failed to release allocated memory", "DLL Injector", MB_OK);


CloseHandle(hProc);
  
    return 0;


Der thread in dem die dll geladen werden soll wird gestartet. Das funktioniert auch, denn die DLL macht was sie soll. Mit WaitForSingleObject() wird auf die Terminierung des threads gewartet. Dann wir der handle auf den thread geschlossen. Nun noch den Speicher im Prozess wieder freigeben und auch diesen handle schließen. Logisch wie ich finde... Jedoch krieg ich immer diese Nachricht aus meinem Programm "Failed to release allocated memory" und der Zielprozess stürzt nach wie vor ab.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: