//DLL injection with GUI
#include 
#include 

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
    HWND hwnd;            
    MSG messages;          
    WNDCLASSEX wincl;    
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;    
    wincl.style = CS_DBLCLKS;                
    wincl.cbSize = sizeof (WNDCLASSEX);
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                
    wincl.cbClsExtra = 0;                    
    wincl.cbWndExtra = 0;                    
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND+7;
  
    if (!RegisterClassEx (&wincl))
        return 0;
      hwnd = CreateWindowEx (
          0,                  
          szClassName,        
          "The Game Injector ",      
          WS_SYSMENU|WS_VISIBLE, 
          CW_USEDEFAULT,      
          CW_USEDEFAULT,      
          400,                
          200,              
          HWND_DESKTOP,        
          NULL,                
          hThisInstance,      
          NULL                
          );
    
    
    while (GetMessage (&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }
    return messages.wParam;
}
HWND Input1,Input2;
HWND Inject;

BOOL SetPrivilege(LPSTR type) // more flexible 
{
HANDLE Htoken;
TOKEN_PRIVILEGES tokprivls;
if(!OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &Htoken)){
                      return 0;
                      }
tokprivls.PrivilegeCount = 1;
LookupPrivilegeValue(NULL, type, &tokprivls.Privileges[0].Luid);
tokprivls.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
BOOL Success =AdjustTokenPrivileges( Htoken, FALSE, &tokprivls, sizeof(tokprivls), NULL, NULL);
CloseHandle(Htoken);
return Success;

}
HANDLE GetHandle(char *proc)
{
      PROCESSENTRY32 pe32;
      pe32.dwSize = sizeof(pe32);
      HANDLE Snap = CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
      Process32First(Snap,&pe32);
      do{
          if(stricmp(pe32.szExeFile,proc)==0)
          {
                                            SetPrivilege(SE_DEBUG_NAME);
                                            return OpenProcess(PROCESS_ALL_ACCESS,0,pe32.th32ProcessID);
          }}while(Process32Next(Snap,&pe32));CloseHandle(Snap);
}
void InjectDll(char* Name, char *path)
{
HANDLE hProcess = GetHandle(Name);
if(hProcess){
            int DllPath = strlen(path) + 20; 
            LPVOID MemSp = VirtualAllocEx(hProcess,NULL,DllPath,MEM_COMMIT,PAGE_READWRITE);
            WriteProcessMemory(hProcess,MemSp,path,DllPath,NULL);
            HANDLE hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)GetProcAddress(LoadLi
brary("Kernel32.dll"), "LoadLibraryA"), MemSp, 0, NULL);
            if(hThread){
                        WaitForSingleObject(hThread, 30000); 
                        CloseHandle(hThread);
                                }
                        VirtualFreeEx(hProcess, MemSp, 0, MEM_RELEASE);
            }
else {MessageBox(0,"Could not get the process handle .",0,0);}            
}
                        
char proc[50],dll[260];
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    
  HWND hBmpStat;
    HBITMAP hBitmap;
    HFONT hFont ;
    switch (message)              
    {
        case WM_CREATE:
            hFont = CreateFont(20, 0, 0, 10, FW_DONTCARE, 0, 0, 0, ANSI_CHARSET, OUT_TT_PRECIS, CLIP_TT_ALWAYS, DEFAULT_QUALITY, FF_DONTCARE, "Microsoft Sans MS");
            
            hBitmap  = (HBITMAP) LoadImage(NULL, "C:\\WINDOWS\\system32\\setup.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
            // zomfg h4x
            hBmpStat = CreateWindowEx(0,"Static","",WS_VISIBLE | WS_CHILD | SS_BITMAP,
                      -200,-220,0,0,hwnd,0,0,0);
            
            SendMessage(hBmpStat, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM) hBitmap);
            
            Inject = CreateWindow("Button","INJECT",WS_CHILD | WS_VISIBLE | WS_BORDER,
                      190, 20, 180, 38,hwnd,(HMENU)100,0,NULL);
            Input1 = CreateWindow("Edit", "wmplayer.exe",WS_CHILD | WS_VISIBLE | WS_BORDER,
                      10, 20, 180,18,hwnd,0,0,NULL);
            Input2 = CreateWindow("Edit", "c:\\sample.dll",WS_CHILD | WS_VISIBLE | WS_BORDER,
                      10, 40, 180,18,hwnd,0,0,NULL);
                      SendMessage(Inject,WM_SETFONT,WPARAM(hFont),0);
                      break;  
        case WM_DESTROY:
            PostQuitMessage (0);      
            break;
            case WM_COMMAND:
                switch(LOWORD(wParam))
                      {
                          case 100:
                              SendMessage(Input1,WM_GETTEXT,sizeof(proc),LPARAM(proc));
                              if(proc!=0)
                              {
                                          SendMessage(Input2,WM_GETTEXT,sizeof(dll),LPARAM(dll));
                                          if(dll!=0)
                                          InjectDll(proc,dll);
                              }break;
                        default:break;        
                                            }break;
                
        default:                    
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
    return 0;
}