Penulis Topik: [Delphi] GetProcAddress x32-x64  (Dibaca 31875 kali)

Offline meong

  • Pro100
  • ****
  • Tulisan: 121
  • Reputation: 203
    • Lihat Profil
[Delphi] GetProcAddress x32-x64
« pada: Oktober 03, 2011, 08:20:27 AM »
Lagi test2 xe2 delphi yang mana sudah mendukung compile 64bit.. btw sekalian share nih alternative getprocaddress, support 32 and 64bit pe.

(method walking the export directory table for function address)

Kode: [Pilih]
type
  PUInt32 = ^UInt32;
  UInt32 = LongWord;
  PUInt64 = ^UInt64;
  UInt64 = System.UInt64;

  PSizeT = ^TSizeT;
  TSizeT = {$IFDEF CPUX64} UInt64 {$ELSE} UInt32 {$ENDIF};

const
  // PE header constants
  IMAGE_NT_OPTIONAL_HDR32_MAGIC = $10b;  // 32bit PE file
  IMAGE_NT_OPTIONAL_HDR64_MAGIC = $20b;  // 64bit PE file

Function xGetProcAddress(Module: TSizeT; ProcName: String):Pointer;
var
  pIDH: PImageDosHeader absolute Module;
  pINH : PImageNtHeaders32;
  pIDD: PImageDataDirectory;
  pIED: PImageExportDirectory;
  pdwFuncs1,
  pdwFuncs,
  pdwNames: PULONG;
  pdwOrdinals: PWORD;
  dwOrd1, i, k: cardinal;
  apiname:PAnsiChar;
begin
  result := nil;
  if (Module=0) then exit;

  if (pIDH^.e_magic <> IMAGE_DOS_SIGNATURE) then exit;
  pINH := Pointer(Pbyte(pIDH) + pIDH^._lfanew);
  if (pINH^.Signature <> IMAGE_NT_SIGNATURE) then exit;

  if pINH^.OptionalHeader.Magic = IMAGE_NT_OPTIONAL_HDR64_MAGIC then
    pIDD := @PImageOptionalHeader64(@pINH^.OptionalHeader).DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]
  else
    pIDD := @pINH^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];

  pIED := Pointer(Pbyte(pIDH) + pIDD^.VirtualAddress);
  if (pIED=nil) then exit;

  pdwFuncs := PULONG(Pbyte(pIDH) + Cardinal(pIED^.AddressOfFunctions));
  pdwNames := PULONG(Pbyte(pIDH) + Cardinal(pIED^.AddressOfNames));
  pdwOrdinals := PWORD(Pbyte(pIDH) + Cardinal(pIED^.AddressOfNameOrdinals));
  pdwFuncs1 := pdwFuncs;
  for I := 0 to pIED^.NumberOfFunctions do begin

    dwOrd1 := pdwOrdinals^;
    k := 0;
    pdwFuncs := pdwFuncs1;
    while (k < dwOrd1) do begin
      inc(pdwFuncs);
      inc(k);
    end;

    if (pdwFuncs^ < pIDD^.VirtualAddress) or (pdwFuncs^ >= pIDD^.VirtualAddress + pIDD^.Size) then begin
      apiname := PAnsiChar(Pbyte(pIDH) + pdwNames^);
      if (AnsiStrComp(apiname, Pansichar(AnsiString(ProcName))) = 0) then begin
        result := Pointer(Pbyte(pIDH) + pdwFuncs^);
        exit;
      end;
    end;

    inc(pdwOrdinals);
    inc(pdwNames);
  end;
end;

directlink : http://cybercoding.wordpress.com/2011/10/03/delphi-getprocaddress-x32-x64/

Offline Zai

  • Admin
  • Pro500
  • *******
  • Tulisan: 2.892
  • Reputation: 58629
  • Jenis kelamin: Pria
    • Lihat Profil
    • Zainuddin Nafarin Blog
Re: [Delphi] GetProcAddress x32-x64
« Jawab #1 pada: Oktober 03, 2011, 09:45:37 AM »
Variabelnya gak pake syntax ini :

var
{$IFDEF 64BIT}
{$ELSE}
{$ENDIF}

Kan PE cuma bisa di compile ke salah satu, x64 atau x86 :D
4 main functions of Smadav :
(1) Additional protection for your PC, 100% compatible with other Antivirus!
(2) Best USB Antivirus, no more infection from USB!
(3) Best for offline use and low resource Antivirus
(4) Manual cleaner & tools to fight malwares

Offline meong

  • Pro100
  • ****
  • Tulisan: 121
  • Reputation: 203
    • Lihat Profil
Re: [Delphi] GetProcAddress x32-x64
« Jawab #2 pada: Oktober 03, 2011, 10:33:04 AM »
gak kok sai, di PE format itu sudah disediain untuk check apakah dia berupa 64 or 32 bit  (OptionalHeader.Magic), nah beda antara 32bit dan 64 bit PE itu hanya pada optional header.


Offline Zai

  • Admin
  • Pro500
  • *******
  • Tulisan: 2.892
  • Reputation: 58629
  • Jenis kelamin: Pria
    • Lihat Profil
    • Zainuddin Nafarin Blog
Re: [Delphi] GetProcAddress x32-x64
« Jawab #3 pada: Oktober 03, 2011, 10:54:45 AM »
gak kok sai, di PE format itu sudah disediain untuk check apakah dia berupa 64 or 32 bit  (OptionalHeader.Magic), nah beda antara 32bit dan 64 bit PE itu hanya pada optional header.

Jadi yang berbeda dari PE x64 vs x86 cuma optional header? Klo instruction set nya gak berbeda? :D
Kan juga ada register 64-bit (RAX, RBX, RCX, RDX)
Saya perlu pelajari bagian ini. cukup menarik hehe..
« Edit Terakhir: Oktober 03, 2011, 10:57:06 AM oleh Zai »
4 main functions of Smadav :
(1) Additional protection for your PC, 100% compatible with other Antivirus!
(2) Best USB Antivirus, no more infection from USB!
(3) Best for offline use and low resource Antivirus
(4) Manual cleaner & tools to fight malwares

Offline meong

  • Pro100
  • ****
  • Tulisan: 121
  • Reputation: 203
    • Lihat Profil
Re: [Delphi] GetProcAddress x32-x64
« Jawab #4 pada: Oktober 03, 2011, 11:57:20 AM »
yah untuk sekelas pembuat antivirus yang nomor 1 mestinya sudah bisa membedakan donk format file dan instruction machine.

kalau anda katakan apa yang terbaru pada machine 64,  penambahan register itu termasuk. tapi yang disini tentang structure PE (Portable Executable) Format, tepatnya walking eat..
« Edit Terakhir: Oktober 03, 2011, 11:59:42 AM oleh meong »

Offline Zai

  • Admin
  • Pro500
  • *******
  • Tulisan: 2.892
  • Reputation: 58629
  • Jenis kelamin: Pria
    • Lihat Profil
    • Zainuddin Nafarin Blog
Re: [Delphi] GetProcAddress x32-x64
« Jawab #5 pada: Oktober 03, 2011, 05:49:36 PM »
Ya, just misunderstanding, ternyata pembahasannya ttg perbedaan format file PE, bukan keseluruhan PE-nya
Santai aja kita masih sama2 belajar juga gan :D

Saya juga tanya di stackoverflow tadinya tentang perbedaan PE x64 vs x86, 64-bit kan keren bisa gede integer-nya apalagi buat perhitungan angka-angka besar.
« Edit Terakhir: Oktober 03, 2011, 05:51:10 PM oleh Zai »
4 main functions of Smadav :
(1) Additional protection for your PC, 100% compatible with other Antivirus!
(2) Best USB Antivirus, no more infection from USB!
(3) Best for offline use and low resource Antivirus
(4) Manual cleaner & tools to fight malwares

Offline meong

  • Pro100
  • ****
  • Tulisan: 121
  • Reputation: 203
    • Lihat Profil
Re: [Delphi] GetProcAddress x32-x64
« Jawab #6 pada: Oktober 04, 2011, 05:33:22 AM »
Ya, just misunderstanding, ternyata pembahasannya ttg perbedaan format file PE, bukan keseluruhan PE-nya
Santai aja kita masih sama2 belajar juga gan :D

Saya juga tanya di stackoverflow tadinya tentang perbedaan PE x64 vs x86, 64-bit kan keren bisa gede integer-nya apalagi buat perhitungan angka-angka besar.


Yang dimaksud keseluruhan pe itu seperti bagaimana ? hihi kita sama2 belajar :D


Offline Zai

  • Admin
  • Pro500
  • *******
  • Tulisan: 2.892
  • Reputation: 58629
  • Jenis kelamin: Pria
    • Lihat Profil
    • Zainuddin Nafarin Blog
Re: [Delphi] GetProcAddress x32-x64
« Jawab #7 pada: Oktober 04, 2011, 11:11:43 AM »
Definisi yang saya pake

format file = struktur PE Headers
keseluruhan = struktur + isi-nya (Raw Data?)

nih dapat gambar yang keren, yang saya maksud dengan "isi" itu data yang ada di dalam directories & sections yang warna-warni di gambar ini. CMIIW. Pertanyaannya, adakah raw data di tempat lain lagi? :D

« Edit Terakhir: Oktober 04, 2011, 11:15:39 AM oleh Zai »
4 main functions of Smadav :
(1) Additional protection for your PC, 100% compatible with other Antivirus!
(2) Best USB Antivirus, no more infection from USB!
(3) Best for offline use and low resource Antivirus
(4) Manual cleaner & tools to fight malwares

Offline meong

  • Pro100
  • ****
  • Tulisan: 121
  • Reputation: 203
    • Lihat Profil
Re: [Delphi] GetProcAddress x32-x64
« Jawab #8 pada: Oktober 04, 2011, 03:32:41 PM »
mas, PE itu mencakup semua data dalam file. tapi tentu saja semua tipe file itu mempunya structurenya sendiri2.. seperti pada portable executable terdiri dari
Dos header - dos stub - pe header - section header - section table seperti pada gambar anda. Jadi dari itu yang mana mengatakan kalau register 64bit yang anda singgung2 sebelumnya masuk bagian dari PE ? "KESELURUHAN PE" <----

oh ya about letak2 rawdata kalau yang anda maksud adalah overlay atau data yang tidak termasuk dari pe, banyak kemungkinan lokasi seperti: eof, sebelum pe header,  di antar section asalkan reconstruct pointertorawdata dari section pun bisa, dan banyak lagi tempat lainnya.




Offline Zai

  • Admin
  • Pro500
  • *******
  • Tulisan: 2.892
  • Reputation: 58629
  • Jenis kelamin: Pria
    • Lihat Profil
    • Zainuddin Nafarin Blog
Re: [Delphi] GetProcAddress x32-x64
« Jawab #9 pada: Oktober 04, 2011, 06:40:32 PM »


yang saya tanyakan waktu itu tentang register yang 64-bit, klo di gambar ini contohnya dia pake fungsi mov ke register rcx, panjang variabel yang di-mov kan 64-bit, nah pertanyaan saya lebih ke instruction set di x64 ini. :D

Untuk addressing di virtual memory nya juga pakai 64-bit, jadi kan bisa sampai 16 TB, dibandingkan yang 32-bit yang cuma sampai 4 GB. Contohnya yang mov dword ptr [rsp + 08h], ecx. Itu kan pake addressing 64-bit? CMIIW
4 main functions of Smadav :
(1) Additional protection for your PC, 100% compatible with other Antivirus!
(2) Best USB Antivirus, no more infection from USB!
(3) Best for offline use and low resource Antivirus
(4) Manual cleaner & tools to fight malwares