Code
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:Dword): 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.',':D',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.