Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126

CreateRemoteTherad в инжекторе крашит целевую программу

11.01.2017, 14:02. Показов 1911. Ответов 8

Студворк — интернет-сервис помощи студентам
Здравствуйте, столкнулся с проблемой в написании инжектора DLL файлов. Проблема заключается в том, что при вызове CreateRemoteThread целевая программа(в которую я пытаюсь провести инъекцию) аварийно завершается. С самой dll-кой все хорошо, Extrime Injector ее успешно внедряет.
Код инжектора:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
#include <string>
#include <conio.h>
#include <Windows.h>
 
using namespace std;
BOOL Inject(DWORD dwPID, char *szDllPath);
 
int main(int argc, char *argv[])
{
    setlocale(LC_ALL, "Russian");
    cout << "*** DLL INJECTOR ***\n\n";
    DWORD dwPID = 0;
    string sDllPath;
    cout << "Введите PID целевого процесса: ";
    cin >> dwPID;
    cout << "Введите путь к целевой DLL: ";
    cin >> sDllPath;
 
    BOOL b = Inject(dwPID, (char*)sDllPath.c_str());
 
    cout << "Результат операции - " << b << '\n';
 
    _getch();
 
    return EXIT_SUCCESS;
}
 
BOOL Inject(DWORD dwPID, char *szDllPath)
{
    DWORD dwErr = 0;
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);
    if (hProcess == NULL)
    {
        dwErr = GetLastError();
        OutputDebugString("OpenProcessError fail");
        return FALSE;
    }
    LPVOID lpLoadLibraryAFunction = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
    if (lpLoadLibraryAFunction == NULL)
    {
        dwErr = GetLastError();
        OutputDebugString("GetProcAddress fail");
        return FALSE;
    }
    LPVOID lpLoadDllPath = (LPVOID)VirtualAllocEx(hProcess, NULL, strlen(szDllPath), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    if (lpLoadDllPath == NULL)
    {
        dwErr = GetLastError();
        OutputDebugString("VirtualAllocEx fail");
        return FALSE;
    }
    HANDLE hRemoteThread = CreateRemoteThread(hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)lpLoadLibraryAFunction, (LPVOID)szDllPath, NULL, NULL);
    if (hRemoteThread == NULL)
    {
        dwErr = GetLastError();
        OutputDebugString("CreateRemoteThread fail");
        DWORD dwErro = GetLastError();
        return FALSE;
    }
    WaitForSingleObject(hRemoteThread, INFINITE);
    if (VirtualFreeEx(hProcess, hRemoteThread, strlen(szDllPath), MEM_RELEASE) == FALSE)
    {
        dwErr = GetLastError();
        OutputDebugString("VirtualFreeEx fail");
        return FALSE;
    }
    CloseHandle(hRemoteThread);
    CloseHandle(hProcess);
    return TRUE;
}
Код Dll-ки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <Windows.h>
 
 
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    switch (dwReasonForCall)
    {
    case DLL_PROCESS_ATTACH:
        MessageBoxA(NULL, "DLL_PROCESS_ATTACH", "Attached!", MB_OK);
        break;
    case DLL_PROCESS_DETACH:
        MessageBoxA(NULL, "DLL_PROCESS_DETACH", "Detached!", MB_OK);
        break;
    }
    return TRUE;
}
P.S. Dll-ка - Win32, Инжектор - Win32, Целевая программа - Win32.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.01.2017, 14:02
Ответы с готовыми решениями:

Почему крашит программу
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;locale.h&gt; #include &lt;string.h&gt; #define MAX_LOGIN 32 #define MAX_PASS 32 ...

Изменение значения по указателю крашит программу
пытаюсь поменять значение по указателю, указывающему на область, где загружена kernel32.dll. Прога вылетает, при вызове VirtualQuery для...

Крашит программу примерно при вызове функции free()
Всё заполняется без ошибок, как и выводит, но примерно на освобождении памяти просто крашит программу.Пробовал компилить и по дефолту, и со...

8
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
11.01.2017, 15:19
У тебя в коде инжектора после VirtualAllocEx отсутствует WriteProcessMemory.
Т.е. нет функции, которая бы записала путь к dll в выделенную память в
целевом процессе. Поэтому удаленный поток запускается и даже доходит до
LoadLibrary, но вместо пути к dll у него в память записан "мусор".
0
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126
11.01.2017, 15:52  [ТС]
Спасибо за то, что показали мне на мою невнимательность. Но функция от этого не заработала. Целевая программа все равно крашится(все остается как было). VirtualFreeEx завершается с ошибкой(GetLastError 87). WriteProcessMemory работает, по адресу возвращаемому VirtualAllocEx записывается путь(смотрел CheatEngine-ом).
Новый код функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
BOOL Inject(DWORD dwPID, char *szDllPath)
{
    DWORD dwErr = 0;
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);
    if (!hProcess)
    {
        dwErr = GetLastError();
        OutputDebugString("OpenProcessError fail");
        return FALSE;
    }
    LPVOID lpLoadLibraryAFunction = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
    if (!lpLoadLibraryAFunction)
    {
        dwErr = GetLastError();
        OutputDebugString("GetProcAddress fail");
        return FALSE;
    }
    LPVOID lpLoadDllPath = (LPVOID)VirtualAllocEx(hProcess, NULL, strlen(szDllPath), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    if (!lpLoadDllPath)
    {
        dwErr = GetLastError();
        OutputDebugString("VirtualAllocEx fail");
        return FALSE;
    }
    if (!WriteProcessMemory(hProcess, lpLoadDllPath, szDllPath, strlen(szDllPath), NULL))
    {
        dwErr = GetLastError();
        OutputDebugString("WriteProcessMemory fail");
        return FALSE;
    }
    HANDLE hRemoteThread = CreateRemoteThread(hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)lpLoadLibraryAFunction, (LPVOID)szDllPath, NULL, NULL);
    if (!hRemoteThread)
    {
        dwErr = GetLastError();
        OutputDebugString("CreateRemoteThread fail");
        return FALSE;
    }
    WaitForSingleObject(hRemoteThread, INFINITE);
    if (!VirtualFreeEx(hProcess, hRemoteThread, strlen(szDllPath), MEM_RELEASE))
    {
        dwErr = GetLastError();
        OutputDebugString("VirtualFreeEx fail");
        return FALSE;
    }
    CloseHandle(hRemoteThread);
    CloseHandle(hProcess);
    return TRUE;
}
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
11.01.2017, 16:17
Цитата Сообщение от Алексей_Либанов Посмотреть сообщение
LPVOID lpLoadDllPath = (LPVOID)VirtualAllocEx(hProcess, NULL, strlen(szDllPath), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
Здесь должно быть strlen(szDllPath) + 1.
Потому что иначе нет гарантии, что путь запишется с завершающим нулем.
0
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126
11.01.2017, 17:27  [ТС]
Теперь 50 на 50, или ничего не происходит, или целевая программа крашится. Немного доработал код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
BOOL Inject(DWORD dwPID, char *szDllPath)
{
    DWORD dwErr = 0;
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);
    if (!hProcess)
    {
        dwErr = GetLastError();
        OutputDebugString("OpenProcessError fail");
        return FALSE;
    }
    LPVOID lpLoadLibraryAFunction = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
    if (!lpLoadLibraryAFunction)
    {
        dwErr = GetLastError();
        OutputDebugString("GetProcAddress fail");
        CloseHandle(hProcess);
        return FALSE;
    }
    LPVOID lpLoadDllPath = VirtualAllocEx(hProcess, NULL, strlen(szDllPath) + 1, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    if (!lpLoadDllPath)
    {
        dwErr = GetLastError();
        OutputDebugString("VirtualAllocEx fail");
        CloseHandle(hProcess);
        return FALSE;
    }
    if (!WriteProcessMemory(hProcess, lpLoadDllPath, szDllPath, strlen(szDllPath), NULL))
    {
        dwErr = GetLastError();
        OutputDebugString("WriteProcessMemory fail");
        CloseHandle(hProcess);
        return FALSE;
    }
    HANDLE hRemoteThread = CreateRemoteThread(hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)lpLoadLibraryAFunction, (LPVOID)szDllPath, NULL, NULL);
    if (!hRemoteThread)
    {
        dwErr = GetLastError();
        OutputDebugString("CreateRemoteThread fail");
        CloseHandle(hProcess);
        return FALSE;
    }
    WaitForSingleObject(hRemoteThread, INFINITE);
    if (!VirtualFreeEx(hProcess, hRemoteThread, strlen(szDllPath), MEM_RELEASE))
    {
        dwErr = GetLastError();
        OutputDebugString("VirtualFreeEx fail");
        CloseHandle(hRemoteThread);
        CloseHandle(hProcess);
        return FALSE;
    }
    CloseHandle(hRemoteThread);
    CloseHandle(hProcess);
    return TRUE;
}
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
11.01.2017, 17:47
Ошибка с длиной строки все еще присутствует. См. строку с WriteProcessMemory,
там должно быть не "strlen(szDllPath)", а "strlen(szDllPath)+1".

