[英]DLL Injection on two processes
我正在尝试构建一个 dll (以便注入进程)并且遇到了一些问题。
让我解释:
当我在我的目标中注入我的 dll 时,一切正常。 一旦我在第一个目标仍在运行时添加另一个目标(相同的可执行文件),就会出现一些冲突。
公平地说,我认为“只有”一个冲突。 这是代码。
DWORD WINAPI MainThread(LPVOID param)
{
// Same behaviour with GetKeyState
while (!GetAsyncKeyState(VK_F9)) // While F9 is not pressed, do nothing
Sleep(5);
fprintf(stdout, "Clicked !"); // Print Clicked when F9 is pressed
while(true); // Just to stop.
return false;
}
BOOL APIENTRY DllMain(HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH: // Gets ran when injected
AllocConsole(); // Enable the console
freopen_s((FILE**)stdout, "CONOUT$", "w", stdout);
freopen_s((FILE**)stdin, "CONIN$", "r", stdin);
CreateThread(0, 0, MainThread, hModule, 0, 0); // Creates our thread
break;
}
return TRUE;
}
此示例将执行以下操作:我启动 Target.exe,将 Inject.dll 注入其中,按 F9,出现“单击”。 预期的。
现在,我启动 Target.exe,我注入 Indect.dll,我不按 F9。 相反,我启动了另一个 Target.exe,我将 Inject.dll 注入其中,现在,如果我按 F9,Clicked 将在两个控制台上打印。 意外。
为什么?
我在https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getasynckeystate上阅读了以下内容
尽管返回值的最低有效位指示自上次查询以来是否已按下键,但由于 Windows 的抢占式多任务性质,另一个应用程序可以调用 GetAsyncKeyState 并接收“最近按下”位而不是您的应用程序。 严格保留返回值的最低有效位的行为是为了与 16 位 My Windows 应用程序(非抢占式)兼容,不应依赖。
Target.exe 和 Inject.dll 都是 32 位的,所以我想我不需要被那个引用所困扰,所以我真的不知道是什么原因造成的。
请注意,我也使用 getchar 进行了测试,但由于它与控制台相关,因此我无法使用它,即使它没有在第二个控制台上打印。
好吧,正如我在上一条评论中所说
尝试使用 SetWindowsHook,行为相同。 想出了一个 window 重命名 + 名称比较。 完美运行! 谢谢你的帮助
我使用了重命名+名称比较。 其他问题出现了,所以我不得不重新考虑实现它的方式。 这是最终版本:
bool isSameProcess(HWND window, DWORD pid)
{
DWORD activePId;
DWORD activeThreadId = GetWindowThreadProcessId(window, &activePId);
return activePId == pid;
}
说明:window是活跃的window,pid是我们自己的进程id。 我们将检查我们的 pid 是否等于活动窗口的进程 ID。 如果是,我们返回 true,否则返回 false。
所以这样,你可以像这样使用它:
if ((GetAsyncKeyState(VK_F9) & 0x8000))
{
window = GetForegroundWindow();
if(isSameProcess(window, pid))
{/* Whatever you want to do */}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.