Código:
type TInjectParams = record LoadLibrary: function (lpLibFileName: PAnsiChar): Cardinal; stdcall; LibName: PAnsiChar; GetProcAddress: function (hModule: Cardinal; lpProcName: PAnsiChar): Pointer; stdcall; ProcName: PAnsiChar; end; PInjectParams = ^TInjectParams;
Código:
function GetProcess(proc: string): Cardinal; var Snap: THandle; pe: TProcessEntry32; begin Snap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); if Snap = 0 then Exit; if Process32First(Snap,pe) then begin repeat if proc = pe.szExeFile then begin Result:=pe.th32ProcessID; break; end; until not Process32Next(Snap,pe) end end;
Código:
function WriteString(Process: Cardinal; s: string): Pointer; var bytes: Cardinal; begin Result:=VirtualAllocEx(Process, nil, length(s) + 1, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE); WriteProcessMemory(Process, Result , pchar(s), length(s) + 1, bytes); end;
Código:
function WriteData(Process, dwSize: Cardinal; RemoteData: pointer): pointer; var bytes: Cardinal; begin Result:=VirtualAllocEx(Process, nil, dwSize, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE); WriteProcessMemory(Process, Result, RemoteData, dwSize, bytes); end;
Código:
procedure RemoteFunction(Parametros: PInjectParams); stdcall; var proc: procedure; stdcall; begin proc:=Parametros^.GetProcAddress(Parametros^.LoadLibrary(Parametros^.LibName),Parametros^.ProcName); proc; end;
Código:
procedure RemoteFunctionEnd; stdcall; begin; end;
Código:
procedure ChangePrivilege(szPrivilege: PChar; fEnable: Boolean); var NewState: TTokenPrivileges; luid: TLargeInteger; hToken: THandle; ReturnLength: DWord; begin OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken); LookupPrivilegeValue(nil, szPrivilege, luid); NewState.PrivilegeCount := 1; NewState.Privileges[0].Luid := luid; if (fEnable) then NewState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED else NewState.Privileges[0].Attributes := 0; AdjustTokenPrivileges(hToken, False, NewState, SizeOf(NewState), nil, ReturnLength); CloseHandle(hToken); end;
Código:
procedure Inject(process, dll, code: string); var PID, hProcess, ThreadId, ThreadHandle: Cardinal; RemoteData,RemoteFunc,LibFileName,ProcName: pointer; Parametros: TInjectParams; begin {Pega o Handle do processo} PID:=GetProcess(Process); {Seta o privilégio de debug} ChangePrivilege('SeDebugPrivilege', True); {Abre o processo} hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, PID); {Define os parâmetros que serão usados para executar a procedure} LibFileName:=WriteString(hProcess, dll); ProcName:=WriteString(hProcess, code); Parametros.LoadLibrary:=GetProcAddress(GetModuleHandle('kernel32'), 'LoadLibraryA'); Parametros.LibName:=LibFileName; Parametros.GetProcAddress:=GetProcAddress(GetModuleHandle('kernel32'), 'GetProcAddress'); Parametros.ProcName:=ProcName; {Abre um novo espaço de memória para guardar os parâmetros} RemoteData:=WriteData(hProcess, sizeof(Parametros), @Parametros); {Abre um novo espaço de memória para guardar a procedure} RemoteFunc:=WriteData(hProcess, integer(@RemoteFunctionEnd) - integer(@RemoteFunction), @RemoteFunction); {Cria a thread que executará a procedure} ThreadHandle:=CreateRemoteThread(hProcess, nil, 0, RemoteFunc, RemoteData, 0, ThreadId); WaitForSingleObject(ThreadHandle, 3000); {Libera as memórias criadas} VirtualFreeEx(hProcess,LibFileName,0,MEM_RELEASE); VirtualFreeEx(hProcess,ProcName,0,MEM_RELEASE); VirtualFreeEx(hProcess,RemoteFunc,0,MEM_RELEASE); VirtualFreeEx(hProcess,RemoteData,0,MEM_RELEASE); end;
3) Pondo tudo em prática
Criem uma DLL e adicionem uma rótina simples, como:
Código:
procedure Msg; begin MessageBox(0,'Teste','Code Injected',mb_ok); end;
**Não esqueçam de declarar "windows" no uses
Depois exportem essa função. Digitem o seguinte abaixo de todas as eventuais rotinas que sua DLL tem:
Compilem essa DLL com o nome 'invaders.DLL'. Depois criem um projeto novo e coloquem um botão, além de todo o procedimento descrito acima. No onClick desse botão coloquem:
Código:
Inject('notepad.exe','C:\Projects\invaders.DLL','Msg');
**Não se esqueçam de ao invés de "C:\Projects\invaders.DLL", colocar o path da sua dll e de abrir o notepad antes de clicar no botão
Espero ter sido claro na explicação... Não me aprofundei muito na parte teórica pois teria que falar de assembly e ia acabar ficando ruim pra mim, vendo que eu não sou expert nessa linguagem, deixo este trabalho para quem tem mais experiência e estiver disposto!!
0 comentários:
Postar um comentário