Verzweifle an Windows....

Ich arbeite zurzeit an einem Dll/Codeinjector .
Der Code selber ist sauber von Fehlern, trotzdem gibt der Compiler Fehler aus.

1>------ Erstellen gestartet: Projekt: winfect, Konfiguration: Debug Win32 ------
1> winfection.cpp
1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(6361): error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'ContextRecord'
1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(6361): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(6361): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(12983): error C2065: 'PCONTEXT': nichtdeklarierter Bezeichner
1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(12984): error C2146: Syntaxfehler: Fehlendes ')' vor Bezeichner 'ContextRecord'
1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(12984): warning C4229: Anachronismus verwendet: Modifizierer der Daten werden ignoriert
1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(12984): error C2182: 'RtlCaptureContext': Unzulässige Verwendung des Typs 'void'
1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(12984): error C2491: 'RtlCaptureContext': Definition von Daten für dllimport nicht zulässig
1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(12984): error C2059: Syntaxfehler: ')'
1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(13372): error C2143: Syntaxfehler: Es fehlt ';' vor '__stdcall'
1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(13372): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(13376): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(14982): error C3861: "__readfsdword": Bezeichner wurde nicht gefunden.
1>c:\program files\microsoft sdks\windows\v7.0a\include\winbase.h(746): error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'LPCONTEXT'
1>c:\program files\microsoft sdks\windows\v7.0a\include\winbase.h(746): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c:\program files\microsoft sdks\windows\v7.0a\include\winbase.h(746): error C2378: 'PCONTEXT': Neudefinition; Symbol kann nicht mit typedef überladen werden
1> c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(13372): Siehe Deklaration von 'PCONTEXT'
1>c:\program files\microsoft sdks\windows\v7.0a\include\winbase.h(746): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c:\program files\microsoft sdks\windows\v7.0a\include\winbase.h(2801): error C2061: Syntaxfehler: Bezeichner 'LPCONTEXT'
1>c:\program files\microsoft sdks\windows\v7.0a\include\winbase.h(2809): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c:\program files\microsoft sdks\windows\v7.0a\include\winbase.h(2809): error C2143: Syntaxfehler: Es fehlt ',' vor '*'
1>c:\users\natalie\desktop\julian\projects\winfection\winfection.cpp(10): error C2144: Syntaxfehler: 'unsigned long' sollte auf ';' folgen
1> infection.cpp
1>c:\users\natalie\desktop\julian\projects\winfection\infection.cpp(5): error C2143: Syntaxfehler: Es fehlt ';' vor 'using'
1>c:\users\natalie\desktop\julian\projects\winfection\infection.cpp(14): error C2664: 'injdll': Konvertierung des Parameters 2 von 'char' in 'char *' nicht möglich
1> Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
1> Code wird generiert...

Die Fehler die Angeblich in meinen Code seien sollten sind aber nicht da.
 
Zuletzt bearbeitet:
Die Fehler die Angeblich in meinen Code seien sollten sind aber nicht da.
Ähm.. Doch.

1>c:\users\natalie\desktop\julian\projects\winfect ion\winfection.cpp(10): error C2144: Syntaxfehler: 'unsigned long' sollte auf ';' folgen
1>c:\users\natalie\desktop\julian\projects\winfect ion\infection.cpp(5): error C2143: Syntaxfehler: Es fehlt ';' vor 'using'
1>c:\users\natalie\desktop\julian\projects\winfect ion\infection.cpp(14): error C2664: 'injdll': Konvertierung des Parameters 2 von 'char' in 'char *' nicht möglich
Ohne Sourcecode/Compilerflags kann man dir aber nicht weiterhelfen..
 
Hört sich nach einer Compiler-Inkompatibilität an...

Die Fehlermeckerei geht ja nun schon in den Windows-Headern los.

Ich kann mir vorstellen, daß Du einen GNU-Compiler verwendest, aber Header aus einer nicht für diesen angepaßten Bibliothek für MSVC. Das gibt regelmäßig Fehlersalat.

