EasyHook を使用して、エクスポートされた関数と、さまざまな C++ クラスの既知の vtable 関数の両方をフックすることに成功しました。これらすべてのケースで、ターゲット プログラムは DLL を使用しています。
関数のエントリ ポイントのアドレスがわかっている場合、別のライブラリではなく、ライブラリがターゲット プログラムにリンクされている場合に同じことを行うことは可能ですか?
EasyHook を使用して、エクスポートされた関数と、さまざまな C++ クラスの既知の vtable 関数の両方をフックすることに成功しました。これらすべてのケースで、ターゲット プログラムは DLL を使用しています。
関数のエントリ ポイントのアドレスがわかっている場合、別のライブラリではなく、ライブラリがターゲット プログラムにリンクされている場合に同じことを行うことは可能ですか?
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 が必要になることに注意してください。
ハッピーフッキング!