Я пытаюсь построить 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, появляется «Clicked». Ожидается.
Теперь я запускаю 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, но поскольку он связан с консолью, я не могу его использовать, даже если он не печатается на второй консоли.