Um es konkret nachzustellen braucht man natürlich etwas konkretere Angaben zum verwendeten System...

Das Prinzip an sich kann ich nachvollziehen (das geht schon mit sehr einfachen Sachen los, wenn Du versuchst, in einem Einsteigerkurs den Teilnehmern ein EXTREM simples auto-generiertes Progrämmchen von z.B. DevCPP aus 5 Zeilen vorzusetzen und die auf die Idee kommen, es mit der nicht dafür vorgesehenen IDE (MSVC bzw. andersrum) zu bearbeiten).
 
[...]
Ich kann mir vorstellen, daß Du einen GNU-Compiler verwendest, aber Header aus einer nicht für diesen angepaßten Bibliothek für MSVC. Das gibt regelmäßig Fehlersalat. [...]
Tut er nicht. Das sind Fehlermeldungen, wie sie der MS-Compiler ausgibt.

@LaVolpe: Keiner hat Interesse an deinem Code, da er eh nichts enthält, was es nicht schon 100-Fach auf anderen Seiten gibt. Um den Fehler zu finden, brauchen wir aber den Code - ansonsten höre auf Threads zu erstellen!
 
Nun ja das ist mein Quellcode hier :\

Infection.cpp
Code:
//#include <windows.h>
#include <iostream>
#include "wfec.h"

using namespace std;
int dwProgrammID;
char *Pathtodll;
int main()
{
	cout<<"Bitte Programm PID eingeben:\n";
	cin >> dwProgrammID;
	cout<<"Bitte Pfad zur dll eingeben:\n";
	cin >> Pathtodll;
	int result = injdll(dwProgrammID, Pathtodll);
	switch( result )
	{
		case 1: cout<<"Failed to get HANDLE to Process\n\a";
		break;
		case 2: cout<<"Failed to create RemoteThread\n\a";
		break;
		case 0: cout<<" All right in\n";
		break;
	}
	return 0;
}

Wfec.h :

Code:
typedef void* PVOID;
#include <WinDef.h>
#include <WinBase.h>
int injdll ( int pid, char *path )
// next Codeinjection *troll*

winfection.cpp :
Code:
// Injection CPP
#include "wfec.h"


// PAGE_READWRITTE 
// PROCESS_ALL_ACCESS 
// VIRTUAL_MEM
#define VIRTUAL_MEM = "( 0x1000 | 0x2000 )"  
	
	
	unsigned long *thread;
	unsigned long *writ;
	int dlls;
	
int injdll( int pid, char *path )
{
	HANDLE h_process = OpenProcess( PROCESS_ALL_ACCESS , false , pid );
	if ( !(h_process))
	{
		return 1;
	}
	unsigned int File = GetFileSize(path, NULL);
	if (File)
	{	
		File = dlls;
		LPVOID adr = VirtualAllocEx( h_process, 0, 0, MEM_COMMIT | MEM_RESERVE , PAGE_READWRITE );
		WriteProcessMemory( h_process, adr, path, dlls, writ);
		HMODULE kernel = GetModuleHandleA("kernel32.dll");
		PVOID fallib = GetProcAddress(kernel,"LoadLibraryA");
		LPTHREAD_START_ROUTINE llib;
		fallib = llib;
		if ( CreateRemoteThread(h_process,NULL,0,llib,adr,0,thread))
		{
			return 0;
		}
		else 
		{
			return 2;
		}
	}	
}
 
Einmal (1) pro Modul die windows.h inkludieren und sonst nichts. WinDef etc. sind nicht für die Verwendung durch dich gedacht.
Am Ende der Deklaration von infdll fehlt ein Semikolon.
#define VIRTUAL_MEM = "( 0x1000 | 0x2000 )" ist komplett falsch. Wo hast du das denn her?
#define VIRTUAL_MEM (0x1000 | 0x2000)

cout<<"Bitte Programm PID eingeben:\n"; ist schlechter Stil.

cout<<"blabla"<<endl;

using namespace std; ist schlechter Stil. Weglassen und Namensraum explizit benutzen:
std::cout << "blabla" << std::endl;
 
