Gå til innhold

[Løst][C] Injection problems


Anbefalte innlegg

Problem er at programmet klikker en plass imellom 'GetDLLName' og 'fileExists'.

Har error-checking på det meste (til og med litt for mye), men uansett.

 

/*
		 Injector by: ZorgioN

		 This code may not be posted anywhere else without a link to the original post(NOT);D

		 Credz: MSDN & Napalm @ rohitab for some help
*/

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

#define MUTEX_NAME		"ZInjector"
#define PROCESS_NAME	"hl.exe"
#define TITLE_NAME		"Injector"

struct TARGET_PROCESS_INFO {
 char cGetLastError[MAX_PATH];
 char cProcessName[MAX_PATH];
 char cDLLName[MAX_PATH];
 HWND hTargetWnd;
};
TARGET_PROCESS_INFO TPI;


BOOL fileExists(char cFile[MAX_PATH]) {
 OFSTRUCT of = { 0 };
 if(OpenFile(cFile,&of,OF_EXIST) == HFILE_ERROR) {
	 // Log error here
	 strcpy(TPI.cGetLastError,"OpenFile");
	 return FALSE;
 }
 return TRUE;
}

int FixName(char *string) {
 char buf[MAX_PATH];
 strcpy(buf,string);
 if(strlen(string) == 0) {
	 return 0;
 }
 for(int i = 0; i <(int)strlen(string);i++) {
	 if(i >= (int)strlen(string) - 3){
		 string[i] = 0;
		 break;
	 }
 }
 strcat(string,"dll");
 if(strlen(string) == strlen(buf)) {
	 return 1;
 }
 return 0;
}

BOOL GetDLLName(char *cFile) {
 if(GetModuleFileName(NULL,cFile,MAX_PATH) == NULL) {
	 // Log error here
	 strcpy(TPI.cGetLastError,"GetModuleFileName");
	 return FALSE;
 }
 else if(GetModuleFileName(NULL,cFile,MAX_PATH) == ERROR_INSUFFICIENT_BUFFER) {
	 // Log error here
	 strcpy(TPI.cGetLastError,"GetModuleFileName");
	 return FALSE;
 }
 else if(GetModuleFileName(NULL,cFile,MAX_PATH) != 0) {
	 if(FixName(cFile) == 1) { 
		 return TRUE;
	 }
	 // Log error here
	 strcpy(TPI.cGetLastError,"FixName");
	 return FALSE;
 }
 return FALSE;
}

DWORD GetProcessID(char cProcessName[MAX_PATH]) {
 PROCESSENTRY32 ProcessEntry32 = { 0 };
 BOOL bProcess		 = FALSE;
 HANDLE hSnapshot	 = NULL;
 if((hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)) == NULL) {
	 // Log error here
	 strcpy(TPI.cGetLastError,"CreateToolhelp32Snapshot");
	 return NULL;
 }
 if(Process32First(hSnapshot,&ProcessEntry32) == FALSE) {
	 // Log error here
	 strcpy(TPI.cGetLastError,"Process32First");
	 return NULL;
 }
 while(Process32Next(hSnapshot,&ProcessEntry32) != FALSE) {
	 if(strcmp(cProcessName,ProcessEntry32.szExeFile) == 0) {
		 if(CloseHandle(hSnapshot) == NULL) {
			 // Log error here
			 // I'l just ignore this part if the handle does not get closed and log it.
			 strcpy(TPI.cGetLastError,"CloseHandle");
		 }
		 return ProcessEntry32.th32ProcessID;
	 }
 }
 strcpy(TPI.cGetLastError,"Process32Next");
 if(CloseHandle(hSnapshot) == NULL) {
	 // Log error here
	 // I'l just ignore this part if the handle does not get closed and log it.
 }
 return NULL;;
}

