Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ и WinAPI

Войти
Регистрация
Восстановить пароль
 
Алексей_Либанов
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126
#1

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

11.01.2017, 14:02. Просмотров 256. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.01.2017, 14:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос CreateRemoteTherad в инжекторе крашит целевую программу (C++ WinAPI):

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

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

Инжектор крашит CS:GO на Windows 10 - C++ WinAPI
Здравствуйте! Столкнулся с проблемой при которой инжектор крашит CS:GO, при этом на Windows 10, на остальных вроде всё нормально. Ошибка...

Ловушка / Hook крашит приложения (WH_CBT/HCBT_CREATEWND) - C++ WinAPI
Доброго времени суток. Отрывисто изучаю WinApi, наткнувшись на такую технологию как ловушки, решил реализовать следующую задачу...

DLL крашит приложение при создании потока (CreateThread) - C++ WinAPI
Здрасьте. Внедряю свою дллку в любой процесс и он крашится с моего потока. #include &lt;Windows.h&gt; void Main(){ MessageBox(0,...

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

8
Убежденный
Ушел с форума
Эксперт С++
15708 / 7218 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
11.01.2017, 15:19 #2
У тебя в коде инжектора после VirtualAllocEx отсутствует WriteProcessMemory.
Т.е. нет функции, которая бы записала путь к dll в выделенную память в
целевом процессе. Поэтому удаленный поток запускается и даже доходит до
LoadLibrary, но вместо пути к dll у него в память записан "мусор".
0
Алексей_Либанов
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126
11.01.2017, 15:52  [ТС] #3
Спасибо за то, что показали мне на мою невнимательность. Но функция от этого не заработала. Целевая программа все равно крашится(все остается как было). 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
Убежденный
Ушел с форума
Эксперт С++
15708 / 7218 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
11.01.2017, 16:17 #4
Цитата Сообщение от Алексей_Либанов Посмотреть сообщение
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  [ТС] #5
Теперь 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
Убежденный
Ушел с форума
Эксперт С++
15708 / 7218 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
11.01.2017, 17:47 #6
Ошибка с длиной строки все еще присутствует. См. строку с WriteProcessMemory,
там должно быть не "strlen(szDllPath)", а "strlen(szDllPath)+1".

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

Либо снимай крэш-дамп процесса после падения (procdump с ключом -ma),
открывай его в WinDBG и смотри, где упало и почему.
1
Алексей_Либанов
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 126
11.01.2017, 18:03  [ТС] #7
Спасибо, займусь отладкой, как найду что-то непонятное - напишу.
0
ISergey
Maniac
Эксперт С++
1395 / 906 / 56
Регистрация: 02.01.2009
Сообщений: 2,706
Записей в блоге: 1
11.01.2017, 18:37 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Память выделили под 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  [ТС] #9
ISergey, Большое спасибо! Dll успешно внедряется.
Убежденный, Вам тоже спасибо, за то, что указали на невнимательность с записью в процесс!
0
11.01.2017, 18:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2017, 18:48
Привет! Вот еще темы с ответами:

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

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

Крашит Релиз - Delphi FireMonkey
Всем привет пытаюсь подписать приложение на андройд как в этой статье http://www.cyberforum.ru/delphi-firemonkey/thread1107965.html ...

Крашит RtlAvlRemoveNode - Программирование драйверов
Доброго времени суток, при использовании функции RtlAvlRemoveNode на windows 10 происходит краш системы. использую следующим образом ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.