Как использовать во время выполнения dll-инъекцию для записи в файл Running и Temp notepad / txt - PullRequest
0 голосов
/ 16 марта 2020

По сути, я создал простой код Dll-инъекции с базовым c Dll, который показывает окно сообщения, и мой вопрос заключается в том, как теперь я могу использовать файл Dll, чтобы заставить его записывать текст в Блокнот во время его работы, и он не ' t был сохранен / временно? Есть ли способ найти путь к файлу? (я так не думаю, потому что он все еще записывает данные в оперативную память и не имеет названия, поэтому не сохраняет данные на любых дисках) Или есть поток, в который я могу записать?

1 Ответ

0 голосов
/ 18 марта 2020

Как сказал Тимо в комментарии, вы можете получить дескриптор окна «Блокнот», а затем использовать его для записи текста в него, и вам даже не потребуется вводить вашу DLL в процесс «Блокнот».

В Windows каждое окно получает сообщения от операционной системы (или от других программ, например, что вы собираетесь попробовать), эти сообщения сообщают окну, какое действие было выполнено, например - Нажатие вниз ключ или нажатие кнопки мыши. Таким образом, программа, управляющая окном, будет знать, какое действие она должна делать.

Вы можете использовать инструмент Spy ++ (spyxx.exe, встроенный в каждую Visual Studio), чтобы отслеживать, что делает Windows когда вы нажимаете клавишу вниз на клавиатуре в окне блокнота. Вы можете узнать больше о topi c оконных сообщениях здесь: https://docs.microsoft.com/en-us/windows/win32/learnwin32/window-messages

И работа со Spy ++ здесь: https://docs.microsoft.com/en-us/visualstudio/debugger/introducing-spy-increment?view=vs-2019

Открывая Spy ++, мы можем видеть все Windows в нашем сеансе, и мы ищем Блокнот: как это выглядит

Маленький ПО C Я сделал для поиска подходящего Окно, в соответствии с тем, что обнаружил Spy ++ (простите меня за глобальные переменные, и убедитесь, что вы знаете, что я здесь сделал):

HWND notepad_window;
HWND notepad_edit;

BOOL CALLBACK GetEditWindow(HWND hWnd, LPARAM lParam)
{
    wchar_t window_text[MAX_PATH] = { 0 };
    if (0 != GetClassNameW(hWnd, window_text, MAX_PATH))
    {
        std::wstring text(window_text);
        if (std::wstring::npos != text.find(L"Edit"))
        {
            std::wcout << "Found it" << text << std::endl;
            notepad_edit = hWnd;
            return false;
        }
    }
    return true;
}

BOOL CALLBACK GetNotepadWindow(HWND hWnd, LPARAM lParam)
{
    wchar_t window_text[MAX_PATH] = { 0 };
    // Fun fact - The GetWindowTextW also posts a window message to the window, the WM_GETTEXT message
    if (0 != GetWindowTextW(hWnd, window_text, MAX_PATH))
    {
        std::wstring text(window_text);
        if (std::wstring::npos != text.find(L"Notepad"))
        {
            std::wcout << "Found it" << text << std::endl;
            notepad_window = hWnd;
            return false;
        }
    }
    return true;
}

int wmain()
{
    EnumWindows(GetNotepadWindow, 0);
    EnumChildWindows(notepad_window, GetEditWindow, 0);
}

После того, как у вас есть HWND, вы можете начать работать с сообщением проводка. Вы можете снова использовать Spy ++, чтобы «постучать» по окну редактирования Блокнота и увидеть каждое сообщение окна, отправленное при нажатии клавиши, вы увидите WM_KEYDOWN, за которым, скорее всего, следует WM_KEYUP.

Затем вы можете используйте функцию PostMessage WinAPI, чтобы публиковать ваши собственные сообщения WM_KEYDOWN / KEYUP в окне блокнота, следовательно, контролировать вход, который он получает.

...