BOOL InjectDLL(char cProcessName[MAX_PATH],char cDllName[MAX_PATH]) {
 FARPROC LoadLibAddress	 = NULL;
 LPVOID lpAddress		 = NULL;
 DWORD PID				= NULL;
 HMODULE hModKernel32	 = NULL;
 HANDLE hProcess		 = NULL;
 if((PID = GetProcessID(cProcessName)) == NULL) {
	 // Log error here
	 return FALSE;
 }
 if((hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID)) == NULL) {
	 // Log error here
	 strcpy(TPI.cGetLastError,"OpenProcess");
	 return FALSE;
 }
 if((hModKernel32 = GetModuleHandle("kernel32.dll")) == NULL) {
	 if(CloseHandle(hProcess) == NULL) {
		 // Log error here
		 // I'l just ignore this part if the handle does not get closed and log it.
		 strcpy(TPI.cGetLastError,"CloseHandle");
	 }
	 // Log error here
	 strcpy(TPI.cGetLastError,"GetModuleHandle");
	 return FALSE;
 }	
 if((LoadLibAddress = GetProcAddress(hModKernel32,"LoadLibraryA")) == NULL) {
	 if(CloseHandle(hProcess) == NULL) {
		 // Log error here
		 // I'l just ignore this part if the handle does not get closed and log it.
		 strcpy(TPI.cGetLastError,"CloseHandle");
	 }
	 // Log error here
	 strcpy(TPI.cGetLastError,"GetProcAddress");
	 return FALSE;
 }
 if((lpAddress = VirtualAllocEx(hProcess,NULL,strlen(cDllName),MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE)) == NULL) {
	 if(CloseHandle(hProcess) == NULL) {
		 // Log error here
		 // I'l just ignore this part if the handle does not get closed and log it.
		 strcpy(TPI.cGetLastError,"CloseHandle");
	 }
	 // Log error here
	 strcpy(TPI.cGetLastError,"VirtualAllocEx");
	 return FALSE;
 }
 if(WriteProcessMemory(hProcess,lpAddress,cDllName,strlen(cDllName),NULL) == NULL) {
	 if(VirtualFreeEx(hProcess,lpAddress,0,MEM_RELEASE) == NULL) {
		 // Log error here
		 // I'l just ignore this part if the handle does not get closed and log it.
		 strcpy(TPI.cGetLastError,"CloseHandle");
	 }
	 if(CloseHandle(hProcess) == NULL) {
		 // Log error here
		 // I'l just ignore this part if the handle does not get closed and log it.
		 strcpy(TPI.cGetLastError,"CloseHandle");
	 }
	 // Log error here
	 strcpy(TPI.cGetLastError,"WriteProcessMemory");
	 return FALSE;
 }
 if(CreateRemoteThread(hProcess,NULL,NULL,(LPTHREAD_START_ROUTINE)LoadLibAddress,lpAddress,NULL,NULL) == NULL) {
	 if(VirtualFreeEx(hProcess,lpAddress,0,MEM_RELEASE) == NULL) {
		 // Log error here
		 // I'l just ignore this part if the handle does not get closed and log it.
		 strcpy(TPI.cGetLastError,"CloseHandle");
	 }
	 if(CloseHandle(hProcess) == NULL) {
		 // Log error here
		 // I'l just ignore this part if the handle does not get closed and log it.
		 strcpy(TPI.cGetLastError,"CloseHandle");
	 }
	 // Log error here
	 strcpy(TPI.cGetLastError,"CreateRemoteThread");
	 return FALSE;
 }
 if(VirtualFreeEx(hProcess,lpAddress,0,MEM_RELEASE) == NULL) {
	 // Log error here
	 // I'l just ignore this part if the handle does not get closed and log it.
	 strcpy(TPI.cGetLastError,"CloseHandle");
 }
 if(CloseHandle(hProcess) == NULL) {
	 // Log error here
	 // I'l just ignore this part if the handle does not get closed and log it.
	 strcpy(TPI.cGetLastError,"CloseHandle");
 }
 return TRUE;
}

