#include <windows.h>
#include <stdio.h>
#include <tlhelp32.h>
#include <shlwapi.h>
#define CREATE_THREAD_ACCESS (PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ)
bool SetDebugPrivileges()
{
HANDLE hToken;
TOKEN_PRIVILEGES tokenPriv;
tokenPriv.PrivilegeCount = 1;
if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
return false;
if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tokenPriv.Privileges[0].Luid))
return false;
tokenPriv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if(!AdjustTokenPrivileges(hToken, false, &tokenPriv, sizeof(TOKEN_PRIVILEGES), NULL, NULL))
return false;
return true;
}
unsigned long GetTargetProcessIdFromProcname(char *procName)
{
PROCESSENTRY32 pe;
HANDLE thSnapshot;
BOOL retval, ProcFound = false;
thSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(thSnapshot == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, "Error: unable to create toolhelp snapshot", "Loader", MB_OK);
return false;
}
pe.dwSize = sizeof(PROCESSENTRY32);
retval = Process32First(thSnapshot, &pe);
while(retval)
{
if(StrStrI(pe.szExeFile, procName) )
{
ProcFound = true;
break;
}
retval = Process32Next(thSnapshot,&pe);
pe.dwSize = sizeof(PROCESSENTRY32);
}
return pe.th32ProcessID;
}
typedef void (*burn)(int,int);
struct Parameter{
burn pFunc;
int a;
int b;
};
static void burnFunc(Parameter *p)
{
p->pFunc(p->a,p->b);
}
void endFunc(void) { }
int main() {
Parameter p;
p.a = 10;
p.b = 20;
//Adresse der Funktion void burn(int,int) in burn.exe
p.pFunc = (burn)0x00401290;
LPVOID param,func;
HANDLE hThread;
//Debug Privilegien holen
SetDebugPrivileges();
DWORD procid = GetTargetProcessIdFromProcname("burn.exe");
if(procid == 0x00000000){
printf("Error: Process not found!");
getchar();
return 0;
}
//Prozess öffnen
HANDLE Proc = OpenProcess(CREATE_THREAD_ACCESS,FALSE,procid);
//Speicher für Parameter Struktur reservieren
param=VirtualAllocEx(Proc, NULL, sizeof(Parameter), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
//Speicher für Funktion reservieren
func=VirtualAllocEx(Proc, NULL, (DWORD)((DWORD)endFunc-(DWORD)burnFunc), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
//Parameter schreiben
WriteProcessMemory(Proc, param, (LPVOID)&p, sizeof(Parameter), NULL);
//Funktion reinschreiben
WriteProcessMemory(Proc, func, (LPVOID)burnFunc, (DWORD)((DWORD)endFunc-(DWORD)burnFunc), NULL);
//Funktion aufrufen
hThread = CreateRemoteThread(Proc, NULL, 0, (LPTHREAD_START_ROUTINE)func, param, 0, NULL);
//Warten bis Thread fertig
WaitForSingleObject(hThread,INFINITE);
//Funktion aus dem Speicher entfernen
VirtualFreeEx(Proc,(LPVOID)func,0,MEM_RELEASE);
//Parameter entfernen
VirtualFreeEx(Proc,(LPVOID)param,0,MEM_RELEASE);
//Handle schließen
CloseHandle(Proc);
getchar();
return 0;
}