Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 04:05

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[C++] Hilfe bei DLL

Discussion on [C++] Hilfe bei DLL within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1


 
Jeoni's Avatar
 
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
[C++] Hilfe bei DLL

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 (32Bit Injector) und auch (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

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

P.S.: Und ja, ich habe die Injectors als Admin ausgeführt.
Jeoni is offline  
Old 09/27/2011, 19:19   #2
 
XxharCs's Avatar
 
elite*gold: 34
Join Date: Apr 2011
Posts: 1,475
Received Thanks: 1,228
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^^
XxharCs is offline  
Thanks
1 User
Old 09/27/2011, 19:22   #3


 
Jeoni's Avatar
 
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
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
Jeoni is offline  
Old 09/27/2011, 19:24   #4
 
XxharCs's Avatar
 
elite*gold: 34
Join Date: Apr 2011
Posts: 1,475
Received Thanks: 1,228
Dann mache in deinem Injector Debug Privilege und ggf. den Injector auch als admin starten.
XxharCs is offline  
Old 09/27/2011, 19:26   #5
 
Threk's Avatar
 
elite*gold: 0
Join Date: Oct 2010
Posts: 309
Received Thanks: 272
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
Threk is offline  
Old 09/27/2011, 19:27   #6


 
Jeoni's Avatar
 
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
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)
Attached Images
File Type: jpg Unbenannt.jpg (16.5 KB, 12 views)
Jeoni is offline  
Old 09/27/2011, 19:29   #7
 
XxharCs's Avatar
 
elite*gold: 34
Join Date: Apr 2011
Posts: 1,475
Received Thanks: 1,228
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
XxharCs is offline  
Old 09/27/2011, 19:34   #8


 
Jeoni's Avatar
 
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
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.
Jeoni is offline  
Old 09/27/2011, 19:40   #9
 
XxharCs's Avatar
 
elite*gold: 34
Join Date: Apr 2011
Posts: 1,475
Received Thanks: 1,228
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
XxharCs is offline  
Thanks
1 User
Old 09/27/2011, 20:05   #10


 
Jeoni's Avatar
 
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
Uninitialized Variable "luid"
Da stimmt was mit der SetDebugPrivelege() nicht, oder?
Jeoni is offline  
Old 09/27/2011, 20:08   #11
 
XxharCs's Avatar
 
elite*gold: 34
Join Date: Apr 2011
Posts: 1,475
Received Thanks: 1,228
Neh, du musst einfach anstatt Debug, Release nehmen.
XxharCs is offline  
Old 09/28/2011, 18:34   #12


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
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!
MrSm!th is offline  
Thanks
1 User
Old 09/28/2011, 20:21   #13
 
XxharCs's Avatar
 
elite*gold: 34
Join Date: Apr 2011
Posts: 1,475
Received Thanks: 1,228
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 =)
XxharCs is offline  
Old 09/28/2011, 20:29   #14


 
Jeoni's Avatar
 
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
Jo, hat sich alles erledigt. Danke an alle.
Jeoni is offline  
Old 09/28/2011, 20:52   #15
 
Che's Avatar
 
elite*gold: 120
Join Date: Aug 2010
Posts: 7,448
Received Thanks: 2,756
~ Hat sich geklärt, iwas hat mitm GNU Compiler nicht gestimmt, mit vc++ gehts
Che is offline  
Reply


Similar Threads Similar Threads
Hilfe Hilfe Pls Gucken Brauche Hilfe
04/04/2010 - Technical Support - 3 Replies
Ja wegen der Signatur sieht es euch ma an in pics /http://img641.imageshack.us/img641/6070/unbenann t790kjkh.png http://img444.imageshack.us/img444/6981/unbenannt kjhghzuijhbh.png kann mir pls einer HELFEN...



All times are GMT +1. The time now is 04:06.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.