Ну и вообще, такие ошибки следует отлаживать особым образом.
Например, цепляешься отладчиком к целевому процессу, ставишь break на
LoadLibraryA, например, а затем запускаешь свой инжектор. После чего
по шагам идешь до того места, где падает.

Либо снимай крэш-дамп процесса после падения (procdump с ключом -ma),
открывай его в WinDBG и смотри, где упало и почему.
1
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126
11.01.2017, 18:03  [ТС]
Спасибо, займусь отладкой, как найду что-то непонятное - напишу.
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
11.01.2017, 18:37
Лучший ответ Сообщение было отмечено Алексей_Либанов как решение

Решение

Память выделили под lpLoadDllPath, тудаже записали путь.. а в качестве параметра всеровно мусор пихаете...
C
1
CreateRemoteThread(hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)lpLoadLibraryAFunction, (LPVOID)szDllPath, NULL, NULL);
так сделайте
C++
1
2
3
4
5
WriteProcessMemory(hProcess, lpLoadDllPath, szDllPath, strlen(szDllPath) + 1, NULL))
 
...
 
CreateRemoteThread(hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)lpLoadLibraryAFunction, lpLoadDllPath, NULL, NULL);
2
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126
11.01.2017, 18:48  [ТС]
ISergey, Большое спасибо! Dll успешно внедряется.
Убежденный, Вам тоже спасибо, за то, что указали на невнимательность с записью в процесс!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.01.2017, 18:48
Помогаю со студенческими работами здесь

Sleep(1000) иногда крашит программу у одного юзера
Из треда идет вызов Sleep(1000) и проверка глобальной переменной Sleep(1000); if(!has_thread) { ... windbg пишет: стэк:

Функция в dll, которая инжектится в чужой процесс, крашит программу
Здравствуйте, сражу скажу, программу я пишу в целях собственного развития, вирус писать я не планирую. Теперь проблема, при вызове...

В скомпилированном приложении строка кода "delete engien" крашит программу
Добрый вечер. Странная ситуация у меня сложилась,вероятно в силу неопытности не могу понять почему? Есть прога,одна форма. При...

Нужно, чтобы файлы, которые надо инжектить были в самом инжекторе
1. у меня есть инжектор dll файлов (я сам его делал) мне надо что бы в нем инжекторе были файлы внутри exe а надо мне это для того чтобы я...

Минимизировать целевую функцию
TORA. Линейное программирование Добрый день. Есть такая задачка. Нужно минимизировать целевую функцию. Есть функция, есть 3...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru