Bladeren bron

Assist中删除无用的代码。同时,ReadFile线程中,按使用场情分代码段处理。

Jeff 3 jaren geleden
bovenliggende
commit
a384d0c79e

+ 60 - 68
Source/OGCAssist/OGCAssist/OGCAssist.cpp

@@ -37,7 +37,11 @@ namespace Assist
 	DWORD dwESI = 0;
 	DWORD dwEDI = 0;
 
+	void InitCallData();
+	BOOL HijackedAllCall();
+	BOOL RestoreAllCall();
 	BOOL HijackedCall(CALLDATA *pCallData);
+	BOOL RecoveryCall(CALLDATA *pCallData);
 	// 自定义跳转函数;
 	void Call_MyDisconnect();
 	void Call_MyConnect();
@@ -51,7 +55,6 @@ namespace Assist
 	void Call_MyGoSetCommunicationError();
 	void Call_MyExternalException();
 
-
 	void InitCallData()
 	{
 #pragma region 启动时Initial Communication:需要程序启动时注入;
@@ -229,9 +232,38 @@ end:
 		return bHijack;
 	}
 
-	void RestoreAllCall()
+	BOOL RestoreAllCall()
 	{
+		BOOL bRestor = FALSE;
+		if ( !(bRestor = RecoveryCall(&_cd_Connect)) )
+			goto end;
+
+		if ( !(bRestor = RecoveryCall(&_cd_Disconnect)) )
+			goto end;
+
+		if ( !(bRestor = RecoveryCall(&_cd_Go)) )
+			goto end;
+
+		if ( !(bRestor = RecoveryCall(&_cd_Go_SN)) )
+			goto end;
+
+		if ( !(bRestor = RecoveryCall(&_cd_Go_CommunicationError)) )
+			goto end;
+
+		if ( !(bRestor = RecoveryCall(&_cd_Go_SetCommunicationError)) )
+			goto end;
+
+		if ( !(bRestor = RecoveryCall(&_cd_ExternalException)) )
+			goto end;
+
+		if ( !(bRestor = RecoveryCall(&_cd_CheckFW)) )
+			goto end;
+
+		if ( !(bRestor = RecoveryCall(&_cd_CheckFW_CommunicationError)) )
+			goto end;
 
+end:
+		return bRestor;
 	}
 
 	// 劫持原始地址;
@@ -249,39 +281,14 @@ end:
 		memset(pCallData->szOriginalAddrData, 0, CALL_LEN);
 		if ( !ReadProcessMemory(hProc, (LPVOID)pCallData->dwOriginalAddr, pCallData->szOriginalAddrData, CALL_LEN, NULL) )
 		{
-			MessageBox(NULL, _T("读取内存失败"), _T("提示"),MB_OK);
+			//MessageBox(NULL, _T("读取内存失败"), _T("提示"),MB_OK);
 			return FALSE;
 		}
 
 		// 将我们的Call地址指令写入目标地址;
 		if ( !WriteProcessMemory(hProc, (LPVOID)pCallData->dwOriginalAddr, pCallData->szMyCallData, CALL_LEN, NULL) )
 		{
-			MessageBox(NULL, _T("写入内存失败"), _T("提示"),MB_OK);
-			return FALSE;
-		}
-
-		return TRUE;
-	}
-
-	// 劫持原始地址;
-	BOOL HijackedCall(LPVOID MyCall, LPVOID OriginalCall, BYTE (&szOriginalCallData)[CALL_LEN])
-	{
-		BYTE szMyCallData[CALL_LEN] = {0};
-		szMyCallData[0] = 0xE9; // 汇编硬编码:jmp [4字节地址];
-		*(LPDWORD)(&szMyCallData[1]) = (DWORD)MyCall - (DWORD)OriginalCall - CALL_LEN;
-
-		HANDLE hProc = GetCurrentProcess();
-		// 将要劫持的地址指令备份下来;
-		if ( !ReadProcessMemory(hProc, OriginalCall, szOriginalCallData, CALL_LEN, NULL) )
-		{
-			MessageBox(NULL, _T("读取内存失败"), _T("提示"),MB_OK);
-			return FALSE;
-		}
-
-		// 将我们的Call地址指令写入目标地址;
-		if ( !WriteProcessMemory(hProc, OriginalCall, szMyCallData, CALL_LEN, NULL) )
-		{
-			MessageBox(NULL, _T("写入内存失败"), _T("提示"),MB_OK);
+			//MessageBox(NULL, _T("写入内存失败"), _T("提示"),MB_OK);
 			return FALSE;
 		}
 
@@ -296,16 +303,22 @@ end:
 		// 将我们的Call地址指令写入目标地址;
 		if ( !WriteProcessMemory(GetCurrentProcess(), (LPVOID)pCallData->dwOriginalAddr, pCallData->szOriginalAddrData, CALL_LEN, NULL) )
 		{
-			MessageBox(NULL, _T("写入内存失败"), _T("提示"),MB_OK);
+			//MessageBox(NULL, _T("写入内存失败"), _T("提示"),MB_OK);
 			return FALSE;
 		}
 
 		return TRUE;
 	}
 
+};
+
+// MyCall处理;
+namespace Assist
+{
 	void MyInitialFailed()
 	{
-		MessageBox(NULL, _T("MyInitialFailed"), _T("MyInitialFailed"), MB_OK);
+		//MessageBox(NULL, _T("MyInitialFailed"), _T("MyInitialFailed"), MB_OK);
+		// 向服务端发送消息;
 	}
 
 	void __declspec(naked) Call_MyInitial_Failed()
@@ -320,33 +333,7 @@ end:
 
 	void __declspec(naked) Call_MySaveAsOutputData()
 	{
-		//004AB3FC
-		__asm {
-			// 保存寄存器;
-			mov dwEAX, EAX;
-			mov dwEBX, EBX;
-			mov dwECX, ECX;
-			mov dwEDX, EDX;
-			mov dwEBP, EBP;
-			mov dwESP, ESP;
-			mov dwESI, ESI;
-			mov dwEDI, EDI;
-			// my call
-			mov eax,0x004AB3FC
-				mov dl,1
-				call dword ptr[eax]
-			// 恢复寄存器; 
-			mov EAX, dwEAX;
-			mov EBX, dwEBX;
-			mov ECX, dwECX;
-			mov EDX, dwEDX;
-			mov EBP, dwEBP;
-			mov ESP, dwESP;
-			mov ESI, dwESI;
-			mov EDI, dwEDI;
-			// 返回
-			ret
-		}
+
 	}
 
 	void MyGo()
@@ -356,6 +343,7 @@ end:
 		DWORD dwSNAddr = dwEBP - 0x5D0;
 		sprintf_s(szMsg, "MyGo耗时:%ldms, SN:%08X, %s", *(LPDWORD)dwElapsedAddr, dwSNAddr, (CHAR*)(*(LPDWORD)dwSNAddr));
 		MessageBoxA(NULL, szMsg, "MyGo", MB_OK);
+		// 向服务器发送消息;
 	}
 
 	void __declspec(naked) Call_MyGo()
@@ -386,9 +374,9 @@ end:
 			mov ESI, dwESI;
 			mov EDI, dwEDI;
 			// 执行原Call;
-			call _cd_Go.dwOriginalCallAddr
-				// 返回劫持地址下一行;
-				jmp _cd_Go.dwBack2Addr
+			call _cd_Go.dwOriginalCallAddr;
+			// 返回劫持地址下一行;
+			jmp _cd_Go.dwBack2Addr
 		}
 	}
 
@@ -399,6 +387,7 @@ end:
 		//_stprintf_s(szMsg, _T("MyGo %08X, %08X, %08X, %s"), dwEAX, dwSNAddr, DWORD(*(LPDWORD)dwSNAddr), (TCHAR*)(*(LPDWORD)dwSNAddr));
 		sprintf_s(szMsg, "MyGo %08X, %08X, %08X, %s", dwEAX, dwSNAddr, DWORD(*(LPDWORD)dwSNAddr), (CHAR*)(*(LPDWORD)dwSNAddr));
 		MessageBoxA(NULL, szMsg, "MyGoSN", MB_OK);
+		// 向服务器发送消息;
 	}
 
 	void __declspec(naked) Call_MyGoSN()
@@ -429,15 +418,16 @@ end:
 			mov ESI, dwESI;
 			mov EDI, dwEDI;
 			// 执行原Call;
-			call _cd_Go_SN.dwOriginalCallAddr
-				// 返回劫持地址下一行;
-				jmp _cd_Go_SN.dwBack2Addr
+			call _cd_Go_SN.dwOriginalCallAddr;
+			// 返回劫持地址下一行;
+			jmp _cd_Go_SN.dwBack2Addr
 		}
 	}
 
 	void MyGoSetCommunicationError()
 	{
 		MessageBox(NULL, _T("MyGoSetCommunicationError"), _T("劫持"), MB_OK);
+		// 向服务器发送消息;
 	}
 
 	void __declspec(naked) Call_MyGoSetCommunicationError()
@@ -477,6 +467,7 @@ end:
 	void MyGoCommunicationError()
 	{
 		MessageBox(NULL, _T("MyGoCommunicationError"), _T("劫持"), MB_OK);
+		// 向服务器发送消息;
 	}
 
 	void __declspec(naked) Call_MyGoCommunicationError()
@@ -526,6 +517,9 @@ end:
 		{
 			MessageBox(NULL, _T("连接成功"), _T("连接提示"), MB_OK);
 		}
+
+		// 向服务器发送消息;
+
 		return TRUE;
 	}
 
@@ -559,6 +553,7 @@ end:
 	void MyExternalException()
 	{
 		MessageBox(NULL, _T("MyExternalExceptionE06D7363,重启异常待重启"), _T("提示"), MB_OK);
+		// 向服务器发送消息;
 		::exit(0);
 	}
 
@@ -584,6 +579,7 @@ end:
 	void MyDisconnect()
 	{
 		MessageBox(NULL, _T("MyDisconnect Function"), _T("MyDisconnect"), MB_OK);
+		// 向服务器发送消息;
 	}
 
 	void __declspec(naked) Call_MyDisconnect()
@@ -622,10 +618,8 @@ end:
 		// 备份寄存器;
 		__asm pushad;
 
-
 		MessageBox(NULL, _T("Call_MyCheckFWCommunicationError"), _T("MyCheckFWCommunicationError"), MB_OK);
 
-
 		__asm{
 			// 恢复寄存器; 
 			popad;
@@ -651,10 +645,8 @@ end:
 			mov dwEDI, EDI;
 		}
 
-
 		MessageBox(NULL, _T("MyGo Function"), _T("MyGo"), MB_OK);
 
-
 		__asm{
 			// 恢复寄存器; 
 			mov EAX, dwEAX;

+ 1 - 1
Source/OGCAssist/OGCAssist/OGCAssist.h

@@ -32,5 +32,5 @@ namespace Assist
 	// ½Ù³ÖËùÓÐCall Data;
 	BOOL HijackedAllCall();
 	// »Ö¸´ËùÓÐCall Data;
-	void RestoreAllCall();
+	BOOL RestoreAllCall();
 };

+ 72 - 42
Source/OGCAssist/OGCAssist/PipeClient.cpp

@@ -7,12 +7,10 @@ PER_IO_CONTEXT CPipeClient::m_IoWrite;
 
 CPipeClient::CPipeClient(LPCTSTR lpPipeName, DWORD dwMode)
 {
-    m_hReadInst = INVALID_HANDLE_VALUE;
+    m_hPipeInst = INVALID_HANDLE_VALUE;
     m_bClientStop = FALSE;
     m_dwMode = dwMode;
     memset(m_szPipeName, 0, MAX_PATH*sizeof(TCHAR));
-    memset(m_szWriteBuff, 0, 1024*sizeof(TCHAR));
-    memset(m_szReceiveBuff, 0, 1024*sizeof(TCHAR));
     if ( lpPipeName )
         _stprintf_s(m_szPipeName, _T("%s"), lpPipeName);
 }
@@ -20,8 +18,8 @@ CPipeClient::CPipeClient(LPCTSTR lpPipeName, DWORD dwMode)
 CPipeClient::~CPipeClient(void)
 {
     StopWork();
-    if ( m_hReadInst != INVALID_HANDLE_VALUE )
-        CloseHandle(m_hReadInst);
+    if ( m_hPipeInst != INVALID_HANDLE_VALUE )
+        CloseHandle(m_hPipeInst);
 }
 
 BOOL CPipeClient::StartWork()
@@ -32,7 +30,7 @@ BOOL CPipeClient::StartWork()
         HANDLE hConnect = CreateThread(NULL, 0, ConnectThread, this, 0, NULL);
         HANDLE hReadMsg = CreateThread(NULL, 0, ReadMsgThread, this, 0, NULL);
 
-        if ( hConnect == NULL /*|| hReadMsg == NULL */)
+        if ( hConnect == NULL || hReadMsg == NULL )
             bRet = FALSE;
 
         if ( hConnect )
@@ -55,10 +53,10 @@ DWORD CPipeClient::ConnectThread(LPVOID lpParam)
 
     while(!pInstance->m_bClientStop)
     {
-        if ( pInstance->m_hReadInst != INVALID_HANDLE_VALUE ) {
+        if ( pInstance->m_hPipeInst != INVALID_HANDLE_VALUE ) {
             // 1分钟检测;
             Sleep(60000);
-            Utility::dprintf(_T("m_hReadInst 已存在\n"));
+            Utility::dprintf(_T("m_hPipeInst 已存在\n"));
             continue;
         }
 
@@ -70,7 +68,7 @@ DWORD CPipeClient::ConnectThread(LPVOID lpParam)
             continue;
         }
 
-        pInstance->m_hReadInst = CreateFile(
+        pInstance->m_hPipeInst = CreateFile(
             pInstance->m_szPipeName,        // pipe name 
             GENERIC_READ | GENERIC_WRITE,   // read and write access 
             0,                              // no sharing 
@@ -80,18 +78,19 @@ DWORD CPipeClient::ConnectThread(LPVOID lpParam)
             NULL);                          // no template file 
 
         // 创建成功,退出;
-        if ( pInstance->m_hReadInst != INVALID_HANDLE_VALUE ) 
+        if ( pInstance->m_hPipeInst != INVALID_HANDLE_VALUE ) 
         {
             // 管道连接成功,修改管道通信模式:message-read mode. 
             BOOL fSuccess = SetNamedPipeHandleState( 
-                pInstance->m_hReadInst,     // pipe handle 
+                pInstance->m_hPipeInst,     // pipe handle 
                 &pInstance->m_dwMode,       // new pipe mode 
                 NULL,                       // don't set maximum bytes 
                 NULL);                      // don't set maximum time 
 
             if (!fSuccess) {
                 Utility::dprintf(_T("SetNamedPipeHandleState failed. GLE=%d\n"), GetLastError() ); 
-                CloseHandle(pInstance->m_hReadInst);
+                CloseHandle(pInstance->m_hPipeInst);
+                pInstance->m_hPipeInst = INVALID_HANDLE_VALUE;
             }
         }
         else
@@ -124,41 +123,73 @@ DWORD CPipeClient::ReadMsgThread(LPVOID lpParam)
 	int i = 0;
     while(!pInstance->m_bClientStop)
     {
-        if ( pInstance->m_hReadInst == INVALID_HANDLE_VALUE ) {
-            Sleep(2000);
+        if ( pInstance->m_hPipeInst == INVALID_HANDLE_VALUE ) {
+            Sleep(5000);
             continue;
         }
 
-        //do 
-        { 
-            bSuccess = ReadFile( 
-                pInstance->m_hReadInst,						// pipe handle 
-                m_IoRead.szBuffer,				// buffer to receive reply 
-                BUFSIZE,									// size of buffer 
-                &m_IoRead.dwBufferSize,			// number of bytes read 
-                (OVERLAPPED*)&pInstance->m_IoRead);			// not overlapped 
+#if 0 // 分配足够大的缓冲,保证C/S两端通信内容不超过该大小;
+        bSuccess = ReadFile(pInstance->m_hPipeInst, m_IoRead.szBuffer, BUFSIZE, &m_IoRead.dwBufferSize,	(OVERLAPPED*)&pInstance->m_IoRead);
+        if ( !bSuccess )
+        {
+            // 打印结果;
+            Utility::dprintf(_T("读取数据:Error=%ld, Len=%ld, Data=%s\n"), dwError, m_IoRead.m_Overlapped.InternalHigh, m_IoRead.szBuffer);
+            // 处理结果;
+        } 
+        else
+        {          
+            // 等待完成;
+            if ( !WaitFinish(pInstance->m_hPipeInst, &m_IoRead) )
+            {
+                // 出现错误;
+                Utility::dprintf("CloseHandle\n");
+                CloseHandle(pInstance->m_hPipeInst);
+                pInstance->m_hPipeInst = INVALID_HANDLE_VALUE;
+            }
+            else
+            {
+                // 打印结果;
+                Utility::dprintf(_T("读取数据:Error=%ld, Len=%ld, Data=%s\n"), dwError, m_IoRead.m_Overlapped.InternalHigh, m_IoRead.szBuffer);
+                // 处理结果;
+            }
+        }
 
+        // 重置Buffer;
+        memset(m_IoRead.szBuffer, 0, BUFSIZE);
+#else // 分配的缓冲区,不足以一次性存储C/S两端的通信内容时;
+        do 
+        { 
+            bSuccess = ReadFile(pInstance->m_hPipeInst, m_IoRead.szBuffer, BUFSIZE, &m_IoRead.dwBufferSize, (OVERLAPPED*)&pInstance->m_IoRead);
+            if ( bSuccess )
+            {
+                // 打印结果;
+                Utility::dprintf(_T("读取数据:Error=%ld, Len=%ld, Data=%s\n"), dwError, m_IoRead.m_Overlapped.InternalHigh, m_IoRead.szBuffer);
+                // 处理结果;
+            }
+            else
+            {
+                dwError = GetLastError();
+                if ( )
+            }
+            // 由于缓冲区不够大,没能一次性读取完;
+            if ( !bSuccess && )
+            if ( !bSuccess && (dwError = GetLastError()) != ERROR_MORE_DATA )
 
 			dwError = GetLastError();
 			//if ( !bSuccess && (dwError = GetLastError()) != ERROR_MORE_DATA )
 			//	break; 
 
-			if ( WaitFinish(pInstance->m_hReadInst, &m_IoRead) )
+			if ( WaitFinish(pInstance->m_hPipeInst, &m_IoRead) )
 			{
 
 			}
             
             Utility::dprintf(_T("读取数据:Error=%ld, Len=%ld, Data=%s\n"), dwError, m_IoRead.m_Overlapped.InternalHigh, m_IoRead.szBuffer);
             //Utility::dprintf(_T("读取数据:%ld, %ld"), dwError, cbRead);
-#if 0
-            TCHAR szMsg[8912] = {0};
-            _stprintf_s(szMsg, _T("读取数据:%d, %ld, %ld, %s\n"), (int)bSuccess, dwError, cbRead, chBuf);
-            OutputDebugString(szMsg);
-#endif
             // 追回数据;
             memcpy(pInstance->m_szReceiveBuff + dwDataIndex, chBuf, cbRead);
             dwDataIndex += cbRead;
-        } //while ( !bSuccess );  // repeat loop if ERROR_MORE_DATA 
+        } while ( !bSuccess );  // repeat loop if ERROR_MORE_DATA 
 
         // 清空缓存数据;
         dwDataIndex = 0;
@@ -180,16 +211,13 @@ DWORD CPipeClient::ReadMsgThread(LPVOID lpParam)
             if ( dwError == ERROR_PIPE_NOT_CONNECTED || dwError == ERROR_BROKEN_PIPE)
             {
 				Utility::dprintf("CloseHandle\n");
-                CloseHandle(pInstance->m_hReadInst);
-                pInstance->m_hReadInst = INVALID_HANDLE_VALUE;
+                CloseHandle(pInstance->m_hPipeInst);
+                pInstance->m_hPipeInst = INVALID_HANDLE_VALUE;
             }
-
-#ifdef _DEBUG
-            //Sleep(10000);
-#endif
         }
 
-         memset(pInstance->m_szReceiveBuff, 0, BUFSIZE*sizeof(TCHAR));
+        memset(pInstance->m_szReceiveBuff, 0, BUFSIZE*sizeof(TCHAR));
+#endif
     }
 
     Utility::dprintf(_T("<%ld> ReadMsgThread 退出\n"),Utility::g_WndInfo.dwProcessId);
@@ -207,6 +235,8 @@ BOOL CPipeClient::WaitFinish(HANDLE hPipe, PER_IO_CONTEXT *pIoContext)
 	case ERROR_IO_PENDING:
 		bPendingIO = true;
 		break;
+    case ERROR_MORE_DATA:
+        break;
 		// 已经连接;
 	case ERROR_PIPE_CONNECTED:
 		SetEvent(pIoContext->m_Overlapped.hEvent);
@@ -227,7 +257,7 @@ BOOL CPipeClient::WaitFinish(HANDLE hPipe, PER_IO_CONTEXT *pIoContext)
 			if( GetOverlappedResult(hPipe, &pIoContext->m_Overlapped, &dwTransBytes, TRUE) == FALSE)
 			{
 				printf("ConnectNamedPipe  failed   %d\n",GetLastError());
-				return -1;
+				return FALSE;
 			}
 		}
 		break;
@@ -236,7 +266,7 @@ BOOL CPipeClient::WaitFinish(HANDLE hPipe, PER_IO_CONTEXT *pIoContext)
 		break;
 	}
 
-	return 0;
+	return TRUE;
 #else
 	DWORD dwError=::GetLastError();
 	DWORD dwWait = -1;
@@ -266,7 +296,7 @@ BOOL CPipeClient::WaitFinish(HANDLE hPipe, PER_IO_CONTEXT *pIoContext)
 BOOL CPipeClient::SendMessage(PACKAGE &pak)
 {
 	// 是否连接了服务端;
-	if ( m_hReadInst == INVALID_HANDLE_VALUE ) 
+	if ( m_hPipeInst == INVALID_HANDLE_VALUE ) 
 		return FALSE;
 
 	// 是否初始化了句柄;
@@ -276,15 +306,15 @@ BOOL CPipeClient::SendMessage(PACKAGE &pak)
 
 BOOL CPipeClient::SendData(const TCHAR *lpszMsg, DWORD dwDataLen)
 {
-	if ( m_hReadInst == INVALID_HANDLE_VALUE ) 
+	if ( m_hPipeInst == INVALID_HANDLE_VALUE ) 
 		return FALSE;
 
 	static int i = 0;
 	DWORD dwNumberOfBytesWritten = 0;
 	char szMsg[255] = {0};//"你好----001";
 	sprintf(szMsg, "发送内容:%d,%d", ::GetCurrentProcessId(), i++);
-	BOOL fWrite = WriteFile(m_hReadInst,szMsg,strlen(szMsg),&dwNumberOfBytesWritten, NULL);//;&m_IoWrite.m_Overlapped);
-	//WaitFinish(m_hReadInst, &m_IoWrite);
+	BOOL fWrite = WriteFile(m_hPipeInst,szMsg,strlen(szMsg),&dwNumberOfBytesWritten, NULL);//;&m_IoWrite.m_Overlapped);
+	//WaitFinish(m_hPipeInst, &m_IoWrite);
 	if ( fWrite )
 	{
 		Utility::dprintf(_T("SendData:%s\n"),lpszMsg);

+ 2 - 7
Source/OGCAssist/OGCAssist/PipeClient.h

@@ -34,19 +34,14 @@ public:
     ~CPipeClient(void);
 
 private:
-	// ReadFile管道句柄;
-    HANDLE m_hReadInst;
-	// WriteFIle管道句柄;
-	HANDLE m_hWriteInst;
+	// 管道句柄;
+    HANDLE m_hPipeInst;
     // 客户端状态;
     BOOL m_bClientStop;
     // 管道名称;
     TCHAR m_szPipeName[MAX_PATH];
     // 管道通信模式;
     DWORD m_dwMode;
-    // 缓存区;
-    TCHAR m_szWriteBuff[BUFSIZE];
-    TCHAR m_szReceiveBuff[BUFSIZE];
 
 	static PER_IO_CONTEXT m_IoRead;
 	static PER_IO_CONTEXT m_IoWrite;