الوسوم:
حالة الموضوع:
مغلق
  1. unCoder

    unCoder Developer

    الأنتساب:
    ‏3 ديسمبر 2012
    المشاركات:
    11
    الإعجابات المتلقاة:
    0
    نقاط الجائزة:
    1
    الإقامة:
    NTOSKRNL
    [​IMG]

    DotNet Dynamic API Invoking

    الموضوع في البداية قصير وسلس وكل مايوجد به هو معلومة واحدة أتمتى أن اوصلها
    بطريقة سهلة

    كما نعلم فأن الـ apis عندما نقوم بإستخدامها اول عمل لود لها في الكود فستكون واضحة جدا كما إنها ستحمل بالإمبورت تيبل ممايساعد الحمايات على كشفنا
    الغرض من الموضوع ليس تخطي الحمايات لكن الطريقة مفيدة أيضا من هذه الناحية

    في هذه الطريقة سنقوم بإستخدام الطريقة الداينميكية للإستدعاء وهي الطريقة اللتي يتم عملها في الرن تايم أي والبرنامج يعمل فنبتعد عن الشبهات




    [​IMG]


    أولا يجب أن نحمل كلاس الـ

    [ System.Runtime.InteropServices ]

    ثم نحدد الـ api اللذي نريد إستدعائه ونعرف البروتو تايب الخاص به على شكل
    function delegate

    في هذا المثال سأختار دالة Beep

    كود PHP:
    Public Delegate Function bep(ByVal dwFreq As UIntegerByVal dwDuration As UInteger) As Boolean
    ثم نحتاج لجلب أدرس الدالة عن طريق الدالة GetProcAddress
    وجلب عنوان المكتبة ايضا عن طريق LoadLibraryA

    نحتاج لتعريف هذه الدوال أولا

    كود PHP:
        <DllImport("kernel32.dll"SetLastError:=True)> _
        
    Private Shared Function GetProcAddress(ByVal hModule As IntPtrByVal procName As String) As UIntPtr
        End 
    Function
        <
    DllImport("kernel32.dll"SetLastError:=True)> _
        
    Public Shared Function LoadLibrary(ByVal lpFileName As String) As IntPtr
      
        End 
    Function
    ثم نجلب نضع بوينتر لادرس الدالة في الديليجيت اللذي قمنا بتعريفه سابقا للدالة
    ثم نقوم بعمل الداينميك إنفوك ونضع فيه البارمترات

    كود PHP:
            Dim _AP As bep
            _AP 
    Marshal.GetDelegateForFunctionPointer(haddrGetType(bep))
            
    _AP.DynamicInvoke(CType(1000UInteger), CType(1000UInteger))
    الكود كامل

    VB.NET

    كود PHP:
       Public Delegate Function bep(ByVal dwFreq As UIntegerByVal dwDuration As UInteger) As Boolean

        
    <DllImport("kernel32.dll"SetLastError:=True)> _
        
    Private Shared Function GetProcAddress(ByVal hModule As IntPtrByVal procName As String) As UIntPtr
        End 
    Function
        <
    DllImport("kernel32.dll"SetLastError:=True)> _
        
    Public Shared Function LoadLibrary(ByVal lpFileName As String) As IntPtr
        End 
    Function

        Public Function 
    Inv0ke()
            
    Dim haddr As Integer GetProcAddress(LoadLibrary("kernel32"), "Beep")

            
    Dim _AP As bep
            _AP 
    Marshal.GetDelegateForFunctionPointer(haddrGetType(bep))
            
    _AP.DynamicInvoke(CType(1000UInteger), CType(1000UInteger))

        
    End Function
    c#

    كود PHP:
    [DllImport("kernel32"CharSet CharSet.AnsiExactSpelling trueSetLastError true)]
         static 
    extern IntPtr GetProcAddress(IntPtr hModulestring procName);

        [
    DllImport("kernel32"SetLastError=trueCharSet CharSet.Unicode)]
        static 
    extern IntPtr LoadLibrary(string lpFileName);


            public 
    delegate bool bep(uint dwFrequint dwDuratio);


            
    void inv0ke()
            {
                
    IntPtr hAddr GetProcAddress(LoadLibrary("kernel32"), "Beep");

                
    bep xx = (bep)Marshal.GetDelegateForFunctionPointer(hAddr,typeof(bep));
                
    xx.DynamicInvoke((uint)1000, (uint)1000);
                
            }
    [​IMG]

    أتمنى أن ينال الشرح على إعجابكم ويفيدكم الموضوع

    والسلام عليكم ورحمة الله وبركاته

     
حالة الموضوع:
مغلق

مشاركة هذه الصفحة