Last Updated:

Dasar DLL Injection

Grup KPPDI
Grup KPPDI Tutorial

Tingkat kemahiran: pemula/menengah
Software :Window 2000/XP - Vista belum dicoba :-)

Overview

DLL Injection adalah hal yang sudah sering kita dengar. Namun sebagian besar adalah klise. Dan memang benar, DLL Injection sering digunakan untuk menumpangkan suatu proses (Kode dalam DLL) ke proses lainnya, yang biasanya sudah berada di memori.

Jadi apakah sebenarnya DLL Injection itu?
DLL Injection, sebagaimana namanya, adalah penyuntikan kode sebuah DLL ke dalam sebuah proses. Ada beberapa jenis injeksi berdasarkan sumber dan tergetnya, misalnya:

  • Injeksi dasar. DLL Injection jenis ini hanya menyuntikkan main code dari sebuah DLL ke dalam sebuah thread. Thread ini dibuat dalam proses lainnya. Kode yang telah disuntikkan kemudian dieksekusi dengan mengeksekusi thread tersebut.
  • Injeksi tingkat lanjut, di mana proses injeksi tidak saja menginjeksi main code subah DLL, tapi juga fungsi-fungsi tertentu sesuai keperluan. Injeksi juga tidak terbatas pada thread yang dibuat oleh proses penginjeksi, tapi juga dalam thread asli milik proses yang ditarget.
  • Class injection. Injeksi ini menyuntikkan sebuah kelas (objek) dalam sebuah DLL ke dalam thread target baik yang bersesuaian dengan jenis injeksi dasar maupun injeksi lanjut. Jenis ini juga mampu menyuntikkan kode/kelas ke dalam kelas (objek) atau window tertentu dalam proses target.

Dari ketiga jenis injeksi di atas, karena keterbatasan saya, tidak akan dibahas semuanya. Yang akan saya tulis hanyalah injeksi yang paling umum. Injeksi dasar, tentunya.

DLL CODE

Kita mulai dengan DLL yang akan diinjek. Langsung saja, berikut kodenya, yang menampilkan sebuah message box dengan pesan yang menunjukkan path proses yang menjadi host/target injeksi.


library InjectedDLL;

uses
Windows;
{$R *.res}
var
s:String;
begin
s:=ParamStr(0);
MessageBox(HWND_DESKTOP,
Pchar('This code is being executed within remote process.'
+#13+'The host is: '+s),
'Injection Message',MB_ICONINFORMATION);
end.

Sederhana, bukan? Namun ini bukan sebuah batasan. Kita bisa saja menambahkan sebuah form, atau loading DLL lainnya ke dalam kode kita :-)

Baik, saya pikir tidak ada yang perlu dibahas lebih jauh tentang kode di atas.

Kita lanjutkan saja dengan proses injeksinya, yang merupakan bagian terpenting dari DLL Injection.

Injector Code

Dalam kode kita, saya menggunakan beberapa fungsi API Win32 untuk melakukan injeksi. Dan saya rasa, pada umumnya tulisan tentang DLL Injection di internet menggunakan kode yang sama untuk kategori injeksi dasar.

OpenProcess()
Mendapatkan handle dari proses target.

VirtualAllocEx()
Mengalokasikan memory dalam wilayah memory proses target. Data-data seperti nama fungsi, parameter, dan sebagainya yang akan digunakan oleh injected code harus berada dalam lokasi memori proses target yang dialokasikan sebelumnya dengan fungsi ini.
WriteProcessMemory()
Menuliskan  data ke memori yang telah dialokasikan dalam wilayah memori proses target.
CreateRemoteThread()
Menjalankan thread baru di proses target. Ini akan mengeksekusi DLL yang diinjek.
GetProcAddress()

Mendapatkan alamat fungsi dalam sebuah DLL. Ini akan dipakai untuk mengambil alamat fungsi LoadLibrary() dalam kernel32.dll
WaitForSingleObject()
Menunggu eksekusi sampai selesai, dengan menyertakan parameter INFINITE.
CloseHandle()
Meunutup handle proses yang didapatkan dari OpenProcess.


procedure TFMain.InjectDLL(const ADLLName: String; targetproc: Cardinal);
var
Pid : Cardinal;
dllname : String;
pDLLname : Pointer;
hProzess,bw : Cardinal ;
hRemoteThread : Cardinal;
begin
dllname := ADLLname;
hProzess:= OpenProcess(PROCESS_ALL_ACCESS, false, targetproc);
pdllname := VirtualAllocEx(hProzess, 0, length(dllname),
MEM_COMMIT,PAGE_EXECUTE_READWRITE);
WriteProcessMemory(hProzess, pdllname, PChar(dllname), length(dllname), bw);
CreateRemoteThread(hProzess, nil, 0,

GetProcAddress(GetModuleHandle('kernel32.dll'),
'LoadLibraryA'), pDLLname, 0, hRemoteThread);
WaitForSingleObject(hRemoteThread, INFINITE);
CloseHandle(hProzess);
end;

Nah, dari mana kita memperoleh daftar proses yang berjalan di Windows, kemudian diambil handlenya? Kita mempunyai sebuah fungsi lagi untuk mengenumerasi proses-proses yang berjalan di Windows:


//...................
uses ...., TlHelp32; // -> untuk menggunakan Win32 Toolhelp library
//...................
procedure TFMain.EnumProcess;
var
hSnap:Cardinal;
pe32:TProcessEntry32;
s:String;
begin
hsnap:=CreateToolHelp32SnapShot(
TH32CS_SNAPPROCESS,
0
);
if hSnap = INVALID_HANDLE_VALUE then
exit;
FillChar(pe32, sizeof(pe32),0);
pe32.dwSize:=Sizeof(pe32);
if not Process32First(hsnap, pe32) then
exit;
cbProcess.Clear;
repeat
s:=IntToStr(pe32.th32ProcessID);
while length(s)<8 do s:='0'+s;
s:=s+': '+pe32.szExeFile;
if lowercase(copy(s, length(s)-3,4))='.exe' then
cbProcess.Items.Add(s);
until not Process32Next(hsnap, pe32);
CloseHandle(hSnap);
cbProcess.ItemIndex:=0;
end;

Kode di atas mengenumerasi proses yang berjalan di Windows  dan menyimpannya dalam sebuah ComboBox dengan format 8 karakter ProcessID dan sisanya nama proses (EXE). Jadi jika kita memilih sebuah item dalam ComboBox, kita mendapatkan Process ID item  tersebut dengan mengubah 8 karakter awal item tersebut menjadi integer.

Jadi kita bisa membuat tombol dengan kode berikut untuk menjalankan proses injeksi:


procedure TFMain.Button1Click(Sender: TObject);
var
s:String;
i:integer;
begin
if cbProcess.Items.Count = 0 then exit;
s:=copy(cbProcess.Items[cbProcess.ItemIndex],1,8);
i:=StrToInt(s);
InjectDll(ExtractFilePath(ParamStr(0))+'InjectedDLL.dll', i);
end;

Dari kode di atas, saya menganggap bahwa DLL yang akan diinjek berada dalam satu folder dengan injektor dan bernama InjectedDLL.dll.
OK, berikut kita lihat kode lengkapnya.


unit umain;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, TlHelp32;

type
TFMain = class(TForm)
Button1: TButton;
cbProcess: TComboBox;
Label1: TLabel;
Button2: TButton;
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure EnumProcess;
procedure InjectDLL(const ADLLName:String; targetproc:Cardinal);
public
{ Public declarations }
end;

var
FMain: TFMain;

implementation

{$R *.dfm}

{ TFMain }

procedure TFMain.EnumProcess;
var
hSnap:Cardinal;
pe32:TProcessEntry32;
s:String;
begin
hsnap:=CreateToolHelp32SnapShot(
TH32CS_SNAPPROCESS,
0
);
if hSnap = INVALID_HANDLE_VALUE then
exit;
FillChar(pe32, sizeof(pe32),0);
pe32.dwSize:=Sizeof(pe32);
if not Process32First(hsnap, pe32) then
exit;
cbProcess.Clear;
repeat
s:=IntToStr(pe32.th32ProcessID);
while length(s)<8 do s:='0'+s;
s:=s+': '+pe32.szExeFile;
if lowercase(copy(s, length(s)-3,4))='.exe' then
cbProcess.Items.Add(s);
until not Process32Next(hsnap, pe32);
CloseHandle(hSnap);
cbProcess.ItemIndex:=0;
end;

procedure TFMain.InjectDLL(const ADLLName: String; targetproc: Cardinal);
var
Pid : Cardinal;
dllname : String;
pDLLname : Pointer;
hProzess,bw : Cardinal ;
hRemoteThread : Cardinal;
begin
dllname := ADLLname;
hProzess:= OpenProcess(PROCESS_ALL_ACCESS, false, targetproc);
pdllname := VirtualAllocEx(hProzess, 0, length(dllname), MEM_COMMIT,PAGE_EXECUTE_READWRITE);
WriteProcessMemory(hProzess, pdllname, PChar(dllname), length(dllname), bw);
CreateRemoteThread(hProzess, nil, 0, GetProcAddress(GetModuleHandle('kernel32.dll'),'LoadLibraryA'), pDLLname, 0, hRemoteThread);
WaitForSingleObject(hRemoteThread, INFINITE);
CloseHandle(hProzess);
end;

procedure TFMain.Button2Click(Sender: TObject);
begin
EnumProcess;
end;

procedure TFMain.FormCreate(Sender: TObject);
begin
Button2.Click;
end;

procedure TFMain.Button1Click(Sender: TObject);
var
s:String;
i:integer;
begin
if cbProcess.Items.Count = 0 then exit;
s:=copy(cbProcess.Items[cbProcess.ItemIndex],1,8);
i:=StrToInt(s);
InjectDll(ExtractFilePath(ParamStr(0))+'InjectedDLL.dll', i);
end;

end.

Dan berikut beberapa screenshot injektor kita dan aksinya:

Injector dengan daftar proses di Windows


Proses injeksi dilakukan terhadap notepad.exe


Injeksi sukses dan kode DLL dieksekusi dalam proses notepad.exe

Demikian posting ini. Semoga bermanfaat.

Comments