Memproteksi File EXE Dengan Password

Software : Delphi 6, PE Inject API oleh Michal Strahovsky
Tingkat Kemahiran: 80%
Kategori: Sekuriti & WIN32API

Pengantar

Banyak kita melihat virus-virus yang menyerang file EXE/PE, seperti varian Alman, Virut dan berbagai virus lainnya. Banyak juga yang membuat aplikasi-aplikasi untuk memproteksi komputer dari tangan jahil atau bahkan virus. Pertanyaan, jika kedua jenis software di atas bisa kita buat, yang mana yang akan kita buat?
Saya pribadi akan membuat virus. Sayang, saya tidak bisa membuat virus yang bauk, jadi “terpaksa” saya pilih yang kedua, aplikasi untuk kepentingan sekuriti.

Virus-virus yang menyerang file PE/EXE, sebagaimana juga software sekuriti dimaksud di atas, setidaknya memiliki dua opsi untuk mengerjakan tugasnya – menurut sepengetahuan saya, harap diingat – itu. Seperti ini:

  1. Sebagai stub dengan embbeded data. Ini mirip dengan aplikasi installer pada umumnya, di mana sebuah aplikasi membuat/mengkopi file EXE/PE dan kemudian menambahkan data tambahan di akhirnya, dan di bagian paling akhir (atau di bagian mana saja yang aman), ditambahkan beberapa parameter untuk digunakan oleh stub nantinya, seperti CRC check signature, besar data yang diembed, jumlah file/data yang diembed, dsb. Jika, misalnya, cara ini dipakai untuk kepentingan distribusi data melalui sebuah file (Self Extractor) atau SFX, jadilah dia sebuah aplikasi instalasi. Namun jika dipakai untuk menyebarkan “sesuatu”, maka jadilah dia dalam golongan virus. Sebagai catatan, jika ada yang membuat virus dengan cara ini, sebaiknya kedua tugas di atas – membuat stub dan mengandung embedded data – dikerjakan oleh sebuah EXE saja, sehingga bisa menyebar tanpa software bantu lainnya. Dan sebaiknya jangan memilih tool yang menggunakan shared depencies seperti VB🙂
    Di Tanah Air Indonesia ini, saya melihat kecenderungan membuat trojan atau virus – atau apa kek- dengan metode ini. Namun ada kelemahannya, icon aplikasi (stub/target) yang sudah dihinggapi (bukan diinfeksi) akan berubah sesuai icon stub yang sebenarnya, jadi user yang menjadi korban, jika cukup teliti, akan tahu bahwa dia sedang disantet.
    Ini sebanya (barangkali), beberapa waktu lalu saya acap menerima e-mail atau membaca posting di milis-milis tentang bagaimana mengubah icon sebuah aplikasi. Tapi sebagaimana Anda, saya juga tidak menjawab sebuah pertanyaan yang mempunyai tendensi negatif, apalagi yang ditanyakan oleh seorang Delphier. Bukankah akan memalukan?
  2. Ini yang seru. Sebagai stub yang menjadi bagian dari file yang ditumpangi. Varian Alman dan Virut di atas masuk kategori ini. Sebuah aplikasi, katakan A, akan menyuntik kode-kode tertentu, katakan B, (seperti DLL Injection) yang residen dalam file target. Jika cara ini dipakai oleh virus, maka virus itu akan masuk kategori sulit dibasmi, kecuali dengan mempertaruhkan keselamatan file terinfeksi (bukan dihinggapi, silahkan bandingkan dengan metode pertama di atas)🙂
    Seperti juga di atas, jika sebuah program mampu menjadi kode yang iinject sekaligus penginjectnya, pastikan program ini sudah menjadi sebuah virus yang tangguh. Tinggal ditambahkan sebuah rutin untuk mencari file PE/EXE di harddisk target, trus jalankan injeksi ke tiap PE/EXE yang mungkin untuk diinject.

Baik. Sampai di sini, saya menunggu koreksi jika Anda menemukan ketidak sesuaian.

Sesuai judul, kita hanya akan membahas metode nomor dua, dengan batasan positif, membuat sebuah aplikasi sekuriti untuk memproteksi file-file PE/EXE dengan password. Berikut kita lihat beberapa gambar screenshot dari demo aplikasi yang sudah saya buat:


Ini tampilan depan.


Ini tampilan pesan yang menyatakan bahwa proses injeksi berlangsung sempurna.


Ini tampilan jika PE/EXE yang telah dinjeksi dijalankan🙂

Proses Pembuatan

Proses pembuatan aplikasi proteksi ini kita bagi dua. Yang pertama kode yang akan diinject ke file target (yang harus merupakan PE/EXE), dan yang kedua aplikasi untuk menginjeksi. Kita tidak membuat virus, jadi tugas aplikasi ini kita pisahkan, tidak dilakukan oleh sebuah aplikasi tunggal.

Untuk menjalankan proses, kita butuh PE Inject Library oleh Michal Strahovsky, yang mana bukan saya pembuatnya🙂. Silahkan download di websitenya http://migeel.sk. Selanjutnya , kita buat sebuah projek baru di Delphi (saya menggunakan Delphi 6), dengan target Dynamic Link Library. Ini untuk mempermudah, karena Michal Strahovsky memilih menggunakan DLL sebagai kode yang akan diinject, sehingga dengan mudah kita buat, tanpa harus pusing menentukan batasan-batasan kode yang akan kita inject. Plus, kita bisa sertakan form (dengan WinAPI) tentunya.

Michal Strahovsky membagi kode dalam DLL kita atas dua, berupa fungsi BeforeHandler dan AfterHandler, yang akan dijalankan sebelum kode PE/EXE sesungguhnya dari file target, kemudian masuk ke entry point PE/EXE target, dan setelah berakhir, outpoint akan melompat ke awal fungsi AfterHandler dan menjalankan kode kita. Agar bisa diload oleh PEInject, kedua fungsi ini harus diekspor.

Saya tidak menggunakan AfterHandler (opsional) karena yang saya butuhkan hanya Beforehandler sebelum masuk entry point PE/EXE target – yang disebut Original Entry Point, selanjutnya akan saya sebut OEP saja. Kemudian saya tambahkan sebuah fungsi WindowPorc untuk memproses pesan. Funsgi ini perlu untuk menangani message yang datanng dari Windows. Ingat, untuk meminta password kita butuh form dan minimal sebuah EditBox. Untuk membuat form, kita butuh WindowProc.

Perbedaan mendasar DLL ini dari DLL lainnya adalah, entry pointnya berada pada fungsi BeforeHandler, bukan Begin & End. Jadi proses pembuatan form harus ditempatkan dalam fungsi ini.

Agar tidak membosankan, saya langsung saja dengan kodenya, yang terbagi atas dua: Entry Point BeforeHandler dan WindowProc.

Library  pelock;

uses
  Windows,Messages, InjectionTypes;

const
  ClassName='PELOCKER_Plugin';  

var
  sLen:cardinal;
  form1,
  lblPassword,
  edtPassword,
  BtnOK:hwnd;
  s, pass:string;
  wc:TWNDClassEx;
  msg:Tmsg;
  Font:HFont;
  p:PChar;
  Adata:PextData;

  truePass:Boolean;

//define window proc:
function WndProc(handle:hwnd; wmsg:cardinal;wparam:WParam;lparam:LParam):longint;stdcall;
begin
  result:=defWindowProc(handle,wmsg,wparam,lparam);
  case wmsg of
    wm_Destroy:
       begin
         halt;
       end;
    wm_command:
      begin
        if lparam=BtnOK then     //user click send button:
        begin
          slen:=GetWindowTextLength(edtPassword);
          if slen=0 then begin      //no message, boom!
            Messagebox(handle,'There is no password entered.','Cannot Run',MB_ICONHAND);
            SetWindowText(edtPassword, nil);
            SetFocus(edtPassword);
          end
          else
          begin
            //is it true password?
            Pass:=Adata^.Password;
            //DEBUG_ONLY:-> MessageBox(Form1, PChar(pass), 'Test',MB_OK);
            getmem(p, slen+1);
            GetWindowText(edtPassword, p, slen+1);
            s:=String(p);
            FreeMem(p);
            if s=pass then
            begin
              truePass:=True;
            end
            else
            begin
              MessageBox(Form1, 'Invalid password!','Cannot Run',MB_ICONHAND);
              SetWindowText(edtPassword, nil);
              SetFocus(edtPassword);
            end;
          end;
        end;
      end;
    //case...
      {
       other message
      }
  end;
end;

function BeforeHandlers(Config: PStubConfiguration): DWORD; stdcall;
begin
  Adata:=PExtData(Config.ImageBase+Config.ExtraDataRVA);
  truepass:=False;

  //define main window's class:
  wc.cbSize:=sizeof(wc);
  wc.style:=0;
  wc.lpfnWndProc:=@WndProc;
  wc.cbClsExtra:=0;
  wc.cbWndExtra:=0;
  wc.hInstance:=Hinstance;
  wc.hIcon:=LoadIcon(hinstance,'MAINICON');
  wc.hCursor:=LoadCursor(hinstance,IDC_ARROW);
  wc.hbrBackground:=color_btnface+1;
  wc.lpszMenuName:=nil;
  wc.lpszClassName:=ClassName;
  wc.hIconSm:=0;
  //register class:
  registerclassex(wc);
  //Create main window:
  form1:=CreateWindowEx(WS_EX_STATICEDGE,
                pchar(ClassName),'PE Lock - JokoRB',
                WS_DLGFRAME+WS_VISIBLE+WS_SYSMENU,
                253,191,245,60,
                0,0,
                hinstance,nil);
  //show it
  ShowWindow(form1,SW_SHOW);
  updateWindow(form1);
  lblPassword:=CreateWindow(
                'Static','Password',WS_VISIBLE+WS_CHILD,
                2
                ,6,
                50,
                13,
                form1,
                0,
                hinstance,nil);

  edtPassword:=CreateWindow(
                'Edit',
                nil,
                WS_VISIBLE+WS_CHILD+WS_BORDER+ES_AUTOHSCROLL+ES_PASSWORD,
                63,
                2,
                121,
                21,
                form1,0,hinstance,nil);

  BtnOK:=CreateWindow('Button',
                'Run!',
                WS_CHILD+WS_VISIBLE+BS_PUSHLIKE,
                187,
                2,
                46,
                21,
                form1,
                0,hinstance,nil);
  //Create Default font:
  font:=CreateFont(14,5,0,0,0,0,0,0,0,0,0,0,0,'Arial');
  //set Control's font:
  SendMessage(lblPassword,WM_SETFONT,font,0);
  SendMessage(edtPassword,WM_SETFONT,font,0);
  SendMessage(BtnOK,WM_SETFONT,font,0);
  //limit entry text for hostname and message to 200 character
  SendMessage(edtPassword,EM_LIMITTEXT,30,0);
  SetFocus(edtPassword);
  //Then Create Message Processing Looping:
  while getmessage(msg,0,0,0) do
  begin
    TranslateMessage(msg);
    DispatchMessage(msg);
    if truepass then
    begin
      ShowWindow(Form1, SW_HIDE);
      exit;
    end;
  end;

  Result:=1; // the result is not checked, so this could be anything
end;

exports BeforeHandlers;
begin
end.

OK. Kita lanjut ke program penginjeknya.

Kita butuh sebuah resource yang berisi DLL di atas. Ini supaya DLL nantinya tidak perlu diload dari harddisk.
Jadi kita buat sebuah file Resource Script dan isikann dengan skrip berikut

lockplugin RCDATA pelock.dll

Script ini bisa dikompilasi dengan BRCC32 – terdapat dalam %DelphiFolder%\Bin – untuk mendapatkan file Compiled Resource-nya. Ingat, pelock.dll adalah hasil kompilasi kode DLL di atas. Selanjutnya kita buat sebuah projek baru lagi dan tambahkan resource hasil kompilasi skrip di atas ke project source atau ke unit1 (unit utama).

//......................

  PE_LOCK_DLL = 'pelocklugin.dll';  

var
  Form1: TForm1;

implementation

{$R *.dfm}

//tambahkan baris berikut, dengan memisalkan nama file resource adalah
// plugin.res

{$R plugin.RES}
//..........................................

Kemudian, kita lihat prosedur untuk melakukan proses injeksi:

procedure TForm1.SpeedButton2Click(Sender: TObject);
var
  cback:Boolean;
  ExtData:PExtData;
  PHost, PDll:Pointer;
  szHost, szDll:Cardinal;
  mslSize:DWORD;
  msldata, PEData:Pointer;
  TestSize:DWORD;
begin
  cback:=CheckBox1.Checked;
  if not FileExists(edit1.Text) then
  begin
    MessageBox(handle, 'File doesn''t exist!', 'Error',MB_ICONHAND);
    Edit1.SetFocus;
    Edit1.SelectAll;
    exit;
  end;
  if Edit2.Text<>Edit3.Text then
  begin
    MessageBox(handle, 'Passwords don''t match!', 'Error',MB_ICONHAND);
    Edit2.SetFocus;
    Edit2.SelectAll;
    exit;
  end;

  if Edit2.Text='' then
  begin
    MessageBox(handle, 'Passwords are empty!', 'Error',MB_ICONHAND);
    Edit2.SetFocus;
    Edit2.SelectAll;
    exit;
  end;
  
  TestSize:=TakeFileSize(Edit1.Text);
  if testsize > (100*1024*1024) {100MB} then
  begin
    MessageBox(handle, 'Target PE''size exceeds limit (100MB)!', 'Error',MB_ICONHAND);
    Edit1.SetFocus;
    Edit1.SelectAll;
    exit;
  end;
  
  with TMemoryStream.Create() do
  begin
    LoadFromFile(Edit1.Text);
    szHost:=size;
    GetMem(PHost, szHost);
    Read(pHost^, szHost);
    Free;
  end;

  with TResourceStream.Create(hInstance, 'lockplugin', RT_RCDATA) do
  begin
    szDll:=Size;
    
    GetMem(pDll, szDll);
    Read(pDll^, szDll);
    Free;    
  end;

  //get dll as MSL:
  mslSize:=szDLL;
  mslData:=MappedDllToMsl(pDLL, @mslSize);
  FreeMem(pdll);

  New(ExtData);
  ExtData^.PasswordLength:=Length(Edit2.Text);
  ExtData^.Password:=Edit2.Text;
    
  if CBack then
    CopyFile(PChar(edit1.text), Pchar(Edit1.Text+'.bak'), False);
  
  PEData:=injectMappedFile(PHost, @szHost, MSLDATA, MslSize, ExtData, sizeof(TExtData),
                INJECT_FLAG_DOIMPORTS or
                INJECT_FLAG_JUMPTOOEP or
                INJECT_FLAG_HANDLERELOC or
                INJECT_FLAG_STRIPRELOCS or
                INJECT_FLAG_COMPRESSDLL or
                INJECT_FLAG_BACKUPTLS
                );
  if PEData<>nil
  {
  if 0 = InjectFile(Pchar(edit1.text),
                Pchar(edit1.text),
                PChar(fn),
                ExtData,
                SizeOf(TextData),
                INJECT_FLAG_DOIMPORTS or
                INJECT_FLAG_JUMPTOOEP or
                INJECT_FLAG_HANDLERELOC or
                INJECT_FLAG_STRIPRELOCS or
                INJECT_FLAG_COMPRESSDLL or
                INJECT_FLAG_BACKUPTLS
                )
  }
  then
  begin
    SaveFile(PEData, szHost, Edit1.Text);
    FreeMem(PHost, szHost);
    FreeMem(MSLDATA, mslSize);
    FreeMem(peData);
    MessageBox(handle, 'PE was injected successfully.', 'Information',MB_ICONInformation);
  end
  else
  begin
    MessageBox(handle, 'PE Injection failed.', 'Error',MB_ICONHAND);
  end;
  DispoSe(extData);
end;

Sampai di situ. Beberapa fungsi pendukung seperti TakeFileSize dan System dir tidak perlu saya tulis. Yang pertama untuk mengambil ukuran sebuah file dan yang kedua untuk mengambil path tempa System32 berada. Kenyataanya, kedua fungsi ini tidak dipakai🙂

Dan berikut kode selengkapnya:

unit uMMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, jpeg, StdCtrls, Buttons, InjectionTypes, InjectionEngine, msl, PEUtils;

type
  
  TForm1 = class(TForm)
    Panel1: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    imgOn: TImage;
    Bevel1: TBevel;
    Label3: TLabel;
    Edit1: TEdit;
    SpeedButton1: TSpeedButton;
    OpenDialog1: TOpenDialog;
    Bevel2: TBevel;
    Label4: TLabel;
    Label5: TLabel;
    Edit2: TEdit;
    Label6: TLabel;
    Edit3: TEdit;
    CheckBox1: TCheckBox;
    Bevel3: TBevel;
    SpeedButton2: TSpeedButton;
    SpeedButton3: TSpeedButton;
    Label7: TLabel;
    procedure SpeedButton1Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure SpeedButton3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    function TakeFileSize(const AFile:String):DWORD;
    function SystemDir:String;
  end;

const
  PE_LOCK_DLL = 'pelocklugin.dll';  

var
  Form1: TForm1;

implementation

{$R *.dfm}
{$R plugin.RES}

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  if OpenDIalog1.Execute then
  begin
    edit1.Text:=openDialog1.FileName;
  end;
end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
var
  cback:Boolean;
  ExtData:PExtData;
  PHost, PDll:Pointer;
  szHost, szDll:Cardinal;
  mslSize:DWORD;
  msldata, PEData:Pointer;
  TestSize:DWORD;
begin
  cback:=CheckBox1.Checked;
  if not FileExists(edit1.Text) then
  begin
    MessageBox(handle, 'File doesn''t exist!', 'Error',MB_ICONHAND);
    Edit1.SetFocus;
    Edit1.SelectAll;
    exit;
  end;
  if Edit2.Text<>Edit3.Text then
  begin
    MessageBox(handle, 'Passwords don''t match!', 'Error',MB_ICONHAND);
    Edit2.SetFocus;
    Edit2.SelectAll;
    exit;
  end;

  if Edit2.Text='' then
  begin
    MessageBox(handle, 'Passwords are empty!', 'Error',MB_ICONHAND);
    Edit2.SetFocus;
    Edit2.SelectAll;
    exit;
  end;
  
  TestSize:=TakeFileSize(Edit1.Text);
  if testsize > (100*1024*1024) {100MB} then
  begin
    MessageBox(handle, 'Target PE''size exceeds limit (100MB)!', 'Error',MB_ICONHAND);
    Edit1.SetFocus;
    Edit1.SelectAll;
    exit;
  end;
  
  with TMemoryStream.Create() do
  begin
    LoadFromFile(Edit1.Text);
    szHost:=size;
    GetMem(PHost, szHost);
    Read(pHost^, szHost);
    Free;
  end;

  with TResourceStream.Create(hInstance, 'lockplugin', RT_RCDATA) do
  begin
    szDll:=Size;
    
    GetMem(pDll, szDll);
    Read(pDll^, szDll);
    Free;    
  end;

  //get dll as MSL:
  mslSize:=szDLL;
  mslData:=MappedDllToMsl(pDLL, @mslSize);
  FreeMem(pdll);

  New(ExtData);
  ExtData^.PasswordLength:=Length(Edit2.Text);
  ExtData^.Password:=Edit2.Text;
    
  if CBack then
    CopyFile(PChar(edit1.text), Pchar(Edit1.Text+'.bak'), False);
  
  PEData:=injectMappedFile(PHost, @szHost, MSLDATA, MslSize, ExtData, sizeof(TExtData),
                INJECT_FLAG_DOIMPORTS or
                INJECT_FLAG_JUMPTOOEP or
                INJECT_FLAG_HANDLERELOC or
                INJECT_FLAG_STRIPRELOCS or
                INJECT_FLAG_COMPRESSDLL or
                INJECT_FLAG_BACKUPTLS
                );
  if PEData<>nil
  {
  if 0 = InjectFile(Pchar(edit1.text),
                Pchar(edit1.text),
                PChar(fn),
                ExtData,
                SizeOf(TextData),
                INJECT_FLAG_DOIMPORTS or
                INJECT_FLAG_JUMPTOOEP or
                INJECT_FLAG_HANDLERELOC or
                INJECT_FLAG_STRIPRELOCS or
                INJECT_FLAG_COMPRESSDLL or
                INJECT_FLAG_BACKUPTLS
                )
  }
  then
  begin
    SaveFile(PEData, szHost, Edit1.Text);
    FreeMem(PHost, szHost);
    FreeMem(MSLDATA, mslSize);
    FreeMem(peData);
    MessageBox(handle, 'PE was injected successfully.', 'Information',MB_ICONInformation);
  end
  else
  begin
    MessageBox(handle, 'PE Injection failed.', 'Error',MB_ICONHAND);
  end;
  DispoSe(extData);
end;

function TForm1.TakeFileSize(const AFile: String): DWORD;

begin
  With TFileStream.Create(AFile, fmOpenRead or FMShareDenyNone) do
  begin
    try
      Result:=Size;
    finally
      Free;
    End;
  end;
end;

procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
  Messagebox(handle, 'PE Executable Locker by JokoRB.'#13'Find more at htt://jokorb.wordpress.com!','About',MB_ICONINFORMATION or MB_OK);
end;

function TForm1.SystemDir: String;
var
  p:PChar;
begin
  GetMem(p, MAX_PATH+1);
  GetSystemDirectory(p, MAX_PATH);
  Result:=String(p);
  FreeMem(p, MAX_PATH+1);
  if Result[Length(Result)]='\' then
    Delete(Result, Length(Result),1);
end;

end.

Saya tidak sempat menulis banyak, apalagi tentang proses injeksi yang sesungguhnya. Tapi bila Anda tertarik, silahkan komen saja ke sini. Untuk ketarangan lebih jauh, silahkan kunjungi http://migeel.sk dan www.pelib.com.

Download

Berikut demo dari posting ini beserta source kodenya dan PEInject Library:
Demo + Source
PE Inject Library
Dan jangan lupa, ekstensi ppt harus diubah ke zip, dan scan dulu file hasil download dengan antivirus🙂

google_tags: delphi, Exe/PE, EXE/PE Protector, EXE/PE Password, PE Inject, PE-Inject,
PeInject, Michal Stehovsky, migeel.sk, www.pelib.com, jokorb.wordpress.com

34 thoughts on “Memproteksi File EXE Dengan Password

  1. Same name or weak thing? Or both of them?
    Forget it, this was not about a “Which one is better?” or “Follow their success!”. This was and is an will be “Share what you know…”.

    Thanks for info. I didn’t know it at all.
    Just remind one thing: PE Locker PELock PE Lock…

      • orang disini, tutorialnya delphi, yg jawab kok pada ngarepin vb sih😀,
        iya vb butuh msvbvm6, tapi hampir smua komputer ada,tapi yg paling sebel dari vb, yaitu, componentnya harus berdiri sendiri😀, walaupun bisa disertakan didalam foldernya, tapi ada juga, komputer yg tidak mau jalanin p[rogram vb, walaupun dah diregister ocxnya, (pengalaman, mo cari pengganti winsock ma inet1,susahnya bukan main😦 ) tapi syukur, sekarang dah bisa😉,

        tapi menurutku, disemua bahasa pemrograman ada semua, apalagi vb, cari source gampang, tentang pe juga ada, bahasanya mudah dicerna

  2. apakah bisa di implementasikan ke VB6?
    kalau bisa, mungkin mas JokoRB bisa membuat secara kasar & simple tehnik penggunaannya di VB.

    terus terang saya belum bisa menggunakan delphi, hanya faham di VB.

    terima kasih.

  3. mungkin untuk dll-nya saja yang bisa anda contohkan di VB.

    saya agak bingung untuk mem-porting contoh InjectionDLL.dll dari delphi ke VB, kiranya mas JokoRB sudi untuk meluangkan waktunya untuk mengajari saya yang newbie ini😀

    thanks

  4. Implementaske vb bisa saja dilakukan, tapi tentu saja dengan menggunaakan sebuah file DLL yang merupakan library PELock. Library ini bisa didownload di http://migeel.sk. Pada delphi, yang dibutuhkan hanya sebuah file dll yang akan dimasukkan ke file target, library pelock tidak diperlukan lagi, karena sudah di-link langsung saat kompilasi.

    vb tidak mendukung cara link source code ini, karena vb tidak mendukung assembly yang dipakai dalam source code library. sehingga, porting kode library ini ke vb menjadi tidak mungkin.

    untuk mengclearkan saja, masalahnya bukan pada porting dll yang akan diinject, tapi pada porting librarynya.

  5. mas Joko,

    apakah DLL yang akan diinjeksikan ke program utama (injected) tetap bisa dibuat dengan VB?

    saya hanya ingin tahu penggunaan fungsi BeforeHandler, AfterHandler dan DllMain dengan menggunakan VB, kalaupun tidak bisa terpaksa ke Delphi.

    btw, udah 2 hari ngutak-atik Delphi, sukses sih, tapi ada beberapa error kalau menggunakan beberapa library (uses Delphi, seperti Classes, IdMessageDigest dll) apalagi kalau file DLL-nya ter-build dengan ukuran yang lumayan besar.

    makasih atas pencerahannya.

  6. Tentu saja, VB mendukung DLL.
    Cuma untuk tujuan ini, proteksi file exe, VB punya keterbatasan:

    DLL masih membutuhkan MSVBVMXX.DLL untuk bisa berjalan, jadi jika ada aplikasi yang kita proteksi dengan DLL ini, aplikasi itu harus menyertakan MSVBVMXX.DLL bersamanya.
    Anda tidak dapat menggunakan fungsi-fungsi API dalam PELib secara langsung, karena source code PELib mengandung inline Assembly, yang tidak didukung VB. JAdi hanya bisa menggunakan PELib yang telah dikompile sebagai DLL. Jadi, dengan keterangan di atas, Anda jadi membutuhkan dua buah DLL sekaligus.

    Mengenai ukuran DLL hasil kompilasi Delphi, untuk kode yang saya buat hanya sekitar 15KB. Untuk DLL, jangan menggunakan (uses) modul/unit yang tidak perlu. Classes tidak usah digunakan.

    Untuk kasus porting DLL di atas ke VB, akan saya tulis dalam posting khusus. Mohon tunggu sebentar.

  7. yup, akan saya tunggu postingan anda.

    btw, untuk beberapa keperluan, saya membutuhkan beberapa uses pada DLL tersebut. maklum lah newbie, padahal dengan memanfaatkan Windows API saja sudah cukup😀

    di tunggu lho…

  8. oh iya, pada DLL VB, fungsi seperti DllMain, BeforeHandlers dan lainnya, ternyata tidak bisa di export. saya sudah mencoba menggunakan command line compile untuk menambahkan fungsi di export, tetapi gagal terus (mungkin karena compiler & linker VB tidak bisa digunakan di luar lingkungan VB IDE, kale…).

    apakah benar, fungsi yang kita buat pada DLL di VB harus di export dulu, seperti di Delphi:

    exports BeforeHandlers;

    *ah, newbie banyak tanya nih :D*

  9. Di VB, fungsi dalam DLL otomatis diekspor, ga perlu diekspor manual kayak di Delphi. Demikian menurut MSDN.

    porting codenya bentar lagi yah🙂

  10. bagus bgt mas programnya.
    tp klo boleh nanya. gimana mas cara buat proteksi file exe berdasarkan komputer ID, Harddisk ID atau MAC ID.
    jadi, tujuannya jika file exe yg setelah di lock tersebut tidak bisa dijalankan ke komputer lain melainkan harus memasukkan serial number atau registrasi dulu.
    jadi, setiap komputer harus registrasi dulu sebelum menjalankan program exe tersebut.

    thaks mas atas bantuannya.

    • Caranya kira-kira:
      1. Program Anda mengambil info serial number HD, MB, atau lainnya dan memanipulasinya dengan metode A menjadi deretan angka unik dan menampilkannya ke user.
      2. User diminta mengirimkan angka-angka ini ke Anda, via SMS misalnya.
      3. Anda menggunakan metode B untuk mengubahnya menjadi serial number dan mengirimkannya ke user.
      4. User menginput serial number dari Anda ke program.
      5. Program akan memanipulasi data serial number hardware yang diperoleh pada langkah 1 menggunakan metode A dan diikuti metode B, selanjutnya membandingkan hasilnya dengan yang diinput user pada langkah 4. Jika sesuai, program berjalan, jika tidak, “Serial number entered was invalid!”.

      Semoga contoh progranya bisa menyusul. Saya agak belakangan ini…

  11. artikelnya bgus mas. dan saya udah coba tpi da bbrapa yg saya ubah di app injector n rutin dll nya. untuk informasi aja, programnya akan dipake utk kprluan warnet tmn saya, tujuan nya cmn buat mncegah user “gratisan” (mksudnya tmennya OP kdang suka lgin pke id OP jdi gratis gitu :D) buka bbrpa aplikasi. tmen saya ini mtode proteksi minta diubah, jdi g pake password lgsung di log off aja dri windows. programnya sih jlan, cman prosesnya diblok anti virus. mgkin mas da solusi?

    satu lagi mas, form passwordnya bisa g diganti pake komponen form biasa, jdi tgal add form trus di show di module beforehandler?

    terima ksih pnjlasannya

    • Untuk restart Windows menggunakan fungsi ExitWindowsEx memang kemungkinan diblok oleh antivirus. Untuk mengakali hal ini, daripada menggunakan kerumitan low level NT Kernel API, atau menggunakan virtual device driver (VDD) sebagai servis (yang tentu saja merepotkan), sebaiknya tambahkan saja program-program yang sudah diproteksi ke daftar pengecualian (Exclude List) Antivirus yang Anda gunakan. Dengan begitu, saya pikir kebutuhan Anda telah mendapat solusi.

      PE Library tidak mendukung impor resource dari library yang akan diinject, hanya resource milik file target injeksi, yaitu file EXE yang akan diprotek. Jadi form milik VCL (TForm, TDataModule dsb.) tidak didukung. Ini alasan mengapa saya menggunakan fungsi-fungsi API murni untuk membuat form, seperti CreateWindow dan RegisterClass…

      Demikian, semoga dapat menjadi penceraha🙂

  12. trims atas pncerahan nya. programnya dh selesai.

    kalo pembuatan object mgnakan fungsi2 API, objectnya sndiri bisa di kasih event g mas (misalnya pda saat create, show dst..) ? klo blh saya minta contoh scriptnya mas. krim aja ke email saya.

    sebelumnya terima kasih banyak

    • BeforeHandlers adalah fungsi, yang kode-kode di dalamnya dieksekusi sebelum jumping ke OEP (Originial Entry Point). Jelasnya gini, BeforeHandlers dieksekusi sebelum program asli dijalankan. Setelah program asli selesai (dengan perintah HLT), maka fungsi AfterHandlers dijalankan.
      Contoh yang nyata adalah sebuah crack yang dibuat dengan mempatch sebuah file .exe. Pertama, sebelum program .exe dijalankan, BeforeHandlers membuat key-key di registry untuk program asli (misalnya serial number, dsb.). Setelah selesai, AfterHandlers menghapus key-key tersebut atau file-file yang dibuat oleh program .exe (yang asli).

      Demikian, hth. Dan selamat tahun baru 2010. Sukses selalu!

  13. oh yah mas, menyambung komentarnya mas2 yg diatas, mengenai untuk mengambil serial number untuk BIOS pada komputer bisa gak yach, soalnya sudah saya cari di internet tapi hanya support dibawah windows 2000.. klo bisa minta coding-nya dunk.. thank’s buanyak mas…:)

    Selamat tahun baru 2010. Sukses selalu!🙂

  14. mas saya kan udah buat program batabase uses delphi 6,, dan smua saya teliti dengan benar . Untuk databsenya saya menggunakan paradox 7. dan semua nya saya simpan di flasdisk baik project, unitnya maupun database saya simpan jadi satu dalam flasdiskq, sebelumnya sudah saya compile exe nya biar bisa di buka di komputer manapun? nah setelah saya jalankan berhasil? namun setelah komputer saya restart, program exe nya itu gak jalan lagi? dan q coba di komputer lain juga gak bisa saya buka? itu kenapa ya mas Joko? mohon infonya cz program ni adalah tugas kuliah saya?……:)^_^

  15. Mas Fiqi, Paradox adalah database lama yang menggunakan BDE (Borland Database Engine) sebagai antarmuka dengan aplikasi Delphi. Di komputer tujuan, harus terinstall juga BDE agar database dan aplikasi kita dapat berjalan. Meskipun semua file sudah diikutkan, tanpa BDE, pasti gak jalan.
    Setelah BDE diinstall, harus dibuatkan alias yang menunjukkan path di mana file-file paradox tersimpan. Harus persis sama dengan di komputer saat pembuatan aplikasi. Barulah kemudian, aplikasi dapat dijalankan.

  16. mengenai proteksi file exe, baru2 ini membuat program, program itu, rencananya sih, kumpulan dari smua programku, jadi semua program tak jadiin satu (dulunya terpisah2), belum jadi 100%, mash update time by time
    programnya ini,

    http://www.4shared.com/file/ezV24_P4/Hmei7_rootkit.html

    bisa didownload disitu, kalo gak ada, masuk aja di Hmei7.4shared.com trus cari yang namanya “Hmei7 rootkit”, yang cukup menarik disitu adalah, terdapat menu, file exe editor, yang berfungsi mengubah atau mengedit file exe (didalam contoh, ngedit winrar), dari situ saya nggk habis pikir, ntar gimana yach kalo programku diedit?.., senjata makan tuan dong, makanya kemudian program exe tersebut aku proteksi, dengan cara sebagai berikut

    programku=dataprogramku + 32 string (kalo dibedah, misal dibukak dengan notepad, bagian terakhir akan ada 32 string)
    dimana 32 string terakhir adalah, md5 dari dataprogramku, jadi ketika jalan programku akan ngecek
    md5 string tersebut, sama gk dengan md5 string dataprogramku, jadi jika ada 1 byte pun yg keedit, maka program gk jalan😀, aslinya jalan sih, cuman munculin inputbox string berisi md5string dataprogramku yg baru😀 (terencrypt), kendalanya sih, kalo dijalanin di luar negeri, koq md5 nya berubah yah😦,

    jadi mungkin teknik ini sudah dapat memproteksi file exe kita,semoga

    mengenai program satu hanya dapat digunain di 1 pc, sama idenya juga dengan mas joko
    intinya cari spesifik, yang membuat komputer itu berbeda dengan komputer yang lain yg ada didunia
    baik itu berupa kombinasi nomor HD,MB,nama komputer,dst yg kemudian dijadikan serial number
    atau, kalo jam cmos kapan mulai berdetak pertama kali dapat dideteksi, juga dapat dijadikan SN
    misalnya jam CMOS pada BIOS pertama kali hidup, 31012001232323 (31 des 2001, pukul 23:23:23)
    dapat juga dijadikan kombinasi SN, sehingga, kalo orang mau manipulasi, harus benar2 tepat, pada detik tersebut)

    kalo mendeteksi volume serial number drive,ternyata ada program yg dapat mengubahnya

    tetapi SN dengan kombinasi nomor HD,MB,namakomputer,spesifikasi keyboard,dll, juga sudah cukup uniq
    sudah cukup dapat dijadikan Serial number

  17. mas aku coba untuk melakukan edit script diatas,
    pada baris
    {$R plugin.RES} aku ganti {$R injeksi.RES}
    trus
    with TResourceStream.Create(hInstance, ‘lockplugin’, RT_RCDATA) do
    diganti
    with TResourceStream.Create(hInstance, ‘injeksi’, RT_RCDATA) do

    trus muncul : “[Fata Error]Unable to build. License is invalid or has expired”.
    mksdnya gmana, trus apa yg harus saya lakukan..???
    mohon pencerahannya…

    • Directive {$R plugin.res} adalah nama file yang akan diikutkan dalam proses build dan link, sehingga bila diganti dengan {$R injeksi.res}, maka file injeksi.res harus ada dalam satu folder dengan file-file project. Bila tidak, proses kompilasi akan gagal karena file ini tidak ditemukan.

      Yang kedua, nama resource yang akan di-load oleh TREsourceStream.Create(hInstance, ‘lockplugin’, RT_RCDATA) haruslah sesuai dengan nama resource dalam file injeksi.res di atas.

      Bila Anda buka file plugin.rc, Anda akan lihat isinya:

      lockplugin RCDATA pelock.dll
      

      Nah, nama lockplugin dalam file .res inilah yang harus diganti. Kemudian disesuaikan saat memanggilanya dengan perintah

      with TResourceStream.Create(hInstance, ‘lockplugin’, RT_RCDATA) do
      

      Semoga menjadi pencerahan🙂

  18. mas masih tahap editing nih, pada library pelock klausa use aku kasih FormRegistrasi in ‘FormRegistrasi.pas’, supaya niatnya pengen dihubungkan dengan form registrasi, pas dirun program berjalan dengan baik, proses injectingnya berjalan baik, tetapi aplikasi PE yang sudah diinjeksi dijalankan kok error yah.. ada solusi gak??? Mohon Pencerahannya.

    Library pelock;

    uses
    Windows,
    Messages,
    InjectionTypes, MD5,
    FormRegistrasi in ‘FormRegistrasi.pas’;

  19. Itu karena import table entry/resource table entry tidak ditemukan pada EXE yang di-lock, saat EXE tersebut dijalankan. Bila Anda perhatikan, semua window construction (pembuatan antarmuka GUI) pada library pelock.dll (kode paling atas) dibuat dengan Windows API murni. Ini karena:
    * PEInject Library tidak mendukung import resource untuk VCL, sehingga form yang melibatkan VCL (seperti TForm, TIcon, TImage, TBitmap) dsb. tidak didukung
    * PEInject Library tidak mendukung re-reimport, sehingga sebuah EXE yang di-lock tidak dapat menggunakan DLL, jika DLL tersebut menggunakan DLL lainnya.

    Proses kompilasi dan injeksi tetap berjalan. Tapi saat eksekusi pada EXE target, akan terjadi error karena resource yang dibutuhkan tidak ditemukan pada resource table dan import table. Karena memang tidak didukung.

    Bila Anda tertarik untuk membuat form lain, buatlah sebuah form dengan Windows API, jangan dengan VCL. Atau, pakailah cara lain, seperti stubbing pada program instalasi (setup.exe). Cara stubbing ini dipakai oleh hampir semua installation tool, seperti InstallShield, InnoSetup dan Nullsoft Installation System (NSIS).

    Cara stubbing ini dipakai oleh banyak pembuat virus lokalan di negeri kita. Contohnya virus yang menyerang file-file MS. Office, beberapa tahun lalu. Caranya dengan mengkopi dirinya dan mengganti nama sesuai dengan file target, komudian membawa file target dengan dirinya. Saat dieksekusi, kode virus dijalankan dan kemudian barulah file target (yang dibawa) akan dijalankan.

    Cara stubbing ini jauh lebih sederhana. Kita akan membahasnya nanti jika ada kesempatan🙂

  20. oh yah mas, kasih contoh dunk untuk mengakses registry pake wins32 api… buat ngembangin program aplikasi diatas.. tq..

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s