//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "dumper_main2.h"
#include "params.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

#define DLL_NAME_LEN 100

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  HANDLE hToken;
  TOKEN_PRIVILEGES tk;
  BOOL res;
  DWORD PID;
  PID=cPid->Text.ToInt();
  //Получаем привелегии отладки (иногда это и не нужно, но все таки)
  res=OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken);
  res=LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tk.Privileges[0].Luid);
  tk.PrivilegeCount=1;
  tk.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
  res=AdjustTokenPrivileges(hToken,false,&tk,NULL,NULL,NULL);
  if( !res )
  {
    MessageBox(NULL,"Cannot Get Debug Privileges","Error",MB_OK);
    return;
  }
  //открываем процесс который собираемся дампить (тут PID я в PEditor посмотрел)
  HANDLE h=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
  if( !h )
  {
    MessageBox(NULL,"Cannot open process","Error",MB_OK);
    return;
  }
  FARPROC pLoadlibrarya=GetProcAddress(LoadLibrary("kernel32.dll"),"LoadLibraryA");
  char dll[DLL_NAME_LEN];
  memset(dll,0,DLL_NAME_LEN);
  AnsiString DllName=ExtractFilePath(ParamStr(0))+"inject.dll";
  memcpy(dll,DllName.c_str(),DllName.Length());
  //пробиваем место под переменную с именем DLL
  LPVOID p=VirtualAllocEx(h,NULL,DLL_NAME_LEN,MEM_COMMIT,PAGE_READWRITE);
  DWORD wr;
  //пишем туда нашу строчку с именем DLL
  res=WriteProcessMemory(h,p,dll,DLL_NAME_LEN,&wr);
  DWORD thrid;
  //создаем thread в нужном нам процессе
  //Тут я в качестве lpStartAddress указал адрес АПИ LoadLibraryA, а как lpParameter я передаю имя DLL.
  CreateRemoteThread(h,NULL,0,(LPTHREAD_START_ROUTINE)pLoadlibrarya,p,0,&thrid);
}
//---------------------------------------------------------------------------

