Postado Qui Dez 20, 2012 7:46 pm
Neste artigo irei ensinar como criar um injetor de DLL.
Muitas vezes ficamos dependentes de um injetor de DLL pra injetar o trainer que fizemos em .dll, e normalmente a maioria dos injectors vêm infectados.
A injeção de dll pelo método simples consiste em:
1 - Pegar o address da API LoadLibraryA. Essa API carrega uma DLL no processo que a chamou. O address dessa API é o mesmo em todos os processos.
2 - Abrir o processo que se quer injetar a dll, com privilégios de acesso total.
3 - Alocar memória no processo alvo para guardar o caminho da DLL a ser injetada.
4 - Escrever no endereço alocado o caminho da DLL.
5 - Criar uma thread no processo alvo, com parametro sendo o ponteiro pra string alocada no processo alvo que contem o caminho da dll.
6 - Aguardar o termino da thread criada.
7 - Fazer a limpeza.
Agora vamos programar.
1 - Inicie um novo projeto no Delphi.
Adicione os seguintes componentes com as devidas propriedades no form:
Código PHP:
object Label1: TLabel
Left = 8
Top = 8
Width = 47
Height = 13
Caption = 'Processo:'
end
object Edit1: TEdit
Left = 8
Top = 24
Width = 121
Height = 21
TabOrder = 0
end
object Label2: TLabel
Left = 136
Top = 8
Width = 20
Height = 13
Caption = 'DLL'
end
object Edit2: TEdit
Left = 136
Top = 24
Width = 121
Height = 21
TabOrder = 1
end
object Button1: TButton
Left = 264
Top = 32
Width = 57
Height = 17
Caption = 'Carregar'
TabOrder = 2
end
object OpenDialog1: TOpenDialog
Left = 152
Top = 56
end
object Timer1: TTimer
Enabled = False
Interval = 10
Left = 120
Top = 56
end
object Button2: TButton
Left = 8
Top = 56
Width = 105
Height = 25
Caption = 'Aguardar Processo'
TabOrder = 3
end
- Vá ao Code Explorer (View/Code Explorer) e declare a unit TlHelp32
3 - Declare a seguinte função acima de "end.":
function GetPID(ProcessName: string): DWORD;
var MyHandle: THandle;
Struct: TProcessEntry32;
begin
Result:=0;
try
MyHandle:=CreateToolHelp32SnapShot(TH32CS_SNAPPROC ESS, 0);
Struct.dwSize:=Sizeof(TProcessEntry32);
if Process32First(MyHandle, Struct) then
if Struct.szExeFile=ProcessName then
begin
Result:=Struct.th32ProcessID;
Exit;
end;
while Process32Next(MyHandle, Struct) do
if Struct.szExeFile=ProcessName then
begin
Result:=Struct.th32ProcessID;
Exit;
end;
except on exception do
Exit;
end;
end;
3 - Declare a seguinte função acima de "end.":
function GetPID(ProcessName: string): DWORD;
var MyHandle: THandle;
Struct: TProcessEntry32;
begin
Result:=0;
try
MyHandle:=CreateToolHelp32SnapShot(TH32CS_SNAPPROC ESS, 0);
Struct.dwSize:=Sizeof(TProcessEntry32);
if Process32First(MyHandle, Struct) then
if Struct.szExeFile=ProcessName then
begin
Result:=Struct.th32ProcessID;
Exit;
end;
while Process32Next(MyHandle, Struct) do
if Struct.szExeFile=ProcessName then
begin
Result:=Struct.th32ProcessID;
Exit;
end;
except on exception do
Exit;
end;
end;
4 - Declare esta função logo abaixo da função declarada acima:
function InjectDll(PID:DWORD; sDll:string):Boolean;
var
hLib: Pointer;
hThread: THandle;
pMod: Pointer;
hOpen: THandle;
dWritten: Cardinal;
ThreadID: Cardinal;
begin
Result := FALSE;
hOpen := OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
if hOpen <> INVALID_HANDLE_VALUE then
begin
hLib := GetProcAddress(GetModuleHandle(PChar('kernel32.dll ')), PChar('LoadLibraryA'));
pMod := VirtualAllocEx(hOpen, nil, Length(sDll) + 1, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if WriteProcessMemory(hOpen, pMod, @sDll[1], Length(sDll), dWritten) then
Result := TRUE;
hThread := CreateRemoteThread(hOpen, nil, 0, hLib, pMod, 0, ThreadID);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hOpen);
CloseHandle(hThread);
end;
end;
5 - Agora volte ao Form (F12) e dê dois cliques no botão "Carregar". Então insira este algoritmo no evento OnClick dele
if not OpenDialog1.Execute then Exit;
Edit2.Text:=OpenDialog1.FileName;
6 - Volte ao Form (F12) e dê dois cliques no botão "Aguardar Processo". No evento OnClick dele insira este código:
Timer1.Enabled:=True;
7 - Volte ao Form (F12) e dê dois cliques sobre o "Timer1". No evento OnClick dele insira este algorítmo:
var PID: DWORD;
begin
Timer1.Enabled:=False;
PID:=GetPID(Edit1.Text);
if PID=0 then
begin
Timer1.Enabled:=True;
Exit;
end;
Timer1.Enabled:=False;
if InjectDll(PID, Edit2.Text) then
MessageBoxA(Handle, 'DLL injetada com sucesso!', 'DLL Injector', MB_ICONEXCLAMATION+MB_SYSTEMMODAL)
else
MessageBoxA(Handle, 'Erro ao injetar DLL.', 'DLL Injector', MB_ICONERROR+MB_SYSTEMMODAL);
8 - Compile o projeto (F9) e seja feliz.
Modo de usar:
1 - Insira o nome do processo.
2 - Carregue a DLL a ser injetada.
3 - Clique em aguardar processo.
4 - Inicie o processo e a DLL será injetada.
Muitas vezes ficamos dependentes de um injetor de DLL pra injetar o trainer que fizemos em .dll, e normalmente a maioria dos injectors vêm infectados.
A injeção de dll pelo método simples consiste em:
1 - Pegar o address da API LoadLibraryA. Essa API carrega uma DLL no processo que a chamou. O address dessa API é o mesmo em todos os processos.
2 - Abrir o processo que se quer injetar a dll, com privilégios de acesso total.
3 - Alocar memória no processo alvo para guardar o caminho da DLL a ser injetada.
4 - Escrever no endereço alocado o caminho da DLL.
5 - Criar uma thread no processo alvo, com parametro sendo o ponteiro pra string alocada no processo alvo que contem o caminho da dll.
6 - Aguardar o termino da thread criada.
7 - Fazer a limpeza.
Agora vamos programar.
1 - Inicie um novo projeto no Delphi.
Adicione os seguintes componentes com as devidas propriedades no form:
Código PHP:
object Label1: TLabel
Left = 8
Top = 8
Width = 47
Height = 13
Caption = 'Processo:'
end
object Edit1: TEdit
Left = 8
Top = 24
Width = 121
Height = 21
TabOrder = 0
end
object Label2: TLabel
Left = 136
Top = 8
Width = 20
Height = 13
Caption = 'DLL'
end
object Edit2: TEdit
Left = 136
Top = 24
Width = 121
Height = 21
TabOrder = 1
end
object Button1: TButton
Left = 264
Top = 32
Width = 57
Height = 17
Caption = 'Carregar'
TabOrder = 2
end
object OpenDialog1: TOpenDialog
Left = 152
Top = 56
end
object Timer1: TTimer
Enabled = False
Interval = 10
Left = 120
Top = 56
end
object Button2: TButton
Left = 8
Top = 56
Width = 105
Height = 25
Caption = 'Aguardar Processo'
TabOrder = 3
end
- Vá ao Code Explorer (View/Code Explorer) e declare a unit TlHelp32
3 - Declare a seguinte função acima de "end.":
function GetPID(ProcessName: string): DWORD;
var MyHandle: THandle;
Struct: TProcessEntry32;
begin
Result:=0;
try
MyHandle:=CreateToolHelp32SnapShot(TH32CS_SNAPPROC ESS, 0);
Struct.dwSize:=Sizeof(TProcessEntry32);
if Process32First(MyHandle, Struct) then
if Struct.szExeFile=ProcessName then
begin
Result:=Struct.th32ProcessID;
Exit;
end;
while Process32Next(MyHandle, Struct) do
if Struct.szExeFile=ProcessName then
begin
Result:=Struct.th32ProcessID;
Exit;
end;
except on exception do
Exit;
end;
end;
3 - Declare a seguinte função acima de "end.":
function GetPID(ProcessName: string): DWORD;
var MyHandle: THandle;
Struct: TProcessEntry32;
begin
Result:=0;
try
MyHandle:=CreateToolHelp32SnapShot(TH32CS_SNAPPROC ESS, 0);
Struct.dwSize:=Sizeof(TProcessEntry32);
if Process32First(MyHandle, Struct) then
if Struct.szExeFile=ProcessName then
begin
Result:=Struct.th32ProcessID;
Exit;
end;
while Process32Next(MyHandle, Struct) do
if Struct.szExeFile=ProcessName then
begin
Result:=Struct.th32ProcessID;
Exit;
end;
except on exception do
Exit;
end;
end;
4 - Declare esta função logo abaixo da função declarada acima:
function InjectDll(PID:DWORD; sDll:string):Boolean;
var
hLib: Pointer;
hThread: THandle;
pMod: Pointer;
hOpen: THandle;
dWritten: Cardinal;
ThreadID: Cardinal;
begin
Result := FALSE;
hOpen := OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
if hOpen <> INVALID_HANDLE_VALUE then
begin
hLib := GetProcAddress(GetModuleHandle(PChar('kernel32.dll ')), PChar('LoadLibraryA'));
pMod := VirtualAllocEx(hOpen, nil, Length(sDll) + 1, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if WriteProcessMemory(hOpen, pMod, @sDll[1], Length(sDll), dWritten) then
Result := TRUE;
hThread := CreateRemoteThread(hOpen, nil, 0, hLib, pMod, 0, ThreadID);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hOpen);
CloseHandle(hThread);
end;
end;
5 - Agora volte ao Form (F12) e dê dois cliques no botão "Carregar". Então insira este algoritmo no evento OnClick dele
if not OpenDialog1.Execute then Exit;
Edit2.Text:=OpenDialog1.FileName;
6 - Volte ao Form (F12) e dê dois cliques no botão "Aguardar Processo". No evento OnClick dele insira este código:
Timer1.Enabled:=True;
7 - Volte ao Form (F12) e dê dois cliques sobre o "Timer1". No evento OnClick dele insira este algorítmo:
var PID: DWORD;
begin
Timer1.Enabled:=False;
PID:=GetPID(Edit1.Text);
if PID=0 then
begin
Timer1.Enabled:=True;
Exit;
end;
Timer1.Enabled:=False;
if InjectDll(PID, Edit2.Text) then
MessageBoxA(Handle, 'DLL injetada com sucesso!', 'DLL Injector', MB_ICONEXCLAMATION+MB_SYSTEMMODAL)
else
MessageBoxA(Handle, 'Erro ao injetar DLL.', 'DLL Injector', MB_ICONERROR+MB_SYSTEMMODAL);
8 - Compile o projeto (F9) e seja feliz.
Modo de usar:
1 - Insira o nome do processo.
2 - Carregue a DLL a ser injetada.
3 - Clique em aguardar processo.
4 - Inicie o processo e a DLL será injetada.