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

Инжектор dll, не выполняется вызов MessageBox

19.02.2016, 15:25. Показов 3505. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
имеется код:
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
#include <windows.h>
#include <TlHelp32.h>
#include <iostream>
using namespace std;
DWORD func(const char *ProcessName){
    DWORD ProcessId=0;
    PROCESSENTRY32 process;
    HANDLE Snapsot;
    Snapsot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    process.dwSize = sizeof(PROCESSENTRY32);
    if(Process32First(Snapsot,&process)){
        while(Process32Next(Snapsot,&process)){
            if(!strcmp(process.szExeFile,ProcessName)){
                ProcessId=process.th32ProcessID;
                break;
            }
        }
    }
    CloseHandle(Snapsot);
    return ProcessId;
}
bool inject(DWORD ProcessId,const char *dllName){
    HANDLE process;
    LPVOID a;
    LPVOID b;
    DWORD c;
    process=OpenProcess(PROCESS_ALL_ACCESS,false,ProcessId);
    if(process==NULL)return false;
    a=(LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA");
    if(a=NULL)return false;
    b=(LPVOID)VirtualAllocEx(process,NULL,strlen(dllName),MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
    WriteProcessMemory(process,b,dllName,strlen(dllName),NULL);
    CreateRemoteThread(process,NULL,c,(LPTHREAD_START_ROUTINE)a,b,c,NULL);
    CloseHandle(process);
    return true;
}
int main(){
    cout<<inject(func("CrackMe.exe"),"dll.dll");
    system("pause");
}
и собственно dll:
C++
1
2
3
4
5
6
7
8
9
10
11
#include<windows.h>
#define DllExport extern"C" __declspec(dllexport)
DWORD APIENTRY DllMain(HMODULE hinstDLL,DWORD fdwReason,LPVOID lpvReserved){
    switch (fdwReason){
        case DLL_PROCESS_ATTACH:{
            MessageBox(NULL, "Inject!", "Inject!", MB_ICONERROR);
            break;
            }
    }
    return true;
}
программа выводит true(функция inject),но в CrackMe.exe MessageBox не выполняется.
Где ошибка?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.02.2016, 15:25
Ответы с готовыми решениями:

Перехват MessageBox в dll
Недавно нашёл исходник dll перехватывающей ф-цию MessageBoxW: #include &lt;Windows.h&gt; #include &lt;string&gt; #define SIZE 6 typedef...

Инжектор dll
Всем привет, помогите пожалуйста с инжектором. Суть такая инжектор инжектит dll в игру, но сама dll не работает мне нужно чтобы dll...

Инжектор DLL
Напишите пожалуйста простой инжектор DLL для Windows Form(Проект оконное приложение) Наподобие вот...

31
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
19.02.2016, 20:37
да вроде всё работает


инжектор
Кликните здесь для просмотра всего текста
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
#include <Windows.h>
 
HANDLE hProc = 0;
 
PROCESS_INFORMATION StartProcess(char *AppName)
{
    PROCESS_INFORMATION procInfo;
    STARTUPINFO startInfo;
    memset(&procInfo, 0, sizeof(procInfo));
    memset(&startInfo, 0, sizeof(startInfo));
    startInfo.cb = sizeof(startInfo);
 
    char temp[MAX_PATH];
    CreateProcess(AppName, temp, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &startInfo, &procInfo);
 
    return procInfo;
}
 
bool Inject(DWORD pID, char *path)
{
    LPVOID RemoteString;
    LPVOID LoadLibAddr;
    if (pID == 0)
        return false;
    if (hProc == 0)
        return false;
    LoadLibAddr = GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
    RemoteString = VirtualAllocEx(hProc, NULL, strlen(path), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(hProc, RemoteString, path, strlen(path), NULL);
    CreateRemoteThread(hProc, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddr, RemoteString, NULL, NULL);
    CloseHandle(hProc);
    return true;
}
 
int CALLBACK WinMain(_In_ HINSTANCE hInstance, _In_ HINSTANCE hPrevInstance,
    _In_ LPSTR lpCmdLine, _In_ int nCmdShow)
{
    PROCESS_INFORMATION procInfo = StartProcess("CrackMe.exe");
    hProc = procInfo.hProcess;
    Inject(procInfo.dwProcessId, "dll.dll");
 
    return 0;
}


dll
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <Windows.h>
 
BOOL WINAPI DllMain(_In_ HINSTANCE hinstDLL, _In_ DWORD fdwReason, _In_ LPVOID lpvReserved)
{
    switch (fdwReason)
    {
    case DLL_PROCESS_ATTACH:
        MessageBox(NULL, "Inject!", "Inject!", MB_ICONERROR);
        break;
    }
 
    return TRUE;
}


CrackMe
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
#include <Windows.h>
 
int CALLBACK WinMain(_In_ HINSTANCE hInstance, _In_ HINSTANCE hPrevInstance,
    _In_ LPSTR lpCmdLine, _In_ int nCmdShow)
{
    MessageBox(NULL, "Text", "Caption", MB_OK);
 
    return 0;
}
1
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
19.02.2016, 20:59
Amir_05_05, MessageBox вызывать в DllMain не рекомендуется.
1
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
19.02.2016, 21:00  [ТС]
а у меня почему-то не робит
0
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
19.02.2016, 21:03  [ТС]
только вот CrackMe это просто к примеру написал,а так я инжектил в другие процессы,например в эту прогу:c.rar
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
19.02.2016, 21:13
Цитата Сообщение от Amir_05_05 Посмотреть сообщение
Где ошибка?
"c" не инициализирована.
VirtualAllocEx - не проверяется возвращаемое значение.
WriteProcessMemory - не проверяется возвращаемое значение.
CreateRemoteThread - не проверяется возвращаемое значение.
То же самое, что написать так:
C++
1
2
3
4
5
6
7
8
bool SomeFunction()
{
    //
    // Тут всякая каша, тонны функций.
    //
 
    return true;
}
а потом удивляться, что функция возвращает true, но ничего не работает.

Еще есть замаскированный баг - в выделяемой памяти не резервируется
место под завершающий 0 строки с именем dll.
2
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
19.02.2016, 21:15
Цитата Сообщение от Amir_05_05 Посмотреть сообщение
DWORD c;
А вот это что за переменная. Вы её не чем не инициализируете. Т.е. в ней мусор передается функции CreateRemoteThread:
Цитата Сообщение от Amir_05_05 Посмотреть сообщение
CreateRemoteThread(process,NULL,c,(LPTHR EAD_START_ROUTINE)a,b,c,NULL);
1
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
19.02.2016, 21:17  [ТС]
ок, щас понаставлю проверок

Добавлено через 1 минуту
Цитата Сообщение от jupman Посмотреть сообщение
А вот это что за переменная
если указать в функции CreateRemoteThread вместо "c" -NULL,то компилятор выдаёт предупреждение
0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
19.02.2016, 21:39
Amir_05_05, поменяйте на 0, там тип параметров DWORD'ы

Добавлено через 2 минуты
Цитата Сообщение от Убежденный Посмотреть сообщение
bool SomeFunction() { // // Тут всякая каша, тонны функций. // return true; }
лооооол

Добавлено через 16 минут
Amir_05_05, Помимо возвращаемого значения нужно получать код ошибки (GetLastError) в случае если функция потерпела неудачу. Заимейте себе такую привычку. И еще кстати добавлю что CreateRemoteThread возвращает хэндл потока и его тоже нужно закрывать.
1
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
19.02.2016, 21:52
jupman, кстати, да.
И если уже на то пошло, память, выделенная VirtualAllocEx, после того,
как поток отработает, тоже подлежит освобождению.
1
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
19.02.2016, 22:01
Убежденный, ну и тогда, ещё добавлю. Зачем PROCESS_ALL_ACCESS, достаточно PROCESS_VM_OPERATION|PROCESS_VM_WRITE|PR OCESS_CREATE_THREAD.
2
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
19.02.2016, 22:07  [ТС]
вот!прога в которую внедряю dll вылетает!(ещё вчера это заметил,но было поздно,думал спрошу вас сегодня,но забыл,только щас увидел при тесте.Сам в шоке от себя)

Добавлено через 2 минуты
ошибок не выдаёт,возвращает true,процесс убивает)
0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
19.02.2016, 22:43
Amir_05_05, а если на другой программе инжект испытать тоже вылетает?
0
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
19.02.2016, 22:44  [ТС]
Сегодня испытать уже не получится, давайте завтра продолжим)
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
20.02.2016, 04:17
Цитата Сообщение от Убежденный Посмотреть сообщение
То же самое, что написать так:
C++
1
2
3
4
5
6
7
bool SomeFunction()
{
 //
 // Тут всякая каша, тонны функций.
 //
return true;
}
а потом удивляться, что функция возвращает true, но ничего не работает.
Вообще то так и должно быть, а все выходы каше-функций должны проверяться на правильность, если не правильно - return false.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
20.02.2016, 08:29
Цитата Сообщение от jupman Посмотреть сообщение
Зачем PROCESS_ALL_ACCESS, достаточно PROCESS_VM_OPERATION|PROCESS_VM_WRITE|PR OCESS_CREATE_THREAD.
Ну и тогда уже, до кучи, перед OpenProcess попробовать включить привилегию отладки.
Это на случай, если целевой процесс запущен из-под другой учетки или имеет
специально настроенный DACL, запрещающий открывать его.


Цитата Сообщение от Izual Посмотреть сообщение
Вообще то так и должно быть, а все выходы каше-функций должны проверяться на правильность, если не правильно - return false.
Согласен, но мой пример о другом.
1
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
20.02.2016, 22:16  [ТС]
Цитата Сообщение от jupman Посмотреть сообщение
Amir_05_05, а если на другой программе инжект испытать тоже вылетает?
испытал на другой,тоже вылетает
0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
20.02.2016, 22:19
Amir_05_05, Ну значит код показывайте.
0
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
21.02.2016, 12:09  [ТС]
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
#include <windows.h>
#include <TlHelp32.h>
#include <iostream>
using namespace std;
DWORD func(const char *ProcessName){
    DWORD ProcessId=0;
    PROCESSENTRY32 process;
    HANDLE Snapsot;
    Snapsot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    process.dwSize = sizeof(PROCESSENTRY32);
    if(Process32First(Snapsot,&process)){
        while(Process32Next(Snapsot,&process)){
            if(!strcmp(process.szExeFile,ProcessName)){
                ProcessId=process.th32ProcessID;
                break;
            }
        }
    }
    CloseHandle(Snapsot);
    return ProcessId;
}
bool inject(DWORD ProcessId,const char *dllName){
    HANDLE process;
    LPVOID a;
    LPVOID b;
    process=OpenProcess(PROCESS_ALL_ACCESS,false,ProcessId);
    if(process==NULL)return false;
    a=(LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA");
    if(a=NULL)return false;
    b=(LPVOID)VirtualAllocEx(process,NULL,strlen(dllName),MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
    if(!WriteProcessMemory(process,b,dllName,strlen(dllName),NULL)){
        cout<<"error:"<<GetLastError();
        return false;
    }
    if(!CreateRemoteThread(process,NULL,0,(LPTHREAD_START_ROUTINE)a,b,0,NULL)){
        cout<<"error:"<<GetLastError();
        return false;
    }
    CloseHandle(process);
    return true;
}
int main(){
    cout<<inject(func("Crackme01.exe"),"dll.dll");
    system("pause");
}
Добавлено через 39 секунд
dll:
C++
1
2
3
4
5
6
7
8
9
10
11
#include<windows.h>
#define DllExport extern"C" __declspec(dllexport)
DWORD APIENTRY DllMain(HMODULE hinstDLL,DWORD fdwReason,LPVOID lpvReserved){
    switch (fdwReason){
        case DLL_PROCESS_ATTACH:{
            MessageBox(NULL, "Inject!", "Inject!", MB_ICONERROR);
            break;
            }
    }
    return true;
}
0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
21.02.2016, 13:24
Amir_05_05, основная ошибка:
C
1
if(a=NULL)return false;
заменить на:
C
1
if(a==NULL)return false;
т.е. получается вы по нулевому адресу поток запускаете, вот прога и падает.

Добавлено через 11 минут
Ни и вы практически так ничего и не поправили в коде, о чем вам здесь говорили.

Добавлено через 1 минуту
Кстати, раз уж передаете не полный путь, то имейте ввиду: Dynamic-Link Library Search Order
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.02.2016, 13:24
Помогаю со студенческими работами здесь

Как создать инжектор Dll в exe
Хочу сделать такой инжэктор: Помогите.... Скачайте, расмотрите, И помогите... Пожалуйста!!

При использовании самописного DLL-инжектора программа(не инжектор) вылетает
Хелп! Я решил написать dll инжекторЗачем? Ну... Я один из разработчиков игры в стиле &quot;Реалистичный симулятор хакера&quot;(Сейчас...

Не выполняется без MessageBox::Show()
Уже не в первый раз замечаю, что в некоторых случаях MessageBox &quot;заставляет&quot; работать код: вывожу видео с камеры в форму, если есть...

Вызов MessageBox в цикле
Всем привет! Вопрос конечно смешной... но как сделать чтоб при нажатии на ОК в messagebox появлялся другой messagebox потом 3-й, 4-й.... и...

Вызов messagebox в функции
Добрый день, такой вопрос , есть функция которая выполняет ряд задач а в конце должна выдать messagebox с результатом. Только когда мы...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
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 Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru