Внедрение DLL на два процесса - PullRequest
0 голосов
/ 28 апреля 2020

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

1 Ответ

0 голосов
/ 28 апреля 2020

Ну, как я уже говорил в моем последнем комментарии

Пробовал с SetWindowsHook, такое же поведение. Придумал окно переименования + сравнение имен. Работает отлично! Спасибо за вашу помощь

Я использовал переименование + сравнение имен. Появились другие проблемы, поэтому мне пришлось переосмыслить свой способ его достижения. Вот окончательная версия:

bool isSameProcess(HWND window, DWORD pid)
{
    DWORD activePId;
    DWORD activeThreadId = GetWindowThreadProcessId(window, &activePId);
    return activePId == pid;
}

Объяснение: окно - активное окно, pid нашего собственного идентификатора процесса. мы проверим, равен ли наш pid идентификатору процесса активного окна. Если это так, мы возвращаем true, иначе false.

Таким образом, вы можете использовать это так:

if ((GetAsyncKeyState(VK_F9) & 0x8000))
{
    window = GetForegroundWindow();
    if(isSameProcess(window, pid))
    {/* Whatever you want to do */}
}
...