我試圖扭轉引擎注入進程的DLL,那鉤子winsock send()
並通過PipeStream
發送數據。使用命名管道的C + +和C#通信
這是C#代碼讀取管道流:
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
public struct PipeHeader
{
[MarshalAs(UnmanagedType.I1)]
public byte command;
[MarshalAs(UnmanagedType.I4)]
public int sockid;
public int datasize;
}
public static object RawDeserializeEx(byte[] rawdatas, Type anytype)
{
int rawsize = Marshal.SizeOf(anytype);
if (rawsize > rawdatas.Length)
return null;
GCHandle handle = GCHandle.Alloc(rawdatas, GCHandleType.Pinned);
IntPtr buffer = handle.AddrOfPinnedObject();
object retobj = Marshal.PtrToStructure(buffer, anytype);
handle.Free();
return retobj;
}
private void PipeRead()
{
byte[] dbPipeMsgIn = new byte[9];
byte[] zero = new byte[] { 0 };
byte[] dbPipeMsgInData;
PipeLoop:
while (pipeIn.Read(dbPipeMsgIn, 0, 9) != 0)
{
strPipeMsgIn = (PipeHeader)RawDeserializeEx(dbPipeMsgIn, typeof(PipeHeader));
if (strPipeMsgIn.datasize != 0)
{
dbPipeMsgInData = new byte[strPipeMsgIn.datasize];
pipeIn.Read(dbPipeMsgInData, 0, dbPipeMsgInData.Length);
//do something with dbPipeMsgInData
}
}
if (pipeIn.IsConnected) goto PipeLoop;
}
到目前爲止,我已經迷上了send()
FUNC,連接和發送郵件槽管。 問題是收到的數據不是我所期望的數據,所以可能我發錯了。我需要幫助,因爲我幾乎沒有C++知識。
C++代碼:
#pragma pack(1)
typedef struct
{
byte command;
int sockid;
int datasize;
} PipeHeader;
#pragma pack(0)
int WINAPI MySend(SOCKET s, const char* buf, int len, int flags)
{
PipeHeader ph;
string p(buf);
if(p.find("<TalkMsg") == 0){
byte cmd = 0;
ph.command = cmd;
ph.sockid = s;
ph.datasize = len;
char buffer[sizeof(ph)];
memcpy(buffer, &ph, sizeof(ph));
if(SendPipeMessage(buffer, sizeof(buffer))){
if(SendPipeMessage(buf, sizeof(buf))){
MessageBox(NULL,"Message Sent", NULL, NULL);
}
}
fopen_s(&pSendLogFile, "C:\\SendLog.txt", "a+");
fprintf(pSendLogFile, "%s\n", buf);
fclose(pSendLogFile);
}
return pSend(s, buf, len, flags);
}
BOOL SendPipeMessage(LPCVOID lpvMessage, DWORD ctToWrite){
// Send a message to the pipe server.
cbToWrite = sizeof(lpvMessage);
fSuccess = WriteFile(
hPipe, // pipe handle
lpvMessage, // message
cbToWrite, // message length
&cbWritten, // bytes written
NULL); // not overlapped
if (! fSuccess)
{
return false;
}else return true;
}
編輯,詳細信息:
的目標是發送包含9個字節長PipeHeader
STRUCT在管的消息,然後發送包含Winsock的另一消息send()
數據,(在buf
變量),閱讀關於C#應用的管並解析所述第一消息獲得下一個傳入消息的數據尺寸(這是的PipeHeader
的datasize
變種),然後,使用datasize
再次讀取管道以獲取send()緩衝區。 我認爲那是以這種方式工作的。我不太清楚Pipes是如何工作的。
反正主要目的是從C++ DLL發送send()
緩衝到C#應用程序。
更新: 看來,我必須先序列化的方式PipeHeader
結構,所以我可以在C#代碼中使用RawDeserializeEx()
反序列化。 我試圖這樣做的:
char buffer[sizeof(ph)];
memcpy(buffer, &ph, sizeof(ph));
的問題是,在C++ sizeof(ph)
,或sizeof(buffer)
返回12個字節。 相反在C#同一結構體的非託管大小(Marshal.SizeOf()
),返回9個字節。
更新2: 通過更改結構打包解決了大小差異。 但我仍然沒有在C#中獲得正確的值。 代碼已更新。
請發佈整個C++代碼。有許多變量沒有在你的代碼中聲明,例如'hPipe'或'cbWritten'。什麼是pSend? –