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

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

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

Author24 — интернет-сервис помощи студентам
имеется код:
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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.02.2016, 15:25
Ответы с готовыми решениями:

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

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

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

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

31
Эксперт С++
3701 / 2835 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 22
19.02.2016, 20:37 2
да вроде всё работает
Инжектор dll, не выполняется вызов MessageBox


инжектор
Кликните здесь для просмотра всего текста
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 3
Amir_05_05, MessageBox вызывать в DllMain не рекомендуется.
1
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
19.02.2016, 21:00  [ТС] 4
а у меня почему-то не робит
0
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
19.02.2016, 21:03  [ТС] 5
только вот CrackMe это просто к примеру написал,а так я инжектил в другие процессы,например в эту прогу:c.rar
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
19.02.2016, 21:13 6
Цитата Сообщение от 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 7
Цитата Сообщение от Amir_05_05 Посмотреть сообщение
DWORD c;
А вот это что за переменная. Вы её не чем не инициализируете. Т.е. в ней мусор передается функции CreateRemoteThread:
Цитата Сообщение от Amir_05_05 Посмотреть сообщение
CreateRemoteThread(process,NULL,c,(LPTHREAD_START_ROUTINE)a,b,c,NULL);
1
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
19.02.2016, 21:17  [ТС] 8
ок, щас понаставлю проверок

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

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

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

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


Цитата Сообщение от Izual Посмотреть сообщение
Вообще то так и должно быть, а все выходы каше-функций должны проверяться на правильность, если не правильно - return false.
Согласен, но мой пример о другом.
1
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
20.02.2016, 22:16  [ТС] 17
Цитата Сообщение от jupman Посмотреть сообщение
Amir_05_05, а если на другой программе инжект испытать тоже вылетает?
испытал на другой,тоже вылетает
0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
20.02.2016, 22:19 18
Amir_05_05, Ну значит код показывайте.
0
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
21.02.2016, 12:09  [ТС] 19
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 20
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
21.02.2016, 13:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.02.2016, 13:24
Помогаю со студенческими работами здесь

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

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

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

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


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

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