質問

EasyHookを使用して、さまざまなC ++クラスのエクスポートされた機能と既知の既知のvtable関数の両方を正常にフックしました。これらすべての場合、ターゲットプログラムはDLLを使用しています。

関数のエントリポイントのアドレスを知っていれば、別のライブラリであるのではなく、ライブラリがターゲットプログラムにリンクされたときに同じことをすることは可能ですか?

役に立ちましたか?

解決

で表示されます EasyHook アドレスが計算可能なサブルーチンをフックすることができます。

私の場合、Static Linked 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