int main( ) {
 BOOL bPrinted = FALSE;
 HANDLE hMutex = CreateMutex(NULL,TRUE,MUTEX_NAME);
 if(GetLastError() == ERROR_ALREADY_EXISTS) {
	 // Log error here
	 ExitProcess(0); // We don't want multiple windows of our application.
 }
 else if(hMutex == NULL) {
	 // Log error here
	 ExitProcess(0);  // Just to be sure, there's gonna be no problem with the mutex.
 }
 if(SetConsoleTitle(TITLE_NAME) == NULL) {
	 printf(	"Error: 'SetConsoleTitle' failed. Looking up error message with GetLastError():\n %s \n",GetLastError());
	 getchar();
	 if(ReleaseMutex(hMutex) == NULL) {
		 // Log error here
	 }
	 return 0;
 }
 if(GetDLLName(TPI.cDLLName) == FALSE) {
	 if(strcmp("",TPI.cGetLastError) != 0) {
		 printf(	"Error: '%s' failed. Looking up error message with GetLastError():\n %s \n",TPI.cGetLastError,GetLastError());
	 }
	 else {
		 printf("Error: DLL-file not found !\n");
	 }
	 getchar();
	 if(ReleaseMutex(hMutex) == NULL) {
		 // Log error here
	 }
	 return 0;
 }
 if(fileExists(TPI.cDLLName) == FALSE) {
	 printf(	"Error: '%s' failed. Looking up error message with GetLastError():\n %s \n",TPI.cGetLastError,GetLastError());
	 getchar();
	 if(ReleaseMutex(hMutex) == NULL) {
		 // Log error here
	 }
	 return 0;
 }
 while(GetProcessID(PROCESS_NAME) == NULL) {
	 if(bPrinted == FALSE) {
		 printf("Waiting for '%s' to start...\n",PROCESS_NAME);
		 bPrinted = TRUE;
	 }
	 Sleep(5);
 }
 if(InjectDLL(PROCESS_NAME,TPI.cDLLName) == FALSE) {
	 printf("Error: '%s' failed.\nLooking up error message with GetLastError():\n %s \n",TPI.cGetLastError,GetLastError());
	 getchar();
 }
 else if(InjectDLL(PROCESS_NAME,TPI.cDLLName) == TRUE) {
	 if(strcmp(TPI.cGetLastError,"") != 0) {
		 printf("Error: Injection complete, but failed to close process handle because 'CloseHandle' failed.\nLooking up error message with GetLastError():\n %s \n",TPI.cGetLastError);
	 }
	 else {
		 printf("Success: Injection complete, 0 errors");
	 }
	 getchar();
 }
 if(ReleaseMutex(hMutex) == NULL) {
	 // Log error here
 }
 return 1;
}

Endret av zorgion
Lenke til kommentar
Videoannonse
Annonse
Kan du få ut mer info hvis du bruker en debugger?

Blir noe skrevet til std::cout?

 

Det er vanskelig å gjenskape problemet hvis man ikke har half-life (hvis jeg ikke tar feil av hva hl.exe er da) så du må hjelpe.

 

Tror du misforstår litt :p Hvis du ser på koden og det jeg skrev, så ligger ikke problemet i "half-life".

"hl.exe" er bare en test application. Selve problemet ligger før det, en plass mellom 'GetDLLName' og 'fileExists' (fant jeg ut da jeg debugga programmet pga. det krasjer).

Som sagt, programmet krasjer en elr annen plass der imellom, dersom dll-fila ikke ligger i samme mappe. Jeg veit 'GetDLLName' funker pga. jeg bruke MessageBox(NULL,cFile,"",NULL); og fikk rett dll-fil i return. Men så krasjer den av en elr annen rar grunn i 'fileExists', har prøvd med GetFileAttribute, OpenFile, FILE *file; osv.. Alt krasjer der.

 

