سؤال

باستخدام EasyHook ، قمت بنجاح ربط كل من الوظائف المصدرة ووظائف VTABLE المعروفة لمختلف فئات C ++. في كل هذه الحالات ، استخدمت البرامج المستهدفة DLLs.

شريطة أن أعرف عنوان نقطة دخول الوظيفة ، هل من الممكن أن تفعل الشيء نفسه عندما يتم ربط المكتبة بالبرنامج المستهدف بدلاً من أن تكون مكتبة منفصلة؟

هل كانت مفيدة؟

المحلول

يظهر مع easyhook يمكنك ربط أي بروتوتين فرعي يمكن حسابه.

في حالتي ، قم بتثبيط SSL_Read و SSL_WRITE OpenSSL كان بسيطًا مثل تحديد الإزاحة مع تصحيح الأخطاء المفضل لدي ثم تثبيت الخطافات.

// delegate for EasyHook:
[UnmanagedFunctionPointer(CallingConvention.Cdecl, 
    SetLastError = true, CharSet = CharSet.Ansi)]
delegate Int32 SLL_readDelegate(IntPtr SSL_ptr, IntPtr buffer, Int32 length);

// import SSL_read (I actually did it manually, but this will work in most cases)
/* proto from ssl_lib.c -> int SSL_read(SSL *s,void *buf,int num) */
[DllImport("ssleay32.dll", SetLastError = true)]
public static extern Int32 SSL_read(IntPtr ssl, IntPtr buffer, Int32 len);

// the new routine
static Int32 SSL_readCallback(IntPtr SSL_ptr, IntPtr buffer, Int32 length)
{
    /* call the imported SSL_read */
    int ret = SSL_read(SSL_ptr, buffer, length);
    /* TODO: your code here, e.g:
     * string log_me = Marshal.PtrToString(buffer, ret);
     */
    return ret;
}

الآن كل ما تبقى هو تثبيت الخطاف:

private LocalHook sslReadHook;

public void Run(RemoteHooking.IContext InContext, String InArg1)
{
    // ... initialization code omitted for brevity

    /* the value for ssl_read_addr is made up in this example
     * you'll need to study your target and how it's loaded(?) to 
     * identify the addresses you want to hook
     */
    int ssl_read_addr = 0x12345678; /* made up for examples sake */
    sslReadHook = LocalHook.Create(new IntPtr(ssl_read_addr),
        new SSL_readDelegate(SSL_readCallback), this);

    // ...
}

أود أن أذكر أنه في هذا المثال ، ستحتاج إلى libeay32.dll و ssleay32.dll كما يعتمد الأخير على السابق.

سعيد التثبيت!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top