#include <iostream>
#include <direct.h>
#include <windows.h>
#include <tlhelp32.h>
using namespace std;
char* GetCurrentDir()
{
char* szRet = (char*)malloc(MAX_PATH);
_getcwd(szRet, MAX_PATH);
return szRet;
)
LPCTSTR SzToLPCTSTR(char* szString)
{
LPTSTR lpszRet;
size_t side = strlen(szString)+1;
lpszRet = (LPTSTR)malloc(MAX_PATH);
mbstowcs_s(NULL, lpszRet, size, szString, _TRUNCATE);
return lpszRet;
)
void WaitForProcessToAppear (LPCTSTR, lpsztProc, DWORD dwDelay)
{
HANDLE hSnap;
PROCESSENTRY32 peProc;
BOOL bAppeared = FALSE;
while(!bAppeared)
{
if ((hSnap = CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0)) != INVALID_HANDLE_VALUE
(
peProc.dwSize = sizeof(PROCESSENTRY32);
if(Process32First(hSnap, &peProc))
while(Process32Next(hSnap, &peProc) && !bAppeared)
if(!lstrcmp(lpcszProc, peProc.szExeFile))
bAppeared = TRUE;
}
CloseHandle(hSnap);
Sleep(dwDelay);
}
)
DWORD GetProcessIdByName(LPCTSTR lpcszProc)
{
HANDLE hSnap;
PROCESSENTRY32 peProc;
DWORD dwRet = -1;
if((hSnap = CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0)) != INVALID_HANDLE_VALUE)
{
peProc.dwSize = sizeof(PROCESSENTRY32);
if(Process32First(hSnap, &peProc))
while(Process32Next(hSnap, &peProc))
if(!lstrcmp(lpcszProc, peProc.szExeFile))
dwRet = peProc.th32ProcessID;
}
CloseHandle(hSnap);
return dwRet;
)
BOOL InjectDll(DWORD dwPid, char* szDllPath)
{
DWORD dwMemSize;
HANDLE hProc;
LPVOID IpRemoteMem, IpLoadLibrary;
BOOL bRet = FALSE;
if((hProc = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_CREATE_THREAD, FALSE, dwPid)) != NULL)
{
dwMemSize = strlen(szDllPath)+1;
if((IpRemoteMem = VirtualAllocEx(hProc, NULL, dwMemSize, MEM_COMMIT, PAGE_READWRITE) != NULL)
if(WriteProcessMemory(hProc, IpRemoteMem, (LPCVOID)szDllPath, dwMemSize, NULL))
{
IpLoadLibrary = GetProcAddress(GetModuleHandleA("Kernel32.dll"), "LoadLibraryA");
if(CreateRemoteThread(hProc, NULL, 0, (LPTHREAD_START_ROUTINE)IpLoadLibrary, IpRemoteMem, 0, NULL)!= NULL)
bRet = True
)
}
CloseHandle(hProc);
return bRet;
)
int main()
{
char szProc[MAX_PATH], szDll[MAX_PATH];
char* szDllPath = (char*)malloc(MAX_PATH);
LPTSTR lpszProc = NULL;
for(;;)
{
cout << "Process: ";
cin >> szProc;
cout << "DLL: ";
cin >> szDll;
szDllPath = GetCurrentDir();
strcat_s(szDllPath, MAX_PATH, "\\");
strcat_s(szDllPath, MAX_PATH, szDll);
cout << "Waiting for process..." << endl;
WaitForProcessToAppear(SzToLPCTSTR(szProc), 100);
if(InjectDll(GetProcessIdByName(SzToLPCTSTR(szProc)), szDllPath))
cout << "Injection Success!" << endl;
else
cout << "Failed to inject!" << endl;
cout << "\n";
}
return 0;
}
------ Build started: Project: Luigi, Configuration: Debug Win32 ------
Compiling...
main.cpp
c:\documents and settings\-----\my documents\visual studio 2008\projects\luigi\luigi\main.cpp(23) : error C2065: 'size' : undeclared identifier
c:\documents and settings\-----\my documents\visual studio 2008\projects\luigi\luigi\main.cpp(27) : error C2061: syntax error : identifier 'lpsztProc'
c:\documents and settings\-----\my documents\visual studio 2008\projects\luigi\luigi\main.cpp(35) : error C3861: 'CreateToolHelp32Snapshot': identifier not found
c:\documents and settings\-----\my documents\visual studio 2008\projects\luigi\luigi\main.cpp(42) : error C2065: 'lpcszProc' : undeclared identifier
c:\documents and settings\-----\my documents\visual studio 2008\projects\luigi\luigi\main.cpp(48) : error C2065: 'dwDelay' : undeclared identifier
c:\documents and settings\-----\my documents\visual studio 2008\projects\luigi\luigi\main.cpp(59) : error C3861: 'CreateToolHelp32Snapshot': identifier not found
c:\documents and settings\-----\my documents\visual studio 2008\projects\luigi\luigi\main.cpp(88) : error C2440: '=' : cannot convert from 'bool' to 'LPVOID'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
c:\documents and settings\-----\my documents\visual studio 2008\projects\luigi\luigi\main.cpp(89) : error C2143: syntax error : missing ')' before '{'
c:\documents and settings\-----\my documents\visual studio 2008\projects\luigi\luigi\main.cpp(96) : error C2065: 'True' : undeclared identifier
c:\documents and settings\-----\my documents\visual studio 2008\projects\luigi\luigi\main.cpp(96) : error C2143: syntax error : missing ';' before '}'
c:\documents and settings\-----\my documents\visual studio 2008\projects\luigi\luigi\main.cpp(119) : error C2660: 'WaitForProcessToAppear' : function does not take 2 arguments
Build log was saved at "file://c:\Documents and Settings\-----\My Documents\Visual Studio 2008\Projects\Luigi\Luigi\Debug\BuildLog.htm"
Luigi - 11 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
#include <iostream>
#include <direct.h>
#include <windows.h>
#include <tlhelp32.h>
using namespace std;
char* GetCurrentDir()
{
char* szRet = (char*)malloc(MAX_PATH);
_getcwd(szRet, MAX_PATH);
return szRet;
}
LPCTSTR SzToLPCTSTR(char* szString)
{
LPTSTR lpszRet;
size_t side = strlen(szString)+1;
lpszRet = (LPTSTR)malloc(MAX_PATH);
mbstowcs_s(NULL, lpszRet, size, szString, _TRUNCATE);
return lpszRet;
}
void WaitForProcessToAppear (LPCTSTR, lpsztProc, DWORD dwDelay)
{
HANDLE hSnap;
PROCESSENTRY32 peProc;
BOOL bAppeared = FALSE;
while(!bAppeared)
{
if ((hSnap = CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0)) != INVALID_HANDLE_VALUE)
{
peProc.dwSize = sizeof(PROCESSENTRY32);
if(Process32First(hSnap, &peProc))
{
while(Process32Next(hSnap, &peProc) && !bAppeared)
{
if(!lstrcmp(lpcszProc, peProc.szExeFile))
{
bAppeared = TRUE;
}
CloseHandle(hSnap);
}
Sleep(dwDelay);
}
}
}
}
DWORD GetProcessIdByName(LPCTSTR lpcszProc)
{
HANDLE hSnap;
PROCESSENTRY32 peProc;
DWORD dwRet = -1;
if((hSnap = CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0)) != INVALID_HANDLE_VALUE)
{
peProc.dwSize = sizeof(PROCESSENTRY32);
if(Process32First(hSnap, &peProc))
{
while(Process32Next(hSnap, &peProc))
{
if(!lstrcmp(lpcszProc, peProc.szExeFile))
{
dwRet = peProc.th32ProcessID;
}
CloseHandle(hSnap);
}
}
return dwRet;
}
}
BOOL InjectDll(DWORD dwPid, char* szDllPath)
{
DWORD dwMemSize;
HANDLE hProc;
LPVOID IpRemoteMem, IpLoadLibrary;
BOOL bRet = FALSE;
if((hProc = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_CREATE_THREAD, FALSE, dwPid)) != NULL)
{
dwMemSize = strlen(szDllPath)+1;
if((IpRemoteMem = VirtualAllocEx(hProc, NULL, dwMemSize, MEM_COMMIT, PAGE_READWRITE) != NULL)
{
if(WriteProcessMemory(hProc, IpRemoteMem, (LPCVOID)szDllPath, dwMemSize, NULL))
{
IpLoadLibrary = GetProcAddress(GetModuleHandleA("Kernel32.dll"), "LoadLibraryA");
if(CreateRemoteThread(hProc, NULL, 0, (LPTHREAD_START_ROUTINE)IpLoadLibrary, IpRemoteMem, 0, NULL)!= NULL)
{
bRet = True
}
CloseHandle(hProc);
}
return bRet;
}
}
}
int main()
{
char szProc[MAX_PATH], szDll[MAX_PATH];
char* szDllPath = (char*)malloc(MAX_PATH);
LPTSTR lpszProc = NULL;
for(;;)
{
cout << "Process: ";
cin >> szProc;
cout << "DLL: ";
cin >> szDll;
szDllPath = GetCurrentDir();
strcat_s(szDllPath, MAX_PATH, "\\");
strcat_s(szDllPath, MAX_PATH, szDll);
cout << "Waiting for process..." << endl;
WaitForProcessToAppear(SzToLPCTSTR(szProc), 100);
if(InjectDll(GetProcessIdByName(SzToLPCTSTR(szProc)), szDllPath))
{
cout << "Injection Success!" << endl;
}
else
{
cout << "Failed to inject!" << endl;
cout << "\n";
}
}
return 0;
}
------ Build started: Project: Luigi, Configuration: Debug Win32 ------
Compiling...
main.cpp
c:\documents and settings\-----\my documents\visual studio 2008\projects\luigi\luigi\main.cpp(23) : error C2065: 'size' : undeclared identifier
c:\documents and settings\-----\my documents\visual studio 2008\projects\luigi\luigi\main.cpp(27) : error C2061: syntax error : identifier 'lpsztProc'
c:\documents and settings\-----\my documents\visual studio 2008\projects\luigi\luigi\main.cpp(35) : error C3861: 'CreateToolHelp32Snapshot': identifier not found
c:\documents and settings\-----\my documents\visual studio 2008\projects\luigi\luigi\main.cpp(42) : error C2065: 'lpcszProc' : undeclared identifier
c:\documents and settings\-----\my documents\visual studio 2008\projects\luigi\luigi\main.cpp(48) : error C2065: 'dwDelay' : undeclared identifier
c:\documents and settings\-----\my documents\visual studio 2008\projects\luigi\luigi\main.cpp(59) : error C3861: 'CreateToolHelp32Snapshot': identifier not found
c:\documents and settings\-----\my documents\visual studio 2008\projects\luigi\luigi\main.cpp(88) : error C2440: '=' : cannot convert from 'bool' to 'LPVOID'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
c:\documents and settings\-----\my documents\visual studio 2008\projects\luigi\luigi\main.cpp(89) : error C2143: syntax error : missing ')' before '{'
c:\documents and settings\-----\my documents\visual studio 2008\projects\luigi\luigi\main.cpp(96) : error C2065: 'True' : undeclared identifier
c:\documents and settings\-----\my documents\visual studio 2008\projects\luigi\luigi\main.cpp(96) : error C2143: syntax error : missing ';' before '}'
c:\documents and settings\-----\my documents\visual studio 2008\projects\luigi\luigi\main.cpp(119) : error C2660: 'WaitForProcessToAppear' : function does not take 2 arguments
Build log was saved at "file://c:\Documents and Settings\-----\My Documents\Visual Studio 2008\Projects\Luigi\Luigi\Debug\BuildLog.htm"
Luigi - 11 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

LPCTSTR SzToLPCTSTR(char* szString)
{
LPTSTR lpszRet;
size_t side = strlen(szString)+1;
lpszRet = (LPTSTR)malloc(MAX_PATH);
mbstowcs_s(NULL, lpszRet, size, szString, _TRUNCATE);
return lpszRet;
}

Perhaps now that you see what the changes are, compare and see if it make sense with what the error message was for each of the errors. Learning opportunity here 
#include <iostream>
#include <direct.h>
#include <windows.h>
#include <tlhelp32.h>
using namespace std;
char* GetCurrentDir()
{
char* szRet = (char*)malloc(MAX_PATH);
_getcwd(szRet, MAX_PATH);
return szRet;
}
LPCTSTR SzToLPCTSTR(char* szString)
{
LPTSTR lpszRet;
size_t size = strlen(szString)+1;
lpszRet = (LPTSTR)malloc(MAX_PATH);
mbstowcs_s(NULL, lpszRet, size, szString, _TRUNCATE);
return lpszRet;
}
void WaitForProcessToAppear(LPCTSTR lpszProc, DWORD dwDelay)
{
HANDLE hSnap;
PROCESSENTRY32 peProc;
BOOL bAppeared = FALSE;
while(!bAppeared)
{
if ((hSnap = CreateToolhelp32Snapshot((DWORD)TH32CS_SNAPPROCESS, (DWORD)0)) != INVALID_HANDLE_VALUE)
{
peProc.dwSize = sizeof(PROCESSENTRY32);
if(Process32First(hSnap, &peProc))
{
while(Process32Next(hSnap, &peProc) && !bAppeared)
{
if(!lstrcmp(lpszProc, peProc.szExeFile))
{
bAppeared = TRUE;
}
CloseHandle(hSnap);
}
Sleep(dwDelay);
}
}
}
}
DWORD GetProcessIdByName(LPCTSTR lpcszProc)
{
HANDLE hSnap;
PROCESSENTRY32 peProc;
DWORD dwRet = -1;
if((hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)) != INVALID_HANDLE_VALUE)
{
peProc.dwSize = sizeof(PROCESSENTRY32);
if(Process32First(hSnap, &peProc))
{
while(Process32Next(hSnap, &peProc))
{
if(!lstrcmp(lpcszProc, peProc.szExeFile))
{
dwRet = peProc.th32ProcessID;
}
CloseHandle(hSnap);
}
}
return dwRet;
}
}
BOOL InjectDll(DWORD dwPid, char* szDllPath)
{
DWORD dwMemSize;
HANDLE hProc;
LPVOID IpRemoteMem, IpLoadLibrary;
BOOL bRet = FALSE;
if((hProc = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_CREATE_THREAD, FALSE, dwPid)) != NULL)
{
dwMemSize = strlen(szDllPath)+1;
if( (IpRemoteMem = VirtualAllocEx(hProc, NULL, dwMemSize, MEM_COMMIT, PAGE_READWRITE)) != NULL)
{
if(WriteProcessMemory(hProc, IpRemoteMem, (LPCVOID)szDllPath, dwMemSize, NULL))
{
IpLoadLibrary = GetProcAddress(GetModuleHandleA("Kernel32.dll"), "LoadLibraryA");
if(CreateRemoteThread(hProc, NULL, 0, (LPTHREAD_START_ROUTINE)IpLoadLibrary, IpRemoteMem, 0, NULL)!= NULL)
{
bRet = TRUE;
}
CloseHandle(hProc);
}
return bRet;
}
}
}
int main()
{
char szProc[MAX_PATH], szDll[MAX_PATH];
char* szDllPath = (char*)malloc(MAX_PATH);
LPTSTR lpszProc = NULL;
for(;;)
{
cout << "Process: ";
cin >> szProc;
cout << "DLL: ";
cin >> szDll;
szDllPath = GetCurrentDir();
strcat_s(szDllPath, MAX_PATH, "\\");
strcat_s(szDllPath, MAX_PATH, szDll);
cout << "Waiting for process..." << endl;
WaitForProcessToAppear(SzToLPCTSTR(szProc), 100);
if(InjectDll(GetProcessIdByName(SzToLPCTSTR(szProc)), szDllPath))
{
cout << "Injection Success!" << endl;
}
else
{
cout << "Failed to inject!" << endl;
cout << "\n";
}
}
return 0;
}