Bortsett fra det kan jeg takle resten selv. (Må forresten forandre litt i main, der jeg har en 'while loop' som leter etter prosessen som er definert som 'target'.)

 

Dette var aldri ment som en injector med et 'target', det skal utvide programmet til å kunne injecte dll fil / shellcode på flere forskjellige måter.

 

- ZorgioN -

Lenke til kommentar

Jeg er med på at feilen ligger i koden, men jeg lurer på om du ser noe unormalt i koden når du debugger. Slik jeg forstår det så krasjer programmet i fileExists hvis filen du åpner ikke ligger i samme mappe.. stemmer det?

 

Du kan prøve å bytte ut OpenFile med CreateFile. OpenFile bør ikke brukes i nye programmer... OpenFile skal bare brukes sammen med 16-bit windows :)..

Lenke til kommentar
Jeg er med på at feilen ligger i koden, men jeg lurer på om du ser noe unormalt i koden når du debugger. Slik jeg forstår det så krasjer programmet i fileExists hvis filen du åpner ikke ligger i samme mappe.. stemmer det?

 

Du kan prøve å bytte ut OpenFile med CreateFile. OpenFile bør ikke brukes i nye programmer... OpenFile skal bare brukes sammen med 16-bit windows :) ..

 

BOOL fileExists(char cFile[MAX_PATH]) {
HANDLE hFile = CreateFile(cFile,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile == INVALID_HANDLE_VALUE) {
	CloseHandle(hFile);
	return FALSE;
}
	CloseHandle(hFile);
return TRUE;
}

 

Call Stack (Visual C++ 2008 Express Edition's debugger)

dd.exe!GetDLLName(char * cFile=0x00403220) Line 45

dd.exe!main() Line 206 + 0xa bytes

dd.exe!__tmainCRTStartup() Line 586 + 0x17 bytes

kernel32.dll!7c817077()

[Frames below may be incorrect and/or missing, no symbols loaded for kernel32.dll]

Endret av zorgion
Lenke til kommentar

Kan hende programmet crasher pga. det skjer noe feil under build, jeg har fått en error msg før opp på at den manglet en fil (etter laptop min hadde et strømbrudd pga. strømkablen datt ut:P). Ska reinstallere VC++ Express og se om det funker :p

Lenke til kommentar

Funker heilt greit å bruke WriteProcessMemory på vista (så lenge du er inne på admin accounten iaf. hakke testa uten).

 

Koden funker nå ! ;D

 

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

#define MUTEX_NAME		"MyInjector"
#define PROCESS_NAME	"someprocess.exe"
#define TITLE_NAME		"MyInjector"

struct TARGET_PROCESS_INFO {
char cGetLastError[MAX_PATH];
char cProcessName[MAX_PATH];
char cDLLName[MAX_PATH];
char cLoaderName[MAX_PATH];
// HWND hTargetWnd; // Comes in version 2, where I will add other methods of injection, GUI and
// make it possible to store a dll-file as shellcode into the loader (while running the program) and inject it.
};
TARGET_PROCESS_INFO TPI;

BOOL fExists(const char* cFile) {
GetFileAttributes(cFile);
switch(GetLastError()) {
	case ERROR_FILE_NOT_FOUND: {
		strcpy(TPI.cGetLastError,"GetFileAttributes");
		return FALSE;
	}
	case ERROR_PATH_NOT_FOUND: {
		strcpy(TPI.cGetLastError,"GetFileAttributes");
		return FALSE;
	}
	default: break;
}
return TRUE;
}

BOOL GetDLLName(char *cFile) {
if(GetModuleFileName(NULL,cFile,MAX_PATH) == NULL) {
	strcpy(TPI.cGetLastError,"GetModuleFileName");
	return FALSE;
}
else if(GetModuleFileName(NULL,cFile,MAX_PATH) == ERROR_INSUFFICIENT_BUFFER) {
	strcpy(TPI.cGetLastError,"GetModuleFileName");
	return FALSE;
}
else if(GetModuleFileName(NULL,cFile,MAX_PATH)) {
	strcpy(TPI.cLoaderName,TPI.cDLLName);
	strcpy(&TPI.cDLLName[strlen(TPI.cDLLName)-3],"dll");
	return TRUE;
}
return FALSE;
}

DWORD GetProcessID(char cProcessName[MAX_PATH]) {
PROCESSENTRY32 ProcessEntry32 = { 0 };
HANDLE hSnapshot 	= NULL;
if((hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)) == NULL) {
	strcpy(TPI.cGetLastError,"CreateToolhelp32Snapshot");
	return NULL;
}
if(Process32First(hSnapshot,&ProcessEntry32) == FALSE) {
	strcpy(TPI.cGetLastError,"Process32First");
	if(CloseHandle(hSnapshot) == NULL) strcpy(TPI.cGetLastError,"CloseHandle");
	return NULL;
}
while(Process32Next(hSnapshot,&ProcessEntry32) != FALSE) {
	if(strcmp(cProcessName,ProcessEntry32.szExeFile) == 0) {
		if(CloseHandle(hSnapshot) == NULL) strcpy(TPI.cGetLastError,"CloseHandle");
		return ProcessEntry32.th32ProcessID;
	}
}
strcpy(TPI.cGetLastError,"Process32Next");
if(CloseHandle(hSnapshot) == NULL) strcpy(TPI.cGetLastError,"CloseHandle");
return NULL;;
}

