-1

我在 c# 中使用 easyhook 得到了一个不安全的程序集。下面的代码运行良好,但总而言之,当调用此方法时,我得到了 NullReferenceException。

这个类的实例是一个单例模式它通过了几次和一个点它得到了一个空引用

此类如果用于拦截某些 I/O 文件中的所有写入以进行某些操作

任何想法见代码..

仅在执行 SQLCOMMAND 时发生

在 ....SystemHook.WriteFileHook(IntPtr hFile, Void* lpBuffer, UInt32 nNumberOfBytesToWrite, UInt32& lpNumberOfBytesWritten, NativeOverlapped& lpOverlapped)
在 SNIWriteSyncOverAsync(SNI_ConnWrapper* , SNI_Packet* )在
SNINativeMethodWrapper.SNIWritePacket(SafeHandle pConn, SafeHandle 数据包)
.Data.SqlClient.TdsParserStateObject.SNIWritePacket(SNIHandle 句柄,SNIPacket 数据包,UInt32 和 sniError,布尔型 canAccumulate,布尔型 callerHasConnectionLock)
在 System.Data.SqlClient.TdsParserStateObject.WriteSni(布尔型 canAccumulate)
在 System.Data.SqlClient.TdsParserStateObject.WritePacket(字节
在 System.Data.SqlClient.TdsParserStateObject.ExecuteFlush() 处的flushMode,布尔值 canAccumulate )
在 System.Data.SqlClient.TdsParser.TdsExecuteSQLBatch(字符串文本,Int32 超时,SqlNotificationRequest 通知请求,TdsParserStateObject stateObj,布尔同步,布尔 callerHasConnectionLock,字节 [] enclavePackage)
在 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior , Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource` 1 完成,Int32 超时,Task& 任务,Boolean&usedCache,Boolean asyncWrite,Boolean inRetry)
在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String 方法)
在 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior 行为, String 方法)
在 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader (CommandBehavior 行为)
在 System.Data.Common.DbCommand.ExecuteReader()

bool WriteFileHook(IntPtr hFile, void* lpBuffer, uint nNumberOfBytesToWrite, out uint lpNumberOfBytesWritten, [In] ref System.Threading.NativeOverlapped lpOverlapped)
{

    bool results = false;
    bool write = true;

    lpNumberOfBytesWritten = 0; // CRASH!!!

    ... 
}
4

1 回答 1

0

贾斯汀斯坦宁的评论是正确的:

尝试使用 uint* 或 ref uint 来正确匹配本机签名 LPDWORD。

我有错误的签名。

于 2019-01-13T00:18:58.070 回答