program DllInject;
uses Windows, Messages, TlHelp32;
{funções necessarias para ativar e interpretar os arquivos arrastados pra janela}
procedure DragAcceptFiles(Wnd: HWND; Accept: BOOL); stdcall; external 'shell32.dll';
function DragQueryFile(Drop: Longint; FileIndex: UINT; FileName: PChar; cb: UINT): UINT; stdcall; external 'shell32.dll';
var
WinClass: TWndClassA;
//var pra criar a classe da janela
Inst, Handle, wcombo: DWORD;
Msg: TMsg;
//var de mensagem
procedure GetListProc;
//função pra preencher o combobox com os nomes dos processos
var
hSnapshot: Cardinal;
hProcessEntry: TProcessEntry32;
begin
SendMessage(wcombo, CB_RESETCONTENT, 1, 1 );
hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
hProcessEntry.dwSize := SizeOf(TProcessEntry32);
if not (Process32First(hSnapshot, hProcessEntry)) then
Exit;
repeat
SendMessage(wcombo, CB_ADDSTRING, 0, integer(string(hProcessEntry.szExeFile)) );
until not (Process32Next(hSnapshot, hProcessEntry));
end;
function GetProcPid(FileName: String): cardinal;
//função para pegar a id do processo
var
hSnapshot: Cardinal;
hProcessEntry: TProcessEntry32;
begin
Result := 0;
hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
hProcessEntry.dwSize := SizeOf(TProcessEntry32);
if not (Process32First(hSnapshot, hProcessEntry)) then
Exit;
repeat
if FileName = hProcessEntry.szExeFile then
Result := hProcessEntry.th32ProcessID;
until not (Process32Next(hSnapshot, hProcessEntry));
end;
Function InjectDll(PID: dword; DLL: pChar):boolean;
//função de injetar a dll
var
BytesWritten, hProcess, hThread, TID: Cardinal;
Parameters: pointer;
pThreadStartRoutine: Pointer;
begin
result:=false;
hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
//pegando o handle do processo
Parameters := VirtualAllocEx( hProcess, nil, Length(DLL)+1, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);
// alocando um espaço na memoria do alvo pra escrever o nome da dll
WriteProcessMemory(hProcess,Parameters,Pointer(DLL),Length(DLL)+1,BytesWritten);
//escrevendo o nome da dll
pThreadStartRoutine := GetProcAddress(GetModuleHandle('
KERNEL32.DLL'), 'LoadLibraryA');
//pegando o endereço da loadlibrary pra usala e da load na dll
hThread := CreateRemoteThread(hProcess, nil, 0, pThreadStartRoutine, Parameters, 0, TID);
// criando uma thread que usará a loadlibrary e o endereço onde escreveu o nome da dll como parametro
if hThread <> 0 then
result:=true;
CloseHandle(hProcess);
//fechando o handle do processo que não será mais usado aqui mesmo
end;
function PegaText(edit

word): string;
//funçãozinha pra pegar o texto do combobox, o programa selecionado e tals
var TextLength: Cardinal;
Text: PAnsiChar;
begin
TextLength:=GetWindowTextLengthA(edit);
GetMem(Text, TextLength+1);
GetWindowTextA(edit, Text, TextLength+1);
result:=string(Text);
end;
function WindowProc(hWnd: DWORD; uMsg, wParam, lParam: Integer): Integer; stdcall;
//a função que recebe as mensagens da janela
var
NumerodeArquivo,na : Integer;
NomedoArquivo,ext : String;
begin
if uMsg = WM_DROPFILES then
//verificando se é a mensagem de "arrastar" arquivo pra janela
begin
SetLength(NomedoArquivo,255);
NumerodeArquivo := DragQueryFile(Wparam,$FFFFFFFF,PChar(NomedoArquivo),255);
for na := 0 to NumerodeArquivo-1 do
begin
DragQueryFile(Wparam,na,PChar(NomedoArquivo),255);
if NomedoArquivo <> '' then
begin
ext:=String(NomedoArquivo);
SetLength(ext,pos(#0,ext)-1);
ext:=copy(ext,length(ext)-3,4);
if (ext = '.dll') or (ext = '.ocx') then
if InjectDll(getprocpid(pegaText(wcombo)),PAnsiChar(NomedoArquivo)) then
messagebox(0,'
Dll injetada com sucesso.','

',0)
else
messagebox(0,'
erro Dll não injetada.','x3',0)
end;
end;
end;
Result:=DefWindowProc(hWnd, uMsg, wParam, lParam);
//envia as mensagens pro interpretador da user32, pra ele fazer todo o trabalho e tals.
if uMsg=WM_DESTROY then
// verificando se a mensagem é uma das que são enviadas pra janela ao clica no X de fechar
begin
PostQuitMessage(0);
//enfia mensagem de saida termino fechamento como preferir
Halt;
//termina o programa o mesmo que um exit;, é um ret pro terminate process, não esquentem a cabeça em aprender isso agora
end;
end;
begin
loadlibrary('
comctl32.dll');
//carregar a dll comctl32 porque a classe do combobox é registrada por ela
Inst:=HInstance;
//a instancia, vcs lembram daquela novela araguaia, então..
with WinClass do
//começando a criar a classe da janela
begin
style := CS_OWNDC or CS_HREDRAW or CS_VREDRAW;
//estilos
lpfnWndProc := @WindowProc;
//função que recebera as mensagens enviadas pra janela
hInstance := Inst;
// a instancia... rs
hbrBackground := createSolidBrush(0);
{
a cor de fundo da janela, vc tbm pode pintar com uma imagem
usando a function CreatePatternBrush(handle de uma bitmap) }
lpszClassname := 'Worgamel';
//nome da classe a ser criar
hCursor := LoadCursor(0, IDC_ARROW);
//aqui vc escolhe o cursor do mouse
end;
RegisterClassA(WinClass);
//Registra a Classe criada
Handle:=CreateWindowExA( WS_EX_WINDOWEDGE or WS_EX_LAYERED, /
/o estilo da janela
'Worgamel',
//nome da classe da janela
'Dll Inject',
//texto do topo da janela
WS_VISIBLE or WS_CAPTION or WS_SYSMENU or WS_MINIM****OX,
//estilos a serem aplicados na janela
300,
//x na tela onde vai ser criado a janela
300,
//Y na tela onde vai ser criado a janela
200,
//largura horinzontal da janela
100,
//largura vertical da janela
0,
//handle de alguma janela parent
0,
//handle do pro menu se tivesse um rs
Inst,
//Instancia, até hoje não sei pra que essa porra
nil
);
wcombo := CreateWindowEx(0, '
COMBOBOX', nil, WS_VISIBLE or CBS_DROPDOWNLIST or WS_CHILD or WS_VSCROLL, 15, 15, 165, 200,handle,0,Inst,nil);
GetListProc;
//enchendo o combobox com a lista de processos
UpdateWindow(Handle);
//joga a janela pra frente
SetLayeredWindowAttributes(handle,0,230, 2);
//dá uma transparencia :3
DragAcceptFiles(handle,true);
//ativando o arrastar arquivos pra janela
while(GetMessage(Msg, 0, 0, 0)) do
//loop de trafego de mensagens e tals
begin
TranslateMessage(msg);
//interpreta a mensagem
DispatchMessage(msg);
//dispacha a mensagem
end;
end.