Code:
#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
};
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;
}
Please report bugs or anything else.