0

堆栈溢出

你好,

我正在编写一个 C# 应用程序来嗅探用 Qt 编写的应用程序的网络流量。据我所知,目标应用程序使用:

类 QByteArray _ thiscall QIODevice::read( _int64)

读取数据。我的 C# 应用程序使用 EasyHook 库拦截对 QIODevice::read() 的任何调用,然后将参数传递给尝试调用本机方法的 C++/CLI 对象。本机方法返回一个 QByteArray,我将它传回给 C#,C# 将它传回给目标应用程序。

总之:

目标应用程序 => Easyhook/C# => C++/CLI => 本地方法 => C++/CLI => Easyhook/C# => 目标应用程序

该架构似乎可以完美地工作,除非被拦截方法的返回类型是本机对象(例如上面的 QByteArray)。

我的 C# 代码如下所示:

    // //////////////////////////////////
    // public: class QByteArray __thiscall QIODevice::read(__int64)
    // //////////////////////////////////
    [UnmanagedFunctionPointer(CallingConvention.ThisCall, CharSet = CharSet.Unicode, SetLastError = true)]
    delegate IntPtr DDeviceRead(IntPtr Device, Int64 maxSize);

    // Intercept all calls to Device::Read()
    public IntPtr DeviceRead_Intercepted(IntPtr Device, Int64 maxSize)
    {
        // Call the method from C++/CLI
        IODeviceWrapper qtDevice = new IODeviceWrapper(Device);
        return qtDevice.Read(maxSize);
    }

我的 C++/CLI 代码如下所示:

IntPtr IODeviceWrapper::Read(Int64 maxSize)
{
    QByteArray * retArray = &Native->read(maxSize);
    return static_cast<IntPtr>(retArray);
}

C++ 不是我最喜欢的语言——所以指针和对象引用之类的东西有时会让人有点困惑。我已经尝试了很多变化,但似乎无法理解它。

我假设的本机 Qt read() 函数返回新分配的 QByteArray 的地址,该变量接受该地址,因此我的 C++/CLI 代码需要将该地址一直沿链传递回目标应用程序。

这是怎么做到的?

4

0 回答 0