소스 검색

1、进程通信使用命名管道。

Jeff 6 년 전
부모
커밋
78db00b0b4

+ 2 - 0
source/hook/WeChats/WeChats.vcxproj

@@ -122,6 +122,7 @@
   <ItemGroup>
     <ClCompile Include="..\common\CharEncoding.cpp" />
     <ClCompile Include="..\common\CurlClient.cpp" />
+    <ClCompile Include="..\common\NamePipeServer.cpp" />
     <ClCompile Include="..\pb\msg.pb.cc">
       <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
       <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader>
@@ -156,6 +157,7 @@
   <ItemGroup>
     <ClInclude Include="..\common\CharEncoding.h" />
     <ClInclude Include="..\common\CurlClient.h" />
+    <ClInclude Include="..\common\NamePipeServer.h" />
     <ClInclude Include="..\pb\msg.pb.h" />
     <ClInclude Include="..\skinui\BCMenu.h" />
     <ClInclude Include="..\skinui\BtnST.h" />

+ 9 - 0
source/hook/WeChats/WeChats.vcxproj.filters

@@ -22,6 +22,9 @@
     <Filter Include="curl">
       <UniqueIdentifier>{f55a18d1-6921-41d2-b53b-905b1db5544e}</UniqueIdentifier>
     </Filter>
+    <Filter Include="pipe">
+      <UniqueIdentifier>{1ac4683c-121a-4160-8858-02f411a20977}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Global.cpp">
@@ -102,6 +105,9 @@
     <ClCompile Include="..\common\CurlClient.cpp">
       <Filter>curl</Filter>
     </ClCompile>
+    <ClCompile Include="..\common\NamePipeServer.cpp">
+      <Filter>pipe</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="Global.h">
@@ -191,6 +197,9 @@
     <ClInclude Include="..\common\CurlClient.h">
       <Filter>curl</Filter>
     </ClInclude>
+    <ClInclude Include="..\common\NamePipeServer.h">
+      <Filter>pipe</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <Image Include="res\WeChats.ico">

+ 3 - 1
source/hook/WeChats/WxMgr.cpp

@@ -171,7 +171,9 @@ VOID CWxMgr::AddMapItem(DWORD dwProcId, LPCTSTR lpItemName)
 	wxObjInfo.pWxButton->Create(lpItemName, WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX, CalcRect(), m_pMainWnd, GetFreeButtonId(dwProcId));
 #ifdef DEBUG
 	//HBITMAP hBitmapIn = (HBITMAP)::LoadImage(NULL, _T("E:\\bin\\WeChats2017\\image\\132.jpg"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
-	HBITMAP hBitmapIn = LoadImgFromFile(_T("E:\\bin\\WeChats2017\\image\\132.jpg"));
+	TCHAR szWxImage[MAX_PATH] = {0};
+	_stprintf_s(szWxImage, _T("%s%s\\%s.jpg"), g_szModulePath, _T("Image"), _T("132"));
+	HBITMAP hBitmapIn = LoadImgFromFile(szWxImage);
 	if (hBitmapIn)
 		wxObjInfo.pWxButton->SetBitmaps(hBitmapIn, COLORREF(120));
 #endif // DEBUG

+ 62 - 0
source/hook/common/NamePipeClient.cpp

@@ -0,0 +1,62 @@
+#include "stdafx.h"
+#include "NamePipeClient.h"
+
+using namespace std;
+
+void NamePipeClient::OpenNamedPipeInClient()
+{    
+    //等待连接命名管道    
+    if( !WaitNamedPipe(_T("\\\\.\\pipe\\testspipe"), NMPWAIT_WAIT_FOREVER) )    
+    {        
+        cout<<"命名管道实例不存在 ..."<< endl<< endl;        
+        return;    
+    } 
+    cout << "成功连接到服务器" << endl;
+    //打开命名管道    
+    hNamedPipe = CreateFile( _T("\\\\.\\pipe\\testspipe"), GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);    
+    if( INVALID_HANDLE_VALUE == hNamedPipe )    
+    {        
+        cout << "打开命名管道失败!!!" << endl << endl;        
+        return;    
+    }
+}
+
+void NamePipeClient::NamedPipeReadInClient()
+{
+      char * pReadBuf;    
+      DWORD  dwRead;     
+      pReadBuf = new char[strlen(pStr) + 1];    
+      memset(pReadBuf, 0, strlen(pStr) + 1);     
+      //从命名管道中读取数据    
+      if( !ReadFile(hNamedPipe, pReadBuf, strlen(pStr), &dwRead, NULL) )    
+      {        
+          delete []pReadBuf;         
+          cout << "读取数据失败 ..."<< endl << endl;        
+          return;    
+      }    
+      cout<<"读取数据成功:: "<< pReadBuf << endl << endl;
+}
+
+void NamePipeClient::NamedPipeWriteInClient()
+{
+       DWORD dwWrite;     
+       //向命名管道中写入数据    
+       if( !WriteFile(hNamedPipe, pStr, strlen(pStr), &dwWrite, NULL) )    
+       {        
+           cout<<"写入数据失败 ..." << endl << endl;        
+           return;    
+       }    
+       cout<< "写入数据成功:: "<< pStr << endl << endl;
+}
+
+int main()
+{
+    NamePipeClient pipeclient;
+    pipeclient.OpenNamedPipeInClient();
+    //往命名管道中写入数据
+    pipeclient.NamedPipeWriteInClient();
+    //接收从服务器发来的数据
+    pipeclient.NamedPipeReadInClient();
+    system("pause");
+    return 0;
+}

+ 29 - 0
source/hook/common/NamePipeClient.h

@@ -0,0 +1,29 @@
+#ifndef _NAME_PIPE_CLIENT_H
+#define _NAME_PIPE_CLIENT_H
+
+#include<windows.h>
+#include<iostream>
+
+class NamePipeClient
+{
+public:
+    NamePipeClient()
+    {
+        pStr = "data from client";
+        pPipeName = "\\\\.\\pipe\\testPipe";
+    }
+    //打开命名管道
+    void OpenNamedPipeInClient(); 
+    //客户端从命名管道中读取数据
+    void NamedPipeReadInClient(); 
+    //客户端往命名管道中写入数据
+    void NamedPipeWriteInClient();
+
+private:
+    //用来保存在客户端通过 CreateFile 打开的命名管道句柄HANDLE            
+    HANDLE hNamedPipe;
+    const char * pStr;
+    const char * pPipeName;
+};
+
+#endif

+ 100 - 0
source/hook/common/NamePipeServer.cpp

@@ -0,0 +1,100 @@
+#include "stdafx.h"
+#include "NamePipeServer.h"
+
+using namespace std;
+void NamePipeServer::CreateNamedPipeInServer()
+{
+     HANDLE  hEvent;
+     OVERLAPPED ovlpd;
+
+     BYTE sd[SECURITY_DESCRIPTOR_MIN_LENGTH];
+     SECURITY_ATTRIBUTES sa;
+
+     sa.nLength = sizeof(SECURITY_ATTRIBUTES);
+     sa.bInheritHandle = TRUE;
+     sa.lpSecurityDescriptor = &sd;
+
+     InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
+     SetSecurityDescriptorDacl(&sd, TRUE, (PACL) 0, FALSE);
+     //创建命名管道
+     //这里创建的是双向模式且使用重叠模式(异步操作)的命名管道
+     hNamedPipe = CreateNamedPipe( _T("\\\\.\\pipe\\testspipe"), PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,0, 1, 1024, 1024, 0, &sa);
+     if( INVALID_HANDLE_VALUE == hNamedPipe )
+     {
+         cout << GetLastError() << endl;
+         hNamedPipe = NULL;
+         cout << "创建命名管道失败!!!" << endl << endl;
+         return;
+     }
+     hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+     if( !hEvent )    
+     {        
+         cout<<"创建事件失败 ..."<< endl<< endl;        
+         return;    
+     }
+     memset(&ovlpd, 0, sizeof(OVERLAPPED)); 
+     ovlpd.hEvent = hEvent;
+
+     cout << "等待客户端的连接" << endl;
+     if( !ConnectNamedPipe(hNamedPipe, &ovlpd) )
+     {
+         if( ERROR_IO_PENDING != GetLastError() )
+         {
+              CloseHandle(hNamedPipe);            
+              CloseHandle(hEvent);             
+              cout<<"等待客户端连接失败 ..."<< endl << endl;            
+              return;
+         }
+     }
+      //等待事件 hEvent 失败
+     if( WAIT_FAILED == WaitForSingleObject(hEvent, INFINITE) )    
+     {        
+         CloseHandle(hNamedPipe);        
+         CloseHandle(hEvent);         
+         cout<<"等待对象失败 ..."<<endl<<endl;        
+         return;    
+     }     
+     CloseHandle(hEvent);
+}
+
+void NamePipeServer::NamedPipeReadInServer()
+{
+       char *            pReadBuf;    
+       DWORD            dwRead;     
+       pReadBuf = new char[strlen(pStr) + 1];    
+       memset(pReadBuf, 0, strlen(pStr) + 1);     
+       //从命名管道中读取数据    
+       if( !ReadFile(hNamedPipe, pReadBuf, strlen(pStr), &dwRead, NULL) )    
+       {        
+           delete []pReadBuf;         
+           cout<<"读取数据失败 ..."<< endl<< endl;        
+           return;    
+       }    
+       cout << "读取数据成功::"<< pReadBuf << endl<< endl;
+}
+
+void NamePipeServer::NamedPipeWriteInServer()
+{
+     DWORD            dwWrite;     
+     //向命名管道中写入数据    
+     if( !WriteFile(hNamedPipe, pStr, strlen(pStr), &dwWrite, NULL) )    
+     {        
+         cout << "写入数据失败 ..." << endl<< endl;        
+         return;    
+     }    
+     cout << "写入数据成功:: "<< pStr<< endl<< endl;
+}
+
+int main()
+{
+    NamePipeServer  pipeserver;
+    //创建命名管道
+    pipeserver.CreateNamedPipeInServer();
+    //从命名管道读数据
+    pipeserver.NamedPipeReadInServer();
+    //向匿名管道中写入数据
+    pipeserver.NamedPipeWriteInServer();
+
+    system("pause");
+    return 0;
+}

+ 27 - 0
source/hook/common/NamePipeServer.h

@@ -0,0 +1,27 @@
+#ifndef NAME_PIPE_SERVER_H
+#define NAME_PIPE_SERVER_H
+
+#include<windows.h>
+#include<iostream>
+
+class NamePipeServer
+{
+public:
+    NamePipeServer()
+    {    
+        pStr = _T("data from server");
+        pPipeName = _T("\\\\.\\pipe\\testPipe");
+    }
+    //创建命名管道
+    void CreateNamedPipeInServer(); 
+    //从命名管道中读取数据
+    void NamedPipeReadInServer(); 
+    //往命名管道中写入数据
+    void NamedPipeWriteInServer();
+private:
+    HANDLE    hNamedPipe;
+    const char *pStr;
+    const char *pPipeName;
+};
+
+#endif

+ 2 - 0
source/hook/hook/hook.vcxproj

@@ -97,6 +97,7 @@
   <ItemGroup>
     <ClCompile Include="..\common\CharEncoding.cpp" />
     <ClCompile Include="..\common\CurlClient.cpp" />
+    <ClCompile Include="..\common\NamePipeClient.cpp" />
     <ClCompile Include="dllmain.cpp">
       <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
       </PrecompiledHeader>
@@ -116,6 +117,7 @@
   <ItemGroup>
     <ClInclude Include="..\common\CharEncoding.h" />
     <ClInclude Include="..\common\CurlClient.h" />
+    <ClInclude Include="..\common\NamePipeClient.h" />
     <ClInclude Include="EncodingConversion.h" />
     <ClInclude Include="stdafx.h" />
     <ClInclude Include="targetver.h" />

+ 9 - 0
source/hook/hook/hook.vcxproj.filters

@@ -16,6 +16,9 @@
     <Filter Include="curl">
       <UniqueIdentifier>{7c5b6df7-ad07-456f-89e2-6896cbaa45da}</UniqueIdentifier>
     </Filter>
+    <Filter Include="pipe">
+      <UniqueIdentifier>{3c4edf5b-e7d8-4004-be0f-e6e6985c30f8}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="dllmain.cpp">
@@ -39,6 +42,9 @@
     <ClCompile Include="..\common\CurlClient.cpp">
       <Filter>curl</Filter>
     </ClCompile>
+    <ClCompile Include="..\common\NamePipeClient.cpp">
+      <Filter>pipe</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="EncodingConversion.h">
@@ -59,6 +65,9 @@
     <ClInclude Include="..\common\CurlClient.h">
       <Filter>curl</Filter>
     </ClInclude>
+    <ClInclude Include="..\common\NamePipeClient.h">
+      <Filter>pipe</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <Text Include="ReadMe.txt" />

+ 4 - 4
source/hook/hook/stdafx.h

@@ -22,8 +22,8 @@
 //#include <ntifs.h>
 //#include <wudfwdm.h> // UNICODE_STRINGµÄÍ·Îļþ;
 
-#pragma comment(lib, "legacy_stdio_definitions.lib")
-#include <thread>
-#include <future>               // std::async, std::future
-#include <chrono>               // std::chrono::milliseconds
+//#pragma comment(lib, "legacy_stdio_definitions.lib")
+//#include <thread>
+//#include <future>               // std::async, std::future
+//#include <chrono>               // std::chrono::milliseconds