Browse Source

无法找到句柄。

sat23 3 năm trước cách đây
mục cha
commit
39158c1eb1

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

@@ -21,7 +21,8 @@
 			OutputDirectory="..\..\..\..\..\bin\$(SolutionName)"
 			IntermediateDirectory="$(OutDir)\$(ProjectName)\$(ConfigurationName)"
 			ConfigurationType="2"
-			CharacterSet="1"
+			UseOfMFC="0"
+			CharacterSet="2"
 			>
 			<Tool
 				Name="VCPreBuildEventTool"
@@ -93,7 +94,8 @@
 			OutputDirectory="..\..\..\..\..\bin\$(SolutionName)"
 			IntermediateDirectory="$(OutDir)\$(ProjectName)\$(ConfigurationName)"
 			ConfigurationType="2"
-			CharacterSet="1"
+			UseOfMFC="0"
+			CharacterSet="2"
 			WholeProgramOptimization="1"
 			>
 			<Tool

+ 24 - 22
DLLInjection/RegistryInjection/InjectionDLL/InjectionDLL/dllmain.cpp

@@ -8,9 +8,12 @@ HANDLE hThreadProc = NULL;
 // 枚举屏幕上的所有顶级窗口
 BOOL CALLBACK EnumWndProc(HWND hwnd, LPARAM lParam)
 {
+    TCHAR szLog[MAX_PATH] = {0};
     DWORD dwCurrentProcessId = *((DWORD*)lParam);
     // 根据进程ID、窗口,获取当前窗口所在线程ID;
     DWORD dwThreadProcessId = GetWindowThreadProcessId(hwnd, &dwCurrentProcessId);
+    _stprintf_s(szLog, _T("<Injecter> 进程ID=%ld, 窗口进程ID=%ld"), dwCurrentProcessId, dwThreadProcessId);
+    OutputDebugString(szLog);
     if ( dwCurrentProcessId == dwThreadProcessId && GetParent(hwnd) == NULL )   // GetParent==Null表示主窗口,本来就是找顶级的,有点多余?;
     {
         *((HWND*)lParam) = hwnd;
@@ -27,36 +30,53 @@ BOOL CALLBACK EnumWndProc(HWND hwnd, LPARAM lParam)
 
 HWND GetMainWnd()
 {
+    TCHAR szLog[MAX_PATH] = {0};
     // 获取当前DLL所在进程ID;
     DWORD dwCurrentProcessId = GetCurrentProcessId();
     // 枚举该进程窗口;
     EnumWindows(EnumWndProc, (LPARAM)&dwCurrentProcessId);
-    if (GetLastError() == 10086)
+    DWORD dwError = GetLastError();
+    if (dwError == 10086)
     {
         // 找到窗口句柄;
         return (HWND)dwCurrentProcessId;
     }
 
+    _stprintf_s(szLog, _T("<Injecter> 进程ID=%ld, 没找到窗口,GetLastError=%ld"), dwCurrentProcessId, dwError);
+    OutputDebugString(szLog);
+
     return NULL;
 }
 
 DWORD WINAPI WorkThreadProc(LPVOID lParam)
 {
-    // 工作线程;
+#ifdef _DEBUG
+    Sleep(20000);
+#endif
+    TCHAR szLog[MAX_PATH] = {0};
     TCHAR szWndTitle[MAXBYTE] = {0};
     // 获取DLL所在窗口句柄;
     HWND hWnd = GetMainWnd();
+    if ( hWnd == NULL )
+    {
+        OutputDebugString(_T("<Injecter> 没有找到窗口句柄"));
+        FreeLibraryAndExitThread(g_hModule, 0);
+        return 0;
+    }
+
     // 得到窗口名称
     GetWindowText(hWnd,szWndTitle,sizeof(szWndTitle));
+    _stprintf_s(szLog, _T("找到窗口名称:%s"),  szWndTitle);
+    OutputDebugString(szLog);
     //是否名称是计算器
-    if( 0 == _tcscmp(szWndTitle, _T("计算器")) )
+    if( 0 == _tcsstr(szWndTitle, _T("计算器")) )
     {
         OutputDebugString(_T("<Injecter> 找到指定窗口!!!"));
         // 2、创建后台线程;
     }
     else
     {
-        OutputDebugString(_T("<Injecter> 如果不满足条件,DLL自我卸载!!!"));
+        OutputDebugString(_T("<Injecter> 不满足条件,DLL自我卸载!!!"));
         // 如果不满足条件,DLL自我卸载;
         FreeLibraryAndExitThread(g_hModule, 0);
     }
@@ -74,24 +94,6 @@ BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserv
         {
             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);
-            }
         }
         break;
 	case DLL_THREAD_ATTACH:

+ 2 - 1
DLLInjection/RegistryInjection/InjectionDLL/InjectionDLL/stdafx.h

@@ -11,6 +11,7 @@
 // Windows 头文件:
 #include <windows.h>
 #include <tchar.h>
-
+#include <stdlib.h>
+#include <stdio.h>
 
 // TODO: 在此处引用程序需要的其他头文件