0 / 0 / 0
Регистрация: 18.10.2019
Сообщений: 31
1

Передача параметра lpReserved

27.07.2022, 19:29. Показов 669. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Пытаюсь передать структуру данных путем загрузки модуля dll в процесс.
Инжект dll в процесс работает, но на выходе получаю пустое сообщение в месседжбоксе

Инициализация
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct DllArgs
{
    std::string name;
    std::string pass;
} dll_args;
 
 
 
dll_args.name = g_username_str;
dll_args.pass = g_password_str;
            
 
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
 
if (!map_module(hProc, dll_data, dll_size, &dll_args)) {        
    return;
}


Функция инжекта dll
Кликните здесь для просмотра всего текста
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
using f_LoadLibraryA = HINSTANCE(WINAPI*)(const char* lpLibFilename);
using f_GetProcAddress = FARPROC(WINAPI*)(HMODULE hModule, LPCSTR lpProcName);
using f_DLL_ENTRY_POINT = BOOL(WINAPI*)(void* hDll, DWORD dwReason, void* pReserved);
 
struct MANUAL_MAPPING_DATA
{
    f_LoadLibraryA pLoadLibraryA;
    f_GetProcAddress pGetProcAddress;
    BYTE* pbase;
    HINSTANCE hMod;
    DWORD fdwReasonParam;
    LPVOID reservedParam;
    BOOL SEHSupport;
};
 
