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