Apakah mungkin untuk memanggil metode pribadi dari kelas yang diekspor dari DLL?
Apakah metode tersebut akan disembunyikan dari orang yang ingin menggunakannya tetapi tidak seharusnya menggunakannya?
terima kasih :)
Apakah mungkin untuk Memanggil metode pribadi yang diekspor di c++
Jawaban (2)
Ya, itu mungkin, tetapi Anda perlu menggunakan trik casting yang kotor atau mengandalkan perilaku semi-tidak terdefinisi, namun yang pasti Anda dapat memanggil fungsi yang diekspor, tidak peduli statusnya pribadi/publik.
Bahasa tersebut tidak memberikan keamanan terhadap penyerang jahat. Hal ini akan membantu semua orang untuk mematuhi aturan, namun tidak akan melindungi mereka yang mencoba merusak sistem.
Contohnya:
- gunakan
GetProcAddress()
untuk mendapatkan alamat fungsi, masukkan ke jenis fungsi anggota yang tepat, dan panggil. - buat file header kelas yang dimodifikasi, nyatakan semuanya sebagai publik (atau cukup tambahkan fungsi statis,
void crowbar()
), kompilasi dengan itu. (Perilaku tidak terdefinisi, karena Anda melanggar Aturan Satu Definisi, tapi mungkin akan berhasil...)
Jangan mengandalkan kata kunci pribadi C++ untuk keamanan.
GetProcAddress
. Dalam kebanyakan kasus, panggilan sebenarnya memerlukan penulisan beberapa perakitan. Tapi itu mungkin.
- person Ben Voigt; 18.06.2011
this
, dan konvensi pemanggilan thiscall
tidak cocok dengan cdecl
atau stdcall
, karena thiscall
meneruskan penunjuk this
dalam register daripada menggunakan tumpukan. Mungkin kompatibel dengan fastcall
, saya tidak ingat.
- person Ben Voigt; 18.06.2011
thiscall
, tetapi itu harus tersirat dalam tipe fungsi ptr-ke-anggota.
- person Macke; 18.06.2011
this
-penunjuk, dll. Fungsi penunjuk ke anggota bukanlah penunjuk fungsi. GetProcAddress
mengembalikan penunjuk fungsi, bukan penunjuk ke anggota. Hasil dari GetProcAddress
perlu diubah ke tipe penunjuk fungsi yang benar (termasuk konvensi pemanggilan), tetapi tipe yang benar tidak dapat ditulis dalam C++, menurut saya tidak.
- person Ben Voigt; 18.06.2011
Jika muncul di tabel ekspor DLL, maka dapat dipanggil dengan menggunakan GetProcAddress
dan memanggil penunjuk fungsi yang dikembalikan. Ada beberapa kendala teknis untuk mendapatkan konvensi pemanggilan yang tepat, namun hal ini mungkin terjadi (kemungkinan besar diperlukan beberapa bahasa assembly).
Sebenarnya, fungsi apa pun yang menghasilkan instance out-of-line oleh kompiler dapat dipanggil dengan kode asli apa pun. Diekspor oleh DLL membuatnya lebih mudah untuk menemukan alamat kode untuk fungsi tersebut.