bool map_module(HANDLE hProc, BYTE* pSrcData, SIZE_T FileSize, LPVOID lpReserved)
{
    IMAGE_NT_HEADERS* pOldNtHeader = nullptr;
    IMAGE_OPTIONAL_HEADER* pOldOptHeader = nullptr;
    IMAGE_FILE_HEADER* pOldFileHeader = nullptr;
    BYTE* pTargetBase = nullptr;
 
    if (reinterpret_cast<IMAGE_DOS_HEADER*>(pSrcData)->e_magic != 0x5A4D) { 
        return false;
    }
 
    pOldNtHeader = reinterpret_cast<IMAGE_NT_HEADERS*>(pSrcData + reinterpret_cast<IMAGE_DOS_HEADER*>(pSrcData)->e_lfanew);
    pOldOptHeader = &pOldNtHeader->OptionalHeader;
    pOldFileHeader = &pOldNtHeader->FileHeader;
 
    if (pOldFileHeader->Machine != CURRENT_ARCH) {
        return false;
    }
 
    
    pTargetBase = reinterpret_cast<BYTE*>(VirtualAllocEx(hProc, nullptr, pOldOptHeader->SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE));
    if (!pTargetBase) {
        return false;
    }
 
    DWORD oldp = 0;
    VirtualProtectEx(hProc, pTargetBase, pOldOptHeader->SizeOfImage, PAGE_EXECUTE_READWRITE, &oldp);
 
    MANUAL_MAPPING_DATA data{ 0 };
    data.pLoadLibraryA = LoadLibraryA;
    data.pGetProcAddress = GetProcAddress;
 
    data.pbase = pTargetBase;
    data.reservedParam = lpReserved;
    
 
    if (!WriteProcessMemory(hProc, pTargetBase, pSrcData, 0x1000, nullptr)) { 
        
        VirtualFreeEx(hProc, pTargetBase, 0, MEM_RELEASE);
        return false;
    }
 
    IMAGE_SECTION_HEADER* pSectionHeader = IMAGE_FIRST_SECTION(pOldNtHeader);
    for (UINT i = 0; i != pOldFileHeader->NumberOfSections; ++i, ++pSectionHeader) {
        if (pSectionHeader->SizeOfRawData) {
            if (!WriteProcessMemory(hProc, pTargetBase + pSectionHeader->VirtualAddress, pSrcData + pSectionHeader->PointerToRawData, pSectionHeader->SizeOfRawData, nullptr)) {
                //ILog("Can't map sections: 0x%x\n", GetLastError());
                VirtualFreeEx(hProc, pTargetBase, 0, MEM_RELEASE);
                return false;
            }
        }
    }
 
 
    BYTE* MappingDataAlloc = reinterpret_cast<BYTE*>(VirtualAllocEx(hProc, nullptr,
        sizeof(MANUAL_MAPPING_DATA), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE));
 
    if (!MappingDataAlloc) {
        
        VirtualFreeEx(hProc, pTargetBase, 0, MEM_RELEASE);
        return false;
    }
 
    if (!WriteProcessMemory(hProc, MappingDataAlloc, &data, sizeof(MANUAL_MAPPING_DATA), nullptr)) {
        
        VirtualFreeEx(hProc, pTargetBase, 0, MEM_RELEASE);
        VirtualFreeEx(hProc, MappingDataAlloc, 0, MEM_RELEASE);
        return false;
    }
 
 
    void* pShellcode = VirtualAllocEx(hProc, nullptr, 0x1000, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    if (!pShellcode) {
        
        VirtualFreeEx(hProc, pTargetBase, 0, MEM_RELEASE);
        VirtualFreeEx(hProc, MappingDataAlloc, 0, MEM_RELEASE);
        return false;
    }
 
    if (!WriteProcessMemory(hProc, pShellcode, Shellcode, 0x1000, nullptr)) {
        
        VirtualFreeEx(hProc, pTargetBase, 0, MEM_RELEASE);
        VirtualFreeEx(hProc, MappingDataAlloc, 0, MEM_RELEASE);
        VirtualFreeEx(hProc, pShellcode, 0, MEM_RELEASE);
        return false;
    }
 
 
    HANDLE hThread = CreateRemoteThread(hProc, nullptr, 0, reinterpret_cast<LPTHREAD_START_ROUTINE>(pShellcode), MappingDataAlloc, 0, nullptr);
    if (!hThread) {
        
        VirtualFreeEx(hProc, pTargetBase, 0, MEM_RELEASE);
        VirtualFreeEx(hProc, MappingDataAlloc, 0, MEM_RELEASE);
        VirtualFreeEx(hProc, pShellcode, 0, MEM_RELEASE);
        return false;
    }
    CloseHandle(hThread);
 
    HINSTANCE hCheck = NULL;
    while (!hCheck) {
        DWORD exitcode = 0;
        GetExitCodeProcess(hProc, &exitcode);
        if (exitcode != STILL_ACTIVE) {
            return false;
        }
 
        MANUAL_MAPPING_DATA data_checked{ 0 };
        ReadProcessMemory(hProc, MappingDataAlloc, &data_checked, sizeof(data_checked), nullptr);
        hCheck = data_checked.hMod;
 
        if (hCheck == (HINSTANCE)0x404040) {
            
            VirtualFreeEx(hProc, pTargetBase, 0, MEM_RELEASE);
            VirtualFreeEx(hProc, MappingDataAlloc, 0, MEM_RELEASE);
            VirtualFreeEx(hProc, pShellcode, 0, MEM_RELEASE);
            return false;
        }
        
        Sleep(10);
    }
 
    BYTE* emptyBuffer = (BYTE*)malloc(1024 * 1024 * 20);
    if (emptyBuffer == nullptr) {
        
        return false;
    }
    memset(emptyBuffer, 0, 1024 * 1024 * 20);
 
    
 
    if (!WriteProcessMemory(hProc, pShellcode, emptyBuffer, 0x1000, nullptr)) {
        
    }
    if (!VirtualFreeEx(hProc, pShellcode, 0, MEM_RELEASE)) {
        
    }
    if (!VirtualFreeEx(hProc, MappingDataAlloc, 0, MEM_RELEASE)) {
        
    }
 
    return true;
}


В дллке
Кликните здесь для просмотра всего текста
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
struct custom_args_t
{
    std::string name;
    std::string pass;
};
 
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH: {
        
        custom_args_t* args;
        args = (custom_args_t*)lpReserved;
        
        MessageBox(0, g_ctx->g_args->name.c_str(), "", MB_OK);
 
        break;
    }
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.07.2022, 19:29
Ответы с готовыми решениями:

передача параметра
привет всем ! вот код #include &lt;iostream&gt; using namespace std; struct book { char title;...

Передача параметра в потоки
Добрый день уважаемые форумчане! Подскажите как правильно сделать передачу параметров в поток. В...

Передача параметра в функцию
Проблема заключается в следующем. Есть функция, вот её прототип. void attachInterrupt(uint8_t...

передача параметра в класс
в методе я вывожу поля класса по условию, как передавать в класс переменную х, и использовать х в...

8
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,052
27.07.2022, 19:51 2
Цитата Сообщение от S0Ft1k1337 Посмотреть сообщение
Инжект dll в процесс работает, но на выходе получаю пустое сообщение в месседжбоксе
Так а как это вообще может работать? Как вы собрались в процесс указатель на данные другого процесса? Там этот указатель ничего не значит.

То есть тут даже о внутренней структуре std::string говорить не нужно. Замените std::string на int и все равно ничего работать не будет.
0
0 / 0 / 0
Регистрация: 18.10.2019
Сообщений: 31
27.07.2022, 19:56  [ТС] 3
Так я прошу вас помочь решить проблему. Как я могу передать данные в внедряемую длл?
0
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,052
27.07.2022, 20:02 4
Цитата Сообщение от S0Ft1k1337 Посмотреть сообщение
Как я могу передать данные в внедряемую длл?
Точно так же, как это делается в приведенном коде функции map_module: в постороннем процессе нужно выделить память при помощи VirtualAllocEx, а затем скопировать ваши данные в эту память при помощи WriteProcessMemory. Только std::string при этом использовать не нужно. Пользуйтесь для таких целей тривиальными представлениями данных - обычными массивами.

Я так понимаю, что map_module писали не вы, так? Вполне возможно, что эта функция map_module уже умеет все это делать, а вы просто неправильно ей пользуетесь. Приведите здесь документацию/описание функцональности этой функуции - там может быть написано, как это правльно делать.

Откуда у вас возникла идея использовать lpReserved для ваших целей?
0
0 / 0 / 0
Регистрация: 18.10.2019
Сообщений: 31
27.07.2022, 20:04  [ТС] 5
https://github.com/DarthTon/Blackbone/issues/83
0
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,052
27.07.2022, 20:26 6
Цитата Сообщение от S0Ft1k1337 Посмотреть сообщение
И? Что такое MapImage там и какое отношение оно имеет к вашему map_module? Откуда вы взяли ваш map_module? Где у вас в коде аналог их CustomArgs_t?

Там в коде все сделано правильно, то есть содержимое CustomArgs_t аккуратно копируется в принимающий процесс, именно так как я и сказал выше. Поэтому у них все прекрасно передается (но обратите внимание - в примере по вашей ссылке передаются только тривиальные типы, ни в коем случае не std::string). У вас же в коде вообще ничего подобного для параметра lpReserved нет.

Какое вообще отношение приведенная вами ссылка имеет к вашему коду? К чему вы ее привели здесь?
0
0 / 0 / 0
Регистрация: 18.10.2019
Сообщений: 31
27.07.2022, 20:29  [ТС] 7
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Откуда у вас возникла идея использовать lpReserved для ваших целей?
Я имел ввиду что в длл структура берется из поинтера lpReserved
auto pArgs = (CustomArgs*)lpReserved;

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
И? Что такое MapImage там и какое отношение оно имеет к вашему map_module?
Оба инжектят длл в процессы

Оригинал https://github.com/TheCruZ/Sim... p-Injector
0
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,052
27.07.2022, 20:35 8
Цитата Сообщение от S0Ft1k1337 Посмотреть сообщение
Я имел ввиду что в длл структура берется из поинтера lpReserved
auto pArgs = (CustomArgs*)lpReserved;
Там это совсем другой "поинтер lpReserved". Там это указатель в адресное пространство DLL. Ижнектирующий процесс заранее выделил память в адресном пространстве DLL и заранее скопировал в нее передаваемые данные из буфера CustomArgs_t. Именно указатель на эту память уже в адресном пространстве DLL и передается в DllMain. Поэтому у них все работает. Специально для поддержки такой передачи параметров копирования у них и заведен буфер CustomArgs_t.

У вас же ничего даже отдаленно похожего в коде нет. Вы тупо передаете через lpReserved указатель в адресное исходного инжектирующего процесса. В адресном пространстве DLL это указатель ничего не значит. При попытке доступа через него в DllMain код либо просто упадет, либо увидит там какой-то мусор.

Цитата Сообщение от S0Ft1k1337 Посмотреть сообщение
Оба инжектят длл в процессы
Гениально... Стул и автомобиль - в/на обоих можно сидеть.
0
0 / 0 / 0
Регистрация: 18.10.2019
Сообщений: 31
27.07.2022, 20:40  [ТС] 9
Понял спасибо
0
27.07.2022, 20:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.07.2022, 20:40
Помогаю со студенческими работами здесь

Передача параметра по ссылке
Здравствуйте! Подскажите пожалуйста! Делаю пример из книги: #include &lt;iostream&gt; #include...

Передача параметра по ссылке
Всем доброго времени суток. Понимаю что вопрос покажется очень глупым, но я уже несколько часов...

Передача инкрементирующегося параметра
Добрый день, подскажите пожалуйста, почему сначала выводится самое большое число. void prt1(int...

Передача параметра по ссылке
Всем здравствуйте. Други, помогите разобраться. Сидю :) вникаю в работу указателей и памяти,...

Передача параметра в функцию
Столкнулся с муторной проблемой передачи параметра в функцию. Суть задания такая, что нужно...

Передача параметра функции
Подскажите пожалуйста каким образом передавать уже явные параметры CreateRectRgn в параметры BitBlt...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru