alexa-tracking

Main Content

1024
1024
KASKUS
51
244
https://www.kaskus.co.id/thread/5300a02038cb17d02a8b4590/mengubah-file-object-menjadi-dll
Mengubah File Object Menjadi DLL
Pada tutorial kali ini akan dibahas mengenai cara sederhana untuk mengubah file
object (.obj) menjadi .dll pada windows dimana kita tidak mempunyai file source
dan tidak juga memiliki file defenisi, dan hanya memiliki file objectnya saja.
Sebelumnya akan dijelaskan terlebih dahulu cara membuat dll menggunakan bahasa
C dan compiler gcc (mingw).

Mengubah File Object Menjadi DLL


-----[ Langkah-langkah

* Berikut ini adalah contoh source code sederhana menggunakan bahasa C untuk
membuat dll. Kita menggunakan fungsi "_DllMainCRTStartup" dan bukan "DllMain"
tentunya dengan alasan tertentu[1]. Selain itu, kita juga menggunakan direk-
tif 'extern "C" { ... }' untuk mencegah terjadinya name mangling[2]. Dan
agar fungsinya bisa dieksport, maka digunakan keyword "__declspec(dllexport)"
untuk lebih jelasnya bisa dibaca pada MSDN[3]. Listingnya adalah sebagai ber-
ikut:

Spoiler for :


* Selanjutnya, kita akan melakukan kompilasi tanpa proses linking terhadap kode
tersebut.
Code:
      gcc -Wall -c -s -o contoh.obj contoh.c


* Lalu kita melihat fungsi apa saja yang ada pada file object dari proses kom-
pilasi tersebut menggunakan aplikasi nm.
Code:
        nm -g contoh.obj
0000002f T __DllMainCRTStartup@12
U _MessageBoxA@[member='1642EQ']
00000000 T _pesan


* Terlihat bahwa fungsi "pesan" namanya berubah menjadi "_pesan", hal tersebut
wajar. Selanjutnya kita akan membuat file defenisi untuk digunakan pada pro-
ses linking untuk menentukan fungsi apa saja yang dieksport. Formatnya seder-
hana, cukup menuliskan keyword "EXPORTS" dan spasi kemudian nama-nama fungsi
yang akan dieksport. Untuk contoh dll yang akan kita buat, cukup membuat file
"contoh.def" (namanya tidak harus contoh.def)[4], dan isinya adalah baris ber
ikut:
Code:
      EXPORTS pesan


* Simpan file "contoh.def" lalu kita akan melanjutkan proses linking dengan
perintah seperti ini:

Code:
        gcc -Wall -mdll -s -o contoh.dll contoh.obj contoh.def



* Selanjutnya kita dapat langsung menguji file .dll yang dihasilkan dengan
menggunakan aplikasi bawaan windows yaitu "rundll32" untuk memanggil fungsi
yang dieksport dari file "contoh.dll" dalam hal ini adalah fungsi "pesan".
Caranya sebagai berikut:
Code:
        rundll32 contoh.dll,pesan


* Jika perintah tersebut dijalankan, maka akan muncul messagebox dengan caption
"pesan" dan teksnya "hello all emoticon-Big Grin". Berarti dll yang kita buat berhasil. Kini
saatnya melanjutkan ke point utama yaitu membuat file dll dari file object
yang tidak disertai file pendukung lainnya.

* Langkahnya sama dengan di atas, yaitu pertama kita mencari fungsi apa saja
yang ada dan bisa diakses dari file objectnya. Kita bisa menggunakan nm:

Code:
        nm -g asmxml.obj
00000076 T _ax_classFromElement
00000096 T _ax_classFromString
00000000 T _ax_initialize
0000005e T _ax_initializeClassParser
00000010 T _ax_initializeParser
0000002c T _ax_parse
0000006a T _ax_releaseClassParser
00000020 T _ax_releaseParser


* Atau bisa juga menggunakan aplikasi dari microsoft visual c++/studio yaitu
dumpbin seperti berikut ini:

Code:
        dumpbin /symbols asmxml.obj
Microsoft (R) COFF/PE Dumper Version 8.00.50727.42
Copyright (C) Microsoft Corporation. All rights reserved.

Dump of file asmxml.obj

File Type: COFF OBJECT

COFF SYMBOL TABLE
000 00000000 SECT1 notype Static | .flat
001 00000000 SECT2 notype Static | .asmdata
002 00000000 SECT1 notype External | _ax_initialize
003 00000010 SECT1 notype External | _ax_initializeParser
004 00000020 SECT1 notype External | _ax_releaseParser
005 0000002C SECT1 notype External | _ax_parse
006 0000005E SECT1 notype External | _ax_initializeClassParser
007 0000006A SECT1 notype External | _ax_releaseClassParser
008 00000076 SECT1 notype External | _ax_classFromElement
009 00000096 SECT1 notype External | _ax_classFromString

String Table Size = 0x9E bytes

Summary

8 .asmdata
44D7 .flat


* Hasilnya sama, ada 8 fungsi dan fungsi-fungsi tersebut tinggal kita masukkan
ke dalam file definisi seperti ini:
Code:
        EXPORTS ax_initialize
ax_initializeParser
ax_releaseParser
ax_parse
ax_initializeClassParser
ax_releaseClassParser
ax_classFromElement
ax_classFromString


* Simpan file definisi tersebut, kemudian lanjutkan dengan proses linking:
Code:
        gcc -Wall -mdll -s -o asmxml.dll asmxml.obj asmxml.def


* Setelah selesai, kita dapat mengecek kembali apakah benar fungsi-fungsi
tersebut telah dieksport. Menggunakan dumpbin dengan perintah seperti ini:
Code:
        dumpbin /exports asmxml.dll
Microsoft (R) COFF/PE Dumper Version 8.00.50727.42
Copyright (C) Microsoft Corporation. All rights reserved.

Dump of file asmxml.dll

File Type: DLL

Section contains the following exports for asmxml.dll

00000000 characteristics
50D3134D time date stamp Thu Dec 20 20:31:57 2012
0.00 version
1 ordinal base
8 number of functions
8 number of names

ordinal hint RVA name

1 0 00003076 ax_classFromElement
2 1 00003096 ax_classFromString
3 2 00003000 ax_initialize
4 3 0000305E ax_initializeClassParser
5 4 00003010 ax_initializeParser
6 5 0000302C ax_parse
7 6 0000306A ax_releaseClassParser
8 7 00003020 ax_releaseParser

Summary

1000 .asmdata
1000 .bss
1000 .data
1000 .edata
5000 .flat
1000 .idata
1000 .rdata
1000 .reloc
1000 .text


* Nah, fungsi-fungsinya sudah dieksport, berarti tugas kita telah selesai emoticon-Big Grin
Sekian tutorial singkat kali ini, semoga bermanfaat.
Initializing a DLL

Code:
http://msdn.microsoft.com/en-us/library/7h0a8139.aspx


Name mangling

Code:
http://en.wikipedia.org/wiki/Name_mangling


Quote:Original Posted By galihvalentino

* Selanjutnya kita dapat langsung menguji file .dll yang dihasilkan dengan
menggunakan aplikasi bawaan windows yaitu "rundll32" untuk memanggil fungsi
yang dieksport dari file "contoh.dll" dalam hal ini adalah fungsi "pesan".
Caranya sebagai berikut:
Code:
        rundll32 contoh.dll,pesan


Kalau agan mau ngetes dll yang agan buat, buat program khusus untuk ngetes dll itu, jangan pakai rundll32. rundll32 hanya bisa digunakan untuk memanggil fungsi dari DLL yang khusus ditulis agar dapat dipanggil oleh rundll32, bukan sembarang DLL.

Seperti ini function signature yang dipanggil oleh rundll32:
Code:
void CALLBACK
EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);


Sedangkan signature fungsi pesan di atas cuma void pesan(); di mana bukan hanya parameternya saja yang tidak sama, calling convention nya juga tidak disebut secara eksplisit menggunakan stdcall.

Info lebih lanjut: http://support.microsoft.com/kb/164787/en-us
emoticon-Sundul Gan (S)emoticon-Sundul Gan (S)emoticon-Sundul Gan (S)
×