Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Алексей_Либанов
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 118
11.01.2017, 14:02     CreateRemoteTherad в инжекторе крашит целевую программу #1
Здравствуйте, столкнулся с проблемой в написании инжектора 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.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.01.2017, 14:02     CreateRemoteTherad в инжекторе крашит целевую программу
Посмотрите здесь:

C++ WinAPI Изменение значения по указателю крашит программу
DLL крашит приложение при создании потока (CreateThread) C++ WinAPI
Ловушка / Hook крашит приложения (WH_CBT/HCBT_CREATEWND) C++ WinAPI
C++ WinAPI Инжектор крашит CS:GO на Windows 10

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
 Аватар для Убежденный
14438 / 6422 / 1015
Регистрация: 02.05.2013
Сообщений: 10,664
Завершенные тесты: 1
11.01.2017, 15:19     CreateRemoteTherad в инжекторе крашит целевую программу #2
У тебя в коде инжектора после VirtualAllocEx отсутствует WriteProcessMemory.
Т.е. нет функции, которая бы записала путь к dll в выделенную память в
целевом процессе. Поэтому удаленный поток запускается и даже доходит до
LoadLibrary, но вместо пути к dll у него в память записан "мусор".
Алексей_Либанов
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 118
11.01.2017, 15:52  [ТС]     CreateRemoteTherad в инжекторе крашит целевую программу #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;
}
Убежденный
Системный программист
 Аватар для Убежденный
14438 / 6422 / 1015
Регистрация: 02.05.2013
Сообщений: 10,664
Завершенные тесты: 1
11.01.2017, 16:17     CreateRemoteTherad в инжекторе крашит целевую программу #4
Цитата Сообщение от Алексей_Либанов Посмотреть сообщение
LPVOID lpLoadDllPath = (LPVOID)VirtualAllocEx(hProcess, NULL, strlen(szDllPath), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
Здесь должно быть strlen(szDllPath) + 1.
Потому что иначе нет гарантии, что путь запишется с завершающим нулем.
Алексей_Либанов
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 118
11.01.2017, 17:27  [ТС]     CreateRemoteTherad в инжекторе крашит целевую программу #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;
}
Убежденный
Системный программист
 Аватар для Убежденный
14438 / 6422 / 1015
Регистрация: 02.05.2013
Сообщений: 10,664
Завершенные тесты: 1
11.01.2017, 17:47     CreateRemoteTherad в инжекторе крашит целевую программу #6
Ошибка с длиной строки все еще присутствует. См. строку с WriteProcessMemory,
там должно быть не "strlen(szDllPath)", а "strlen(szDllPath)+1".

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

Либо снимай крэш-дамп процесса после падения (procdump с ключом -ma),
открывай его в WinDBG и смотри, где упало и почему.
Алексей_Либанов
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 118
11.01.2017, 18:03  [ТС]     CreateRemoteTherad в инжекторе крашит целевую программу #7
Спасибо, займусь отладкой, как найду что-то непонятное - напишу.
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1345 / 878 / 51
Регистрация: 02.01.2009
Сообщений: 2,642
Записей в блоге: 1
11.01.2017, 18:37     CreateRemoteTherad в инжекторе крашит целевую программу #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);
Алексей_Либанов
1 / 1 / 0
Регистрация: 21.02.2015
Сообщений: 118
11.01.2017, 18:48  [ТС]     CreateRemoteTherad в инжекторе крашит целевую программу #9
ISergey, Большое спасибо! Dll успешно внедряется.
Убежденный, Вам тоже спасибо, за то, что указали на невнимательность с записью в процесс!
Yandex
Объявления
11.01.2017, 18:48     CreateRemoteTherad в инжекторе крашит целевую программу
Ответ Создать тему

Метки
c++, crash, createremotethread, injector, winapi
Опции темы

Текущее время: 02:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru