เป็นไปได้ไหมที่จะเรียกใช้วิธีการส่วนตัวของคลาสที่ส่งออกจาก DLL?
มันจะถูกซ่อนจากผู้ที่ต้องการใช้แต่ไม่ควรซ่อนหรือไม่
ขอบคุณ :)
เป็นไปได้ไหมที่จะเรียกใช้วิธีการส่วนตัวที่ส่งออกใน c ++
คำตอบ (2)
ใช่ เป็นไปได้ แต่คุณต้องใช้เทคนิคการแคสต์ที่สกปรกหรืออาศัยพฤติกรรมกึ่งไม่ได้กำหนด แต่เพื่อความแน่นอน คุณสามารถเรียกใช้ฟังก์ชันที่ส่งออกได้ ไม่ว่าจะเป็นสถานะส่วนตัว/สาธารณะก็ตาม
ภาษาไม่ได้ให้การรักษาความปลอดภัยจากผู้โจมตีที่เป็นอันตราย มันจะช่วยให้ทุกคนเล่นตามกฎ แต่จะไม่ป้องกันผู้ที่พยายามจะทำลายระบบ
ตัวอย่างเช่น:
- ใช้
GetProcAddress()
เพื่อรับที่อยู่ของฟังก์ชัน ส่งไปยังประเภทฟังก์ชันสมาชิกที่ถูกต้อง แล้วเรียกใช้ - สร้างไฟล์ส่วนหัวที่แก้ไขแล้วของคลาส โดยประกาศทุกอย่างให้เป็นสาธารณะ (หรือเพียงเพิ่มฟังก์ชันคงที่
void crowbar()
) คอมไพล์ต่อต้านสิ่งนั้น (พฤติกรรมที่ไม่ได้กำหนด เนื่องจากคุณละเมิด One Defintion Rule แต่มันอาจจะได้ผล...)
อย่าใช้คีย์เวิร์ดส่วนตัวของ C++ เพื่อความปลอดภัย
GetProcAddress
ในกรณีส่วนใหญ่ การโทรจริงจะต้องมีการเขียนชุดประกอบบางส่วน แต่มันเป็นไปได้
- person Ben Voigt; 18.06.2011
this
อย่างใดและรูปแบบการโทร thiscall
ไม่ตรงกับ cdecl
หรือ stdcall
เนื่องจาก thiscall
ผ่านตัวชี้ this
ในการลงทะเบียนแทนที่จะใช้สแต็ก มันอาจจะเข้ากันได้กับ fastcall
จำไม่ได้
- person Ben Voigt; 18.06.2011
thiscall
แต่นั่นควรมีความหมายโดยนัยในรูปแบบ ptr-to-member-function
- person Macke; 18.06.2011
this
-pointer-adjustments ฯลฯ ตัวชี้ไปยังสมาชิกฟังก์ชันไม่ใช่ตัวชี้ฟังก์ชัน GetProcAddress
ส่งคืนตัวชี้ฟังก์ชัน ไม่ใช่ตัวชี้ถึงสมาชิก ผลลัพธ์ของ GetProcAddress
จำเป็นต้องส่งไปยังประเภทตัวชี้ฟังก์ชันที่ถูกต้อง (รวมถึงรูปแบบการเรียก) แต่ประเภทที่ถูกต้องไม่สามารถเขียนด้วย C ++ ได้ ฉันไม่คิดว่า
- person Ben Voigt; 18.06.2011
หากปรากฏในตารางการส่งออกของ DLL ก็สามารถเรียกใช้ได้โดยใช้ GetProcAddress
และเรียกใช้ตัวชี้ฟังก์ชันที่ส่งคืน มีอุปสรรคทางเทคนิคบางประการเพื่อให้ได้รูปแบบการโทรที่ถูกต้อง แต่ก็เป็นไปได้ (โดยส่วนใหญ่แล้วจะต้องใช้ภาษาแอสเซมบลีบางอย่าง)
พูดอย่างเคร่งครัด ฟังก์ชันใดๆ ที่คอมไพลเลอร์สร้างอินสแตนซ์นอกบรรทัดสามารถเรียกใช้ด้วยโค้ดเนทีฟใดก็ได้ การส่งออกโดย DLL ช่วยให้ค้นหาที่อยู่ของโค้ดสำหรับฟังก์ชันได้ง่ายขึ้นมาก