Ver código fonte

代码优化

sat23 3 anos atrás
pai
commit
60ee99c06b

+ 8 - 0
DLLInjection/RegistryInjection/InjectionDLL/InjectionDLL/InjectionDLL.vcproj

@@ -224,6 +224,10 @@
 					/>
 				</FileConfiguration>
 			</File>
+			<File
+				RelativePath=".\Utility.cpp"
+				>
+			</File>
 		</Filter>
 		<Filter
 			Name="Í·Îļþ"
@@ -242,6 +246,10 @@
 				RelativePath=".\targetver.h"
 				>
 			</File>
+			<File
+				RelativePath=".\Utility.h"
+				>
+			</File>
 		</Filter>
 		<Filter
 			Name="×ÊÔ´Îļþ"

+ 6 - 4
DLLInjection/RegistryInjection/InjectionDLL/InjectionDLL/PipeClient.cpp

@@ -15,7 +15,9 @@ CPipeClient::CPipeClient(LPCTSTR lpPipeName, DWORD dwMode)
 
 CPipeClient::~CPipeClient(void)
 {
-
+    StopWork();
+    if ( m_hPipeInst != INVALID_HANDLE_VALUE )
+        CloseHandle(m_hPipeInst);
 }
 
 BOOL CPipeClient::StartWork()
@@ -51,16 +53,16 @@ DWORD CPipeClient::ConnectThread(LPVOID lpParam)
     {
         if ( pInstance->m_hPipeInst != INVALID_HANDLE_VALUE ) {
             // 1分钟检测;
-            Sleep(600000);
+            Sleep(60000);
             OutputDebugString(_T("<Injecter> m_hPipeInst 已存在\n"));
             continue;
         }
 
         // 等待10秒;
-        if ( !WaitNamedPipe(pInstance->m_szPipeName, 100000) )
+        if ( !WaitNamedPipe(pInstance->m_szPipeName, 10000) )
         {// 如果管道不存在,会立即返回而不考虑超时值,所以此处仍要Sleep;
             OutputDebugString(_T("<Injecter> WaitNamedPipe 失败\n"));
-            Sleep(100000);
+            Sleep(10000);
             continue;
         }
 

+ 50 - 0
DLLInjection/RegistryInjection/InjectionDLL/InjectionDLL/Utility.cpp

@@ -0,0 +1,50 @@
+#include "StdAfx.h"
+#include "Utility.h"
+
+namespace Utility
+{
+    // 当前DLL模块句柄;
+    HMODULE g_hDLLModule = NULL;
+    // 当前DLL内部工作者线程句柄;
+    HANDLE hWorkThreadProc = NULL;
+    // 当前DLL所在路径;
+    TCHAR g_szCurModulePath[MAX_PATH] = {0};
+    // 管道实例;
+    CPipeClient *g_pPipeClient = NULL;
+
+    // 配置文件名称;
+    TCHAR g_szConfigFile[MAX_PATH] = {0};
+    // 配置文件内容;
+    CFG_CTX g_cfgCtx;
+
+    //////////////////////////////////////////////////////////////////////////
+    // 全局函数;
+    // 获取配置文件内容;
+    void GetConfigContent()
+    {
+        // 获取dll的目录;
+        TCHAR szDrive[MAX_PATH] = { 0 };
+        TCHAR szDir[MAX_PATH] = { 0 };
+        TCHAR szExt[MAX_PATH] = { 0 };
+        TCHAR szFna[MAX_PATH] = { 0 };
+        ::GetModuleFileName(g_hDLLModule, g_szCurModulePath, sizeof(g_szCurModulePath) / sizeof(TCHAR));
+        _tsplitpath_s(g_szCurModulePath, szDrive, szDir, szFna, szExt);
+        _tcscpy_s(g_szCurModulePath, szDrive);
+        _tcscat_s(g_szCurModulePath, szDir);
+        // 设置配置文件;
+        _stprintf_s(g_szConfigFile, _T("%s%s"), g_szCurModulePath, _T("Assist.ini"));
+
+        // 读取配置文件;
+        TCHAR szValue[MAX_PATH] = {0};
+        GetPrivateProfileString(_T("Windows"), _T("Title"), _T(""), g_cfgCtx.szWindowTitel, MAX_PATH, g_szConfigFile);
+        GetPrivateProfileString(_T("Pipe"), _T("Name"), _T("Assist"), szValue, MAX_PATH, g_szConfigFile);
+        _stprintf_s(g_cfgCtx.szPipeName, _T("\\\\.\\pipe\\%s"), szValue);
+        GetPrivateProfileString(_T("Process"), _T("Name"), _T("Game.exe"), g_cfgCtx.szWndProcessName, MAX_PATH, g_szConfigFile);
+    }
+
+    void FreeLibraryAndExit()
+    {
+        if ( g_hDLLModule )
+            FreeLibraryAndExitThread(g_hDLLModule, 0);
+    }
+};

+ 45 - 0
DLLInjection/RegistryInjection/InjectionDLL/InjectionDLL/Utility.h

@@ -0,0 +1,45 @@
+#pragma once
+
+#include "PipeClient.h"
+
+namespace Utility
+{
+    // 当前DLL模块句柄;
+    extern HMODULE g_hDLLModule;
+    // 当前DLL内部工作者线程句柄;
+    extern HANDLE hWorkThreadProc;
+    // 当前DLL所在路径;
+    extern TCHAR g_szCurModulePath[MAX_PATH];
+    // 管道实例;
+    extern CPipeClient *g_pPipeClient;
+
+    // 配置文件名称;
+    extern TCHAR g_szConfigFile[MAX_PATH];
+    // 配置文件内容;
+    typedef struct __CFG_CONTENT__
+    {
+        // 窗口标题;
+        TCHAR szWindowTitel[MAX_PATH];
+        // 窗口进程名称(防止名称一样);
+        TCHAR szWndProcessName[MAX_PATH];
+        // 管道名称;
+        TCHAR szPipeName[MAX_PATH];
+
+        __CFG_CONTENT__()
+        {
+            memset(szWindowTitel, 0, MAX_PATH*sizeof(TCHAR));
+            memset(szWndProcessName, 0, MAX_PATH*sizeof(TCHAR));
+            memset(szPipeName, 0, MAX_PATH*sizeof(TCHAR));
+        }
+    }CFG_CTX, *pCFG_CTX;
+    // 配置文件内容;
+    extern CFG_CTX g_cfgCtx;
+
+
+    //////////////////////////////////////////////////////////////////////////
+    // 全局函数;
+    // 获取配置文件内容;
+    void GetConfigContent();
+    // 卸载DLL;
+    void FreeLibraryAndExit();
+};

+ 11 - 52
DLLInjection/RegistryInjection/InjectionDLL/InjectionDLL/dllmain.cpp

@@ -1,28 +1,7 @@
 // dllmain.cpp : 定义 DLL 应用程序的入口点。
 #include "stdafx.h"
 #include "PipeClient.h"
-
-HMODULE g_hModule = NULL;
-HANDLE hThreadProc = NULL;
-TCHAR g_szCurModulePath[MAX_PATH] = {0};
-TCHAR g_szFna[MAX_PATH] = {0};
-HANDLE g_hPipe = NULL;
-// 配置文件名称;
-TCHAR g_szConfigFile[MAX_PATH] = {0};
-// 配置的窗口名称;
-TCHAR g_szWindowTitle[MAX_PATH] = {0};
-// 配置的窗口进程名称;
-TCHAR g_szProcessName[MAX_PATH] = {0};
-// 管道名称;
-TCHAR g_szPipeName[MAX_PATH] = {0};
-// 管道实例;
-CPipeClient *g_pPipeClient = NULL;
-
-typedef struct PIPE_MSG
-{
-	//消息类型;
-	//消息内容;
-};
+#include "Utility.h"
 
 // 枚举屏幕上的所有顶级窗口
 BOOL CALLBACK EnumWndProc(HWND hwnd, LPARAM lParam)
@@ -88,7 +67,7 @@ DWORD WINAPI WorkThreadProc(LPVOID lParam)
 	if ( hWnd == NULL )
 	{
 		OutputDebugString(_T("<Injecter> 没有找到窗口句柄"));
-		FreeLibraryAndExitThread(g_hModule, 0);
+		FreeLibraryAndExitThread(Utility::g_hDLLModule, 0);
 		return 0;
 	}
 
@@ -101,24 +80,22 @@ DWORD WINAPI WorkThreadProc(LPVOID lParam)
 #endif
 	OutputDebugString(szLog);
 	//是否名称是计算器
-	if( _tcsstr(szWndTitle, g_szWindowTitle) )
+    if( _tcsstr(szWndTitle, Utility::g_cfgCtx.szWindowTitel) )
 	{
 		OutputDebugString(_T("<Injecter> 找到指定窗口!!!"));
 		// 2、创建后台线程;
-		MessageBox(NULL, szWndTitle, g_szWindowTitle, MB_OK);
-#if 1
-        if ( g_pPipeClient == NULL )
+		MessageBox(NULL, szWndTitle, Utility::g_cfgCtx.szWindowTitel, MB_OK);
+        if ( Utility::g_pPipeClient == NULL )
         {
-            g_pPipeClient = new CPipeClient(g_szPipeName);
-            g_pPipeClient->StartWork();
+            Utility::g_pPipeClient = new CPipeClient(Utility::g_cfgCtx.szPipeName);
+            Utility::g_pPipeClient->StartWork();
         }
-#endif
 	}
 	else
 	{
 		OutputDebugString(_T("<Injecter> 不满足条件,DLL自我卸载!!!"));
 		// 如果不满足条件,DLL自我卸载;
-		FreeLibraryAndExitThread(g_hModule, 0);
+		Utility::FreeLibraryAndExit();
 	}
 
 	return 0;
@@ -127,32 +104,14 @@ DWORD WINAPI WorkThreadProc(LPVOID lParam)
 
 BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
 {
-	g_hModule = hModule;
-#if 1
-	// 获取dll的目录;
-	TCHAR szDrive[MAX_PATH] = { 0 };
-	TCHAR szDir[MAX_PATH] = { 0 };
-	TCHAR szExt[MAX_PATH] = { 0 };
-	::GetModuleFileName(g_hModule, g_szCurModulePath, sizeof(g_szCurModulePath) / sizeof(TCHAR));
-	_tsplitpath_s(g_szCurModulePath, szDrive, szDir, g_szFna, szExt);
-	_tcscpy_s(g_szCurModulePath, szDrive);
-	_tcscat_s(g_szCurModulePath, szDir);
-	// 设置配置文件;
-	_stprintf_s(g_szConfigFile, _T("%s%s"), g_szCurModulePath, _T("Assist.ini"));
-
-	// 读取配置文件;
-	TCHAR szValue[MAX_PATH] = {0};
-	GetPrivateProfileString(_T("Windows"), _T("Title"), _T(""), g_szWindowTitle, MAX_PATH, g_szConfigFile);
-	GetPrivateProfileString(_T("Pipe"), _T("Name"), _T("Assist"), szValue, MAX_PATH, g_szConfigFile);
-	_stprintf_s(g_szPipeName, _T("\\\\.\\pipe\\%s"), szValue);
-	GetPrivateProfileString(_T("Process"), _T("Name"), _T("Game.exe"), g_szProcessName, MAX_PATH, g_szConfigFile);
-#endif
+    Utility::g_hDLLModule = hModule;
+    Utility::GetConfigContent();
 
 	switch (ul_reason_for_call)
 	{
 	case DLL_PROCESS_ATTACH:
 		{
-			hThreadProc = CreateThread(NULL, 0, WorkThreadProc, NULL, 0, NULL);
+			HANDLE hThreadProc = CreateThread(NULL, 0, WorkThreadProc, NULL, 0, NULL);
 			CloseHandle(hThreadProc);
 		}
 		break;