BOOL InjectDLL(char cProcessName[MAX_PATH],char cDllName[MAX_PATH]) {
FARPROC LoadLibAddress 	= NULL;
LPVOID lpAddress 		= NULL;
DWORD PID				= NULL;
HMODULE hModKernel32 	= NULL;
HANDLE hProcess 		= NULL;
if((PID = GetProcessID(cProcessName)) == NULL) return FALSE;
if((hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID)) == NULL) {
	strcpy(TPI.cGetLastError,"OpenProcess");
	return FALSE;
}
if((hModKernel32 = GetModuleHandle("kernel32.dll")) == NULL) {
	strcpy(TPI.cGetLastError,"GetModuleHandle");
	if(CloseHandle(hProcess) == NULL) strcpy(TPI.cGetLastError,"CloseHandle");
	return FALSE;
}	
if((LoadLibAddress = GetProcAddress(hModKernel32,"LoadLibraryA")) == NULL) {
	strcpy(TPI.cGetLastError,"GetProcAddress");
	if(CloseHandle(hProcess) == NULL) strcpy(TPI.cGetLastError,"CloseHandle");
	return FALSE;
}
if((lpAddress = VirtualAllocEx(hProcess,NULL,MAX_PATH,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE)) == NULL) {
	strcpy(TPI.cGetLastError,"VirtualAllocEx");
	if(CloseHandle(hProcess) == NULL) strcpy(TPI.cGetLastError,"CloseHandle");
	return FALSE;
}
if(WriteProcessMemory(hProcess,lpAddress,cDllName,MAX_PATH,NULL) == NULL) {
	strcpy(TPI.cGetLastError,"WriteProcessMemory");
	if(VirtualFreeEx(hProcess,lpAddress,0,MEM_RELEASE) == NULL) strcpy(TPI.cGetLastError,"VirtualFreeEx");
	if(CloseHandle(hProcess) == NULL) strcpy(TPI.cGetLastError,"CloseHandle");
	return FALSE;
}
if(CreateRemoteThread(hProcess,NULL,NULL,(LPTHREAD_START_ROUTINE)LoadLibAddress,lpAddress,NULL,NULL) == NULL) {
	strcpy(TPI.cGetLastError,"CreateRemoteThread");
	if(VirtualFreeEx(hProcess,lpAddress,0,MEM_RELEASE) == NULL) strcpy(TPI.cGetLastError,"VirtualFreeEx");
	if(CloseHandle(hProcess) == NULL) strcpy(TPI.cGetLastError,"CloseHandle");
	return FALSE;
}
if(VirtualFreeEx(hProcess,lpAddress,0,MEM_RELEASE) == NULL) strcpy(TPI.cGetLastError,"VirtualFreeEx");
if(CloseHandle(hProcess) == NULL) strcpy(TPI.cGetLastError,"CloseHandle");
return TRUE;
}

