[C++] Hilfe bei DLL

09/27/2011 19:12 Jeoni#1
Hi Elitepvper Coders,
ich hab mich letztens mal an das Programmieren einer DLL gemacht, die man in einen Prozess injizieren kann und wo dann irgendetwas passiert. So, nun habe ich erstmal bei Visual Studio 2010 unter dem Punkt "C++" ein "Empty Project" ausgewählt und habe anschließend bei den Projekteinstellungen von "Executable (.exe)" auf "Dynamic Link Library (.dll)" gestellt. Mehr habe ich an den Einstellungen nicht verändert. Anschließend habe ich in die von mir angelegte main.cpp folgenden Code geschrieben:
Andere Code-Dateien gibt es im Projekt nicht. Nun hab ich das kompiliert und versucht in ein paar Prozesse zu injizieren (alles 32Bit-Prozesse, z.B. Firefox und Skype). Nichts passierte! Nun will ich natürlich wissen, woran das liegt und wie man das behebt. Als injectoren habe ich [Only registered and activated users can see links. Click Here To Register...] (32Bit Injector) und auch [Only registered and activated users can see links. Click Here To Register...] (anscheinend 64Bit) benutzt. Was meine Idee wäre: Kann man vielleicht die DLL einmal für 32 und für 64 Bit kompilieren und es war ne 64 Bit DLL, die in 32Bit Prozessen nichts gemacht hat?
Habe selber Win7 Ulti 64Bit, wenn das relevant ist :D

Tut mir leid, dass ihr so viel gelesen habt :D
und wäre nett, wenn ihr helfen könntet :handsdown:
MfG Jeoni

P.S.: Und ja, ich habe die Injectors als Admin ausgeführt. ;)
09/27/2011 19:19 XxharCs#2
Versuchs mal so ;) :
Code:
#include <Windows.h>

void Nachricht()
{
	MessageBox(0, L"Hallo, es funktioniert!",0,0);
}

int WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID reserved)
{
	if(reason == DLL_PROCESS_ATTACH){
		CreateThread(0, 0, (LPTHREAD_START_ROUTINE) Nachricht, 0, 0, 0);
	}
	return true;
}
Edit: Das L in der Messagebox kannst weg lassen wenn du Multibyte Zeichensatz verwendest^^
09/27/2011 19:22 Jeoni#3
Vielen Dank, aber beim kompilieren liefert er den Error:
Code:
error C2664: 'MessageBoxA' : cannot convert parameter 2 from 'const wchar_t [24]' to 'LPCSTR'
Hab das "L" in der Nachricht weggenommen, dann hat die Kompilation keine Errors erbracht. Aber es funktioniert leider immernoch nicht :(
09/27/2011 19:24 XxharCs#4
Dann mache in deinem Injector Debug Privilege und ggf. den Injector auch als admin starten.
09/27/2011 19:26 Threk#5
Du kannst beim erstellen des Projektes einfach unter Win32 "Win32 Console Application" auswählen und dann bei den optionen bei "Application Type" auf Dll stellen.

Zu deinem Code:

Code:
// test.cpp : Defines the exported functions for the DLL application.
//

#include "stdafx.h"


bool WINAPI DllMain(_In_ void * _HDllHandle, _In_ unsigned _Reason, _In_opt_ void * _Reserved)
{
	if (_Reason == DLL_PROCESS_ATTACH)
	{
		MessageBox(0, L"Injection sucessfull!", L"Injection", 32);
	}
}
Das sollte völlig ausreichen ;)
09/27/2011 19:27 Jeoni#6
Die Injectoren starte ich immer als Admin, aber wie gebe ich denen Debug Privilege?

@Threk:
Leider liefert der Code viele Errors mit denen ich nichts anfangen kann (Bild ist unten angehängt)
09/27/2011 19:29 XxharCs#7
So gehen die Debug Privilege:
Code:
void SetDebugPrivilege() 
{
	HANDLE hProcess=GetCurrentProcess(), hToken;
	TOKEN_PRIVILEGES priv;
	LUID luid;

	OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken);


    priv.PrivilegeCount = 1;
	priv.Privileges[0].Luid = luid;
	priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(hToken, false, &priv, 0, 0, 0);

	CloseHandle(hToken); 
}
Und in deinem main Teil, bevor dann das eigentliche passiert setzt du SetDebugPrivilege(); ein
09/27/2011 19:34 Jeoni#8
Mein Code sieht jetzt so aus:

In die Injectoren kann ich kein Debug priveleg setzen, da das nicht meine sind und ich keine Source dafür habe.
Oben geschriebener Code funzt leider immernoch nicht. :(
09/27/2011 19:40 XxharCs#9
Naja die debug privilege funken in einer dll nicht^^

Hier mal ein injector source code:
Code:
#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <conio.h>


using namespace std;

void SetDebugPrivilege() 
{
	HANDLE hProcess=GetCurrentProcess(), hToken;
	TOKEN_PRIVILEGES priv;
	LUID luid;

	OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken);


    priv.PrivilegeCount = 1;
	priv.Privileges[0].Luid = luid;
	priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(hToken, false, &priv, 0, 0, 0);

	CloseHandle(hToken); 
}

int main(int argc, char* argv)
{
    HANDLE hWnd, hProcess, AllocAdresse, hRemoteThread;
    DWORD PID;

    hWnd = FindWindow(0, L"der Fenster name des Prozesses");
    GetWindowThreadProcessId((HWND)hWnd, &PID);

	SetDebugPrivilege(); 

	char buf[MAX_PATH] = {0};
	GetFullPathNameA("Hier der dll name.dll", MAX_PATH, buf, NULL);
    
    hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, PID);

    AllocAdresse = VirtualAllocEx(hProcess, 0, sizeof(buf), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    WriteProcessMemory(hProcess, (void*)AllocAdresse, (void*)buf, sizeof(buf), 0);
    hRemoteThread=CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE) GetProcAddress(GetModuleHandle(L"kernel32.dll"),"LoadLibraryA"), AllocAdresse, 0, 0);
    
    WaitForSingleObject(hRemoteThread, INFINITE);

    VirtualFreeEx(hProcess, AllocAdresse, sizeof(buf), MEM_DECOMMIT);
    CloseHandle(hProcess);
    return 0;
}
Deine dll muss dann im selben Ordner wie der injector sein. und das L kannst weggeben, falls du multibyte zeichensatz verwendest
09/27/2011 20:05 Jeoni#10
Uninitialized Variable "luid"
Da stimmt was mit der SetDebugPrivelege() nicht, oder?
09/27/2011 20:08 XxharCs#11
Neh, du musst einfach anstatt Debug, Release nehmen.
09/28/2011 18:34 MrSm!th#12
Quote:
Originally Posted by XxharCs View Post
Versuchs mal so ;) :
Code:
#include <Windows.h>

void Nachricht()
{
	MessageBox(0, L"Hallo, es funktioniert!",0,0);
}

int WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID reserved)
{
	if(reason == DLL_PROCESS_ATTACH){
		CreateThread(0, 0, (LPTHREAD_START_ROUTINE) Nachricht, 0, 0, 0);
	}
	return true;
}
Edit: Das L in der Messagebox kannst weg lassen wenn du Multibyte Zeichensatz verwendest^^
Wenn du ihm helfen willst, bring ihm bitte keinen Müll bei!

Ein Thread hat den Typ DWORD WINAPI, nicht void!
Außerdem macht es keinen Unterschied, ob die Message Box im Main Thread oder in einem neuen gezeigt wird.

@Jeoni:

Du brauchst keinen eigenen Injector copypasten, wenn du ihn nicht verstehst.
Nimm Winject. Wenn es damit als Admin nicht geht, liegt es nicht am Injector!
09/28/2011 20:21 XxharCs#13
Quote:
Originally Posted by MrSm!th View Post
Wenn du ihm helfen willst, bring ihm bitte keinen Müll bei!

Ein Thread hat den Typ DWORD WINAPI, nicht void!
Außerdem macht es keinen Unterschied, ob die Message Box im Main Thread oder in einem neuen gezeigt wird.

@Jeoni:

Du brauchst keinen eigenen Injector copypasten, wenn du ihn nicht verstehst.
Nimm Winject. Wenn es damit als Admin nicht geht, liegt es nicht am Injector!
Für einen kleinen nutzlosen test kann man void nehmen =)
Habs ihm aber schon per team viewer gemacht. problem war nur der injector, funkt aber jetzt ohne probleme =)
09/28/2011 20:29 Jeoni#14
Jo, hat sich alles erledigt. Danke an alle.
09/28/2011 20:52 Che#15
~ Hat sich geklärt, iwas hat mitm GNU Compiler nicht gestimmt, mit vc++ gehts