Zuletzt bearbeitet:
Und wenn die Syntaxfehler weg sind, hier noch ein paar Tipps zur Technik an sich:

Du schreibst nicht die DLL in den fremden Prozess, sondern nur den Namen, also kein Grund GetFileSize()-großen Speicherblock zu reservieren.
Code:
LPTHREAD_START_ROUTINE llib;
fallib = llib;
macht auch keinen Sinn, besonders nicht, wenn man anschließend
Code:
CreateRemoteThread(h_process,NULL,0,llib,adr,0,thread)
aufruft. Besser wäre
Code:
CreateRemoteThread(h_process,NULL,0,(LPTHREAD_START_ROUTINE)fallib,adr,0,NULL)
außerdem
Code:
WriteProcessMemory( h_process, adr, path, dlls, writ);
besser
Code:
DWORD bw;
WriteProcessMemory( h_process, adr, path, dlls, &bw);
ansonsten schreibt er nach writ, welches nicht initialisiert wurde -> also irgendwohin.
 
Sieht eher nach "Fremdsprache" aus...

Also so weit in die Details brauchen wir noch nicht gehen: Es muß ja erstmal die grundsätzliche Syntax von C geklärt werden.

Aus dem Codeschnipsel ist zu ersehen, daß der Threadstarter aus einer anderen Programmiersprache zu C gewechselt ist: Er ist es offenbar gewohnt, daß bei Zuweisungen von links nach rechts kopiert wird:

quelle = ziel

während in C ja nun das Gegenteil gilt.

Aus dem Umstand, daß er sich an so komplexe Themen wie Codeinjektion traut, dürfte zu schlußfolgern sein, daß er in jener anderen Programmiersprache schon umfangreiche Erfahrungen gesammelt haben müßte. Also dürfte die Philosophie nicht das Hindernis sein, sondern halt die Kleinigkeiten der C-Syntax. Da wäre halt doch zwischendurch das Einlegen einer Mini-Tutorials für C-Einsteiger angebracht. Sonst kommt er ja aus dem Syntax-Schlamassel nie heraus!

Ansonsten wäre es noch hilfreich, den zugehörigen Artikel in der MSDN oder der Wikipedia für die eventuell vorbeischauenden Leute zu verlinken:
DLL injection - Wikipedia, the free encyclopedia

...und zu deklarieren, daß man da jetzt am Punkt 2 von "Approaches on Microsoft Windows" bastelt...

P.S.: Ich kenne den Ansatz mit "Hooking" - um zum Beispiel Mausnachrichten systemweit modifiziert zu verarbeiten und sowas wie der Maus folgende Augen zu realisieren.
 
Zuletzt bearbeitet:
Vielen Dank an euch für eure Hilfe bzw. Vorschläge zur Verbesserung meines Code . Dennoch sind die Fehler in Winnt.h und Winbase.h noch da....
 
Infection.cpp:
#include "wfec.h" -> löschen
Code:
#include <windows.h>
#include <isostream>
unsing namespace std;

extern int injdll ( int pid, char *path );
Wfec.h : löschen

winfection.cpp :
Code:
#include <windows.h>
hinzufügen
 
Vielen Dank an euch für eure Hilfe bzw. Vorschläge zur Verbesserung meines Code . Dennoch sind die Fehler in Winnt.h und Winbase.h noch da....
Es gibt keine Fehler in genannten Dateien. Das wurde dir von verschiedenen Leuten unabhängig voneinander gesagt und auch schon mit mehreren Lösungszaunpfälen gewunken.
 
Ja, ok ok. Dann bleibt mir nur noch es in DevC++ auszuprobieren ....

-------------------------

Ist schon endlich version 5 raus
 
Wenn du also alles getan hast, was dir aufgetragen wurde, es aber dennoch nicht funktioniert, was tust du dann?
Genau, den vollständigen Quellcode mitsamt Fehlerbeschreibung und -Meldung posten.
 
Erst mal Danke für eure Hilfe, nun der Code lässt sich Compilieren nur leider dass das Programm immer abstürzt und es heißt eine Variabel sei nicht initialiesiert.

Code:
// Winfection 
#define VIRTUAL_MEM (0x1000|0x2000)
#include <Windows.h>
#include <WinBase.h>
#include <WinDef.h>
#include <cstring>
#include <iostream>



int injectdll ( char *path, DWORD pid);

int main()
{
	DWORD dwID;
	char *dpath;
	char cpath;
	std::cout<<"Enter PID:"<< std::endl;
	std::cin >> dwID;
	std::cout<<"Enter Path:"<< std::endl;
	std::cin >> cpath;
	*dpath = cpath;
	int result = injectdll( dpath, dwID);
	switch(result)
	{
	case 1: std::cout<<"Couldn't aquire a Handle to Process" << std::endl; break;
	case 0: std::cout<<"DLL INJECTED"<< std::endl; return 0; break;
	}
}


int injectdll ( char *path, DWORD pid)
{
	HANDLE h_process;
	LPVOID adress;
	DWORD writ;
	HMODULE kernel32;
	FARPROC lib;
	
	h_process = OpenProcess( PROCESS_ALL_ACCESS , FALSE , pid );
	if ( h_process = 0)
	{
		return 1;
	}
	adress = VirtualAllocEx( h_process , 0 , NULL, VIRTUAL_MEM , PAGE_READWRITE ); 
	WriteProcessMemory( h_process, adress, path, std::strlen(path) , &writ);
	kernel32 = GetModuleHandleA("kernel32.dll");
	lib = GetProcAddress( kernel32, "LoadLibraryA" );
	CreateRemoteThread( h_process, NULL , 0 , (LPTHREAD_START_ROUTINE)lib , adress , 0 , NULL);
	return 0;	
}
 
char *dpath;
char cpath;
std::cin >> cpath;
*dpath = cpath;

Also vielleicht ist Harry's Idee mit dem C-Tutorial doch nicht so verkehrt....

Was du hier tust:
(1) dpath ist ein String, nicht initalisiert, zeigt sonstewohin (zufälliger Wert)
(2) cpath ist ein *einzelnes* Zeichen
(3) Du kopierst ein einzelnes Zeichen von der Standardeingabe nach cpath
(4) Du schreibst dieses Zeichen an eine zufällige Stelle im virtuellen Addressraum deines Programms. Gute Idee! :D

Was du wohl eher bezwecken wolltest (grob ausm Kopf)

std::string path;
std::cin >> path;
funkionsaufruf_mit_charpointer(path.c_str())

Da du btw. mit C++ arbeitest wäre es hochnotsinnvoll true und false wie vom Schöpfer gedacht zu verwenden.

bool injectdll(...)
{
...
if(catastrophic_failure)
return false;
...
if(great_success)
return true;
}

if(injectdll(...)) {
...
} else {
...
}

Übrigens ist = nicht der Vergleichsoperator in C, dein if-Statement
if ( h_process = 0)
wird also immer false sein. Du meintest da wohl eher ==, aber in der Regel schreibt man das eleganter als if(!hProcess)...

Die Includes sind auch immernoch falsch (falsch im Sinne von "nicht sinngebend" oder "unzielführend"), du brauchst nur Windows.h. Der Rest ist batteries included.

Zu den Eingeweiden von injectdll kann ihc gerade nichts sagen, dafür bin ich dann doch zu betrunken.
 
Zuletzt bearbeitet:
if ( h_process = 0)
wird also immer true sein.
Kleiner Fehler: Die Zahl Null wird als false interpretiert. Jeder andere Wert ist true.
Code:
#include <iostream>
using namespace std;

int main() {
  int i = 2;
  if(i = 2) {
    cout << "2 is True" << endl;
  } else {
    cout << "2 is False" << endl;
  }
  if(i = 0) {
    cout << "0 is True" << endl;
  } else {
    cout << "0 is False" << endl;
  }
  return 0;
}
Ausgabe:
Code:
2 is True
0 is False
 
Zurück
Oben