int main( ) {
BOOL bPrinted = FALSE;
ZeroMemory(TPI.cDLLName,MAX_PATH);
ZeroMemory(TPI.cLoaderName,MAX_PATH);
HANDLE hMutex = NULL;
if((hMutex = CreateMutex(NULL,FALSE,MUTEX_NAME)) == NULL) {
	ExitProcess(0); // We don't want multiple windows of our application.
}
if(SetConsoleTitle(TITLE_NAME) == NULL) {
	printf(	"Error: 'SetConsoleTitle' failed. Looking up error message with GetLastError():\n %d \n",GetLastError());
	getchar();
	CloseHandle(hMutex);
	return 0;
}
if(GetDLLName(TPI.cDLLName) == FALSE) {
	if(strcmp(TPI.cGetLastError,"") != 0) {
		printf(	"Error: '%s' failed. Looking up error message with GetLastError():\n %d \n",TPI.cGetLastError,GetLastError());
	}
	else {
		printf("Error: DLL-file not found !\n");
	}
	getchar();
	CloseHandle(hMutex);
	return 0;
}
if(fExists(TPI.cDLLName) == FALSE) {
	printf(	"Error: '%s' failed. Looking up error message with GetLastError():\n %d \n",TPI.cGetLastError,GetLastError());
	getchar();
	CloseHandle(hMutex);
	return 0;
}
while(GetProcessID(PROCESS_NAME) == NULL) {
	if(bPrinted == FALSE) {
		printf("Waiting for '%s' to start...\n",PROCESS_NAME);
		bPrinted = TRUE;
	}
	Sleep(10);
}
if(InjectDLL(PROCESS_NAME,TPI.cDLLName) == FALSE) {
	printf("Error: '%s' failed.\nLooking up error message with GetLastError():\n %d \n",TPI.cGetLastError,GetLastError());
	getchar();
}
else if(InjectDLL(PROCESS_NAME,TPI.cDLLName) == TRUE) {
	if(strcmp(TPI.cGetLastError,"") != 0) {
		printf("Error: Injection complete, but failed to close process handle because 'CloseHandle' failed.\nLooking up error message with GetLastError():\n %s \n",TPI.cGetLastError);
	}
	else {
		printf("Success: Injection complete, 0 errors");
	}
	getchar();
}
CloseHandle(hMutex);
return 1;
}

Lenke til kommentar
  • 1 måned senere...
  • 2 måneder senere...
vel, hacks og injectors er jo litt forskjellige.. men ligger i samme grøft.

men hva så? Hacking av f.eks WC3 er drit gøy så lenge du ikke ødlegge gameplay forandre.

 

Om man skal være 100% nøye på ting her så..

 

Hack - Har ikke altids noe direkte med et spill eller slikt å gjøre.

Definisjonen på en såkalt hack (i data verdenen, i den situasjon

at hacken er rettet mot et program) er modifikasjon av minne.

 

Cheat - Er nokk ordet du leter etter, i og med at cheats ikke altids

behøver å modifisere minne, noe en såkalt hack ville gjort.

 

Injectors - Har heller ikke noe direkte å gjøre med det du refererer til,

men kan brukes i sammenheng med en såkalt hack

(Er ikke altids tilfelle at det trengs).

 

 

Btw. denne koden som er posta her (av meg tidligere) inneholder enn del feil (mangler) osv. (kommer tilbake til det så snart som mulig).

 

Hva er egentlig vitsen med cheats om man ikke vil ødelegge for andre sier jeg :p

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...