堆栈溢出
你好,
我正在编写一个 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 代码需要将该地址一直沿链传递回目标应用程序。
这是怎么做到的?