Bläddra i källkod

完成窗口查找函数。

sat23 3 år sedan
förälder
incheckning
a98a8725e7

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

@@ -61,6 +61,7 @@
 			<Tool
 				Name="VCLinkerTool"
 				LinkIncremental="2"
+				UACExecutionLevel="2"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				TargetMachine="1"
@@ -133,6 +134,7 @@
 			<Tool
 				Name="VCLinkerTool"
 				LinkIncremental="1"
+				UACExecutionLevel="2"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				OptimizeReferences="2"

+ 79 - 17
DLLInjection/RegistryInjection/InjectionDLL/InjectionDLL/dllmain.cpp

@@ -3,39 +3,101 @@
 
 
 HMODULE g_hModule = NULL;
-DWORD WINAPI ThreadProc(LPVOID lParam)
+HANDLE hThreadProc = NULL;
+
+// 枚举屏幕上的所有顶级窗口
+BOOL CALLBACK EnumWndProc(HWND hwnd, LPARAM lParam)
+{
+    DWORD dwCurrentProcessId = *((DWORD*)lParam);
+    // 根据进程ID、窗口,获取当前窗口所在线程ID;
+    DWORD dwThreadProcessId = GetWindowThreadProcessId(hwnd, &dwCurrentProcessId);
+    if ( dwCurrentProcessId == dwThreadProcessId && GetParent(hwnd) == NULL )   // GetParent==Null表示主窗口,本来就是找顶级的,有点多余?;
+    {
+        *((HWND*)lParam) = hwnd;
+        // 回调函数调用SetLastError以获取有意义的错误代码,以返回给EnumWindows的调用方
+        SetLastError(10086);
+        // 停止枚举,返回FALSE;
+        return FALSE;
+    }
+
+    // 继续枚举,返回TRUE;
+    return TRUE;
+}
+
+
+HWND GetMainWnd()
+{
+    // 获取当前DLL所在进程ID;
+    DWORD dwCurrentProcessId = GetCurrentProcessId();
+    // 枚举该进程窗口;
+    EnumWindows(EnumWndProc, (LPARAM)&dwCurrentProcessId);
+    if (GetLastError() == 10086)
+    {
+        // 找到窗口句柄;
+        return (HWND)dwCurrentProcessId;
+    }
+
+    return NULL;
+}
+
+DWORD WINAPI WorkThreadProc(LPVOID lParam)
 {
     // 工作线程;
+    TCHAR szWndTitle[MAXBYTE] = {0};
+    // 获取DLL所在窗口句柄;
+    HWND hWnd = GetMainWnd();
+    // 得到窗口名称
+    GetWindowText(hWnd,szWndTitle,sizeof(szWndTitle));
+    //是否名称是计算器
+    if( 0 == _tcscmp(szWndTitle, _T("计算器")) )
+    {
+        OutputDebugString(_T("<Injecter> 找到指定窗口!!!"));
+        // 2、创建后台线程;
+    }
+    else
+    {
+        OutputDebugString(_T("<Injecter> 如果不满足条件,DLL自我卸载!!!"));
+        // 如果不满足条件,DLL自我卸载;
+        FreeLibraryAndExitThread(g_hModule, 0);
+    }
 
     return 0;
 }
 
-BOOL APIENTRY DllMain( HMODULE hModule,
-                       DWORD  ul_reason_for_call,
-                       LPVOID lpReserved
-					 )
+
+BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
 {
     g_hModule = hModule;
-    HANDLE hThreadProc = NULL;
 	switch (ul_reason_for_call)
 	{
 	case DLL_PROCESS_ATTACH:
-        // DLL注入,都在该Case下完成任务;
-        // 1、准备工作;
-        if ( true )
         {
-            // 2、创建后台线程;
-            OutputDebugString(_T("<InjectionDll> Injection!!!"));
-            hThreadProc = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
+            hThreadProc = CreateThread(NULL, 0, WorkThreadProc, NULL, 0, NULL);
             CloseHandle(hThreadProc);
+
+            TCHAR szWndTitle[MAXBYTE] = {0};
+            // 获取DLL所在窗口句柄;
+            HWND hWnd = GetMainWnd();
+            // 得到窗口名称
+            GetWindowText(hWnd,szWndTitle,sizeof(szWndTitle));
+            //是否名称是计算器
+            if( 0 == _tcscmp(szWndTitle, _T("计算器")) )
+            {
+                OutputDebugString(_T("<Injecter> 找到指定窗口!!!"));
+                // 2、创建后台线程;
+            }
+            else
+            {
+                OutputDebugString(_T("<Injecter> 如果不满足条件,DLL自我卸载!!!"));
+                // 如果不满足条件,DLL自我卸载;
+                FreeLibraryAndExitThread(g_hModule, 0);
+            }
         }
-        else
-        {
-            // 如果不满足条件,DLL自我卸载;
-            FreeLibraryAndExitThread(g_hModule, 0);
-        }
+        break;
 	case DLL_THREAD_ATTACH:
+        break;
 	case DLL_THREAD_DETACH:
+        break;
 	case DLL_PROCESS_DETACH:
 		break;
 	}