Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Zagadohnik37
0 / 0 / 1
Регистрация: 23.01.2015
Сообщений: 307
1

Передача данных инжектированной длл

12.08.2017, 22:34. Просмотров 625. Ответов 19

Есть длл, которая при помощи программы инжектится в несколько процессов и что-то там перехватывает, в моём случае openprocess. Нужно как-то передать ей список процессов, которые надо "защитить". Можете посоветовать, как лучше всего это реализовать.
Вот ф-ция, подменяющая оригинальный openprocess:
C++
1
2
3
4
5
6
7
8
9
10
11
HANDLE WINAPI DetourOpenProcess(DWORD dwDesiredAccess, BOOL  bInheritHandle, DWORD dwProcessId)
{
    if (IfProc) {
        return fpOpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);
    }
    else
    {
        SetLastError(ERROR_ACCESS_DENIED);
        return 0;
    }
}
Нужно сделать так, что-бы из программы можно было передать список процессов всем dll, и когда у них вызывалась ф-ция ifProc ,то проверялось, не процесс ли из списка хотят завершить. В длл должны передаваться только имена процессов.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2017, 22:34
Ответы с готовыми решениями:

импорт длл
Дoбрый вeчeр! Дайтe рабoчий примeр пoжалуйcта c иcпoльзoваниeм dllimport,...

Создать длл
Создал проект Win32Project потом выбрал в Application Setting > Application...

загрузка ДЛЛ
Помогите пожалуйста , надо сделать прогу которая создаёт кнопку по названию dll...

Использование длл
Добрый день! Помогите пожалуйста! Нужно: Сoздaть DLL, в кoтoрoй cдeлaть...

Инжект треда из самой длл
Можно ли проинжектить поток из вызываемой dll? В игре можно вызвать функцию из...

19
lArtl
236 / 114 / 50
Регистрация: 09.10.2014
Сообщений: 619
Завершенные тесты: 3
13.08.2017, 02:14 2
Тут глянь
0
Zagadohnik37
0 / 0 / 1
Регистрация: 23.01.2015
Сообщений: 307
13.08.2017, 12:02  [ТС] 3
А парочка примеров кода не у кого не найдётся? Допустим надо передать переменную sring всем моим моим инжектированным dll. Как это реализовать?
0
ISergey
Maniac
Эксперт С++
1414 / 924 / 149
Регистрация: 02.01.2009
Сообщений: 2,754
Записей в блоге: 1
13.08.2017, 17:21 4
Делай отдельно сервис, который будет решать это доверенное или не доверенное приложение.
Псевдо кодом примерно так
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
HANDLE WINAPI DetourOpenProcess(DWORD dwDesiredAccess, BOOL  bInheritHandle, DWORD dwProcessId)
{
    GetProcessNameFromPid(dwProcessId, lpPipeBufferWrite);
    
    WaitForSingleObject(hLocalMutex, INFINITE);
    
    if( CallNamedPipeW( lpNamePipe, lpPipeBufferWrite, BUFFER_SIZE, 
                lpPipeBufferRead, BUFFER_SIZE, 
                &BytesRead, NMPWAIT_NOWAIT) == FALSE )
            {
                // По какойто причине обломались или сервис молчит, чтобы ниче не зависло не вмешиваемся в работу
                ReleaseMutex(hLocalMutex);
                return fpOpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);
            }
    
    if( !wcscmp(lpPipeBufferRead, L"STATUS_UNSUCCESSFUL") ) 
            {
                //Сервис ответил что нужно блокировать
                
                ReleaseMutex(hLocalMutex);
                SetLastError(ERROR_ACCESS_DENIED);
                return 0;
            }
    // сервис не обломался, не дал ответ что нужно было блокировать или вовсе мусор прилетел
    // то не вмешиваемся в работу.
    ReleaseMutex(hLocalMutex);
 
    return fpOpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);     
    
}

Гдето в сервисе


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
    ghNamedPipe = CreateNamedPipeW(
        lpNamePipe,
        PIPE_ACCESS_DUPLEX,
        PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
        PIPE_UNLIMITED_INSTANCES,
        BUFFER_SIZE, BUFFER_SIZE, 5000, NULL);
 
    while( gServiceRunning ) 
    {
        if(ConnectNamedPipe(ghNamedPipe, NULL) == NULL) {
            break;
        }
 
        DWORD cbRead = 0;
 
        if(ReadFile(ghNamedPipe, lpPipeBufferRead, BUFFER_SIZE, &cbRead, NULL))
        {   
            //По умолчанию разрешаем работу
            wcscpy(lpPipeBufferWrite, L"STATUS_SUCCESSFUL");
            for(i = 0; i < Index; ++i)
                {
                    if(wcsstr(lpPipeBufferRead, szProcess[i]) != NULL) // Процесс в черном списке
                    {   
                        // Говорим что нужно блокировать
                        wcscpy(lpPipeBufferWrite, L"STATUS_UNSUCCESSFUL");
                        break;
                    }
                }
 
            даем ответ
            WriteFile(ghNamedPipe, lpPipeBufferWrite,BUFFER_SIZE, &cbRead, NULL);
        }
 
        DisconnectNamedPipe(ghNamedPipe);
    }
 
    CloseHandle(ghNamedPipe);
0
Zagadohnik37
0 / 0 / 1
Регистрация: 23.01.2015
Сообщений: 307
13.08.2017, 21:38  [ТС] 5
Цитата Сообщение от ISergey Посмотреть сообщение
Делай отдельно сервис, который будет решать это доверенное или не доверенное приложение.
Псевдо кодом примерно так
Спасибо за пример кода, но я сервисы ни разу не создавал, по этому попрошу немного по-точнее: Нужен код в Gui приложении, который будет передавать одну строку сервису, соответственно код в сервисе, который "обрабатывает" эту строку и делает её доступной для всех длл. И наконец код для длл, который будет считывать эту строку, а обработчик я сам напишу(как я собираюсь передавать список процессов в строке: calc.exe;taskmgr.exe.

А вообще идея с сервисом хорошая, но мне-бы по-подробнее.
0
Zagadohnik37
0 / 0 / 1
Регистрация: 23.01.2015
Сообщений: 307
13.08.2017, 21:41  [ТС] 6
Возникла серьёзная проблема... у меня нет шаблона создания сервиса на C++... Только на C# и Vb.net...
0
Миниатюры
Передача данных инжектированной длл  
Zagadohnik37
0 / 0 / 1
Регистрация: 23.01.2015
Сообщений: 307
13.08.2017, 21:45  [ТС] 7
Возможно ли делать примерно тоже самое, только что-бы служба на C#, а dll и GUI на c++? Что-то мне подсказывает, что можно, поэтому - как?
0
ISergey
Maniac
Эксперт С++
1414 / 924 / 149
Регистрация: 02.01.2009
Сообщений: 2,754
Записей в блоге: 1
13.08.2017, 21:54 8
Цитата Сообщение от Zagadohnik37 Посмотреть сообщение
Возникла серьёзная проблема... у меня нет шаблона создания сервиса на C++..
Я никогда и не слышал о таких шаблонах)))
Вот пример на msdn
https://msdn.microsoft.com/ru-ru/lib...(v=vs.85).aspx

Я както так давным давным давно делал:

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
158
159
160
161
162
#include <windows.h>
#include <tchar.h>
 
#include <iostream>
 
#pragma comment(lib, "Setupapi.lib")
#pragma comment(lib, "advapi32.lib")
 
#define SVCNAME TEXT("LPSvc")
 
SERVICE_STATUS          gSvcStatus; 
SERVICE_STATUS_HANDLE   gSvcStatusHandle; 
volatile HANDLE         ghSvcStopEvent = NULL;
 
//volatile HANDLE           ghNamedPipe;
volatile HANDLE         ghServicecThread;
volatile BOOL           gServiceRunning;
 
 
 
VOID WINAPI SvcCtrlHandler( DWORD ); 
VOID WINAPI SvcMain( DWORD, LPTSTR * ); 
VOID ReportSvcStatus( DWORD dwCurrentState,
    DWORD dwWin32ExitCode,
    DWORD dwWaitHint);
DWORD ServiceExecutionThread( LPDWORD lpParam );
 
 
 
 
int __cdecl main(int argc, char *argv[]) 
{ 
 
    SERVICE_TABLE_ENTRY DispatchTable[] = 
    { 
        { SVCNAME, (LPSERVICE_MAIN_FUNCTION) SvcMain }, 
        { NULL, NULL } 
    }; 
 
 
    if (!StartServiceCtrlDispatcher( DispatchTable )) 
    { 
        printf("StartServiceCtrlDispatcher fail\n");
        return 0;
    } 
 
    return 0;
} 
 
 
VOID WINAPI SvcMain( DWORD dwArgc, LPTSTR *lpszArgv )
{
    
    gSvcStatusHandle = RegisterServiceCtrlHandler( 
        SVCNAME, 
        SvcCtrlHandler);
 
    if( !gSvcStatusHandle ) { 
        OutputDebugString(TEXT("LPSrv error -> RegisterServiceCtrlHandler"));
        return; 
    } 
 
    gSvcStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; 
    gSvcStatus.dwServiceSpecificExitCode = 0;    
    ReportSvcStatus( SERVICE_START_PENDING, NO_ERROR, 3000 );
 
 
 
    ghSvcStopEvent = CreateEvent( NULL, TRUE, FALSE, NULL);   
 
    if ( ghSvcStopEvent == NULL)
    {
        OutputDebugString(TEXT("LPSrv error -> CreateEvent"));
        ReportSvcStatus( SERVICE_STOPPED, NO_ERROR, 0 );
        return;
    }
 
 
    ReportSvcStatus( SERVICE_RUNNING, NO_ERROR, 0 );
 
    DWORD id;
 
    gServiceRunning = TRUE;
    ghServicecThread = CreateThread( 0, 0, 
        (LPTHREAD_START_ROUTINE) ServiceExecutionThread,
        0, 0, &id );
 
    if(ghServicecThread == NULL) {
        OutputDebugString(TEXT("LPSrv error -> CreateThread"));
        return;
    }
 
    WaitForSingleObject(ghSvcStopEvent, INFINITE);
    CloseHandle(ghServicecThread);
}
 
 
VOID ReportSvcStatus( DWORD dwCurrentState,
    DWORD dwWin32ExitCode,
    DWORD dwWaitHint)
{
    static DWORD dwCheckPoint = 1;
 
    gSvcStatus.dwCurrentState = dwCurrentState;
    gSvcStatus.dwWin32ExitCode = dwWin32ExitCode;
    gSvcStatus.dwWaitHint = dwWaitHint;
 
    if (dwCurrentState == SERVICE_START_PENDING)
        gSvcStatus.dwControlsAccepted = 0;
    else gSvcStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
 
    if ( (dwCurrentState == SERVICE_RUNNING) ||
        (dwCurrentState == SERVICE_STOPPED) )
        gSvcStatus.dwCheckPoint = 0;
    else gSvcStatus.dwCheckPoint = dwCheckPoint++;
 
    SetServiceStatus( gSvcStatusHandle, &gSvcStatus );
}
 
 
VOID WINAPI SvcCtrlHandler( DWORD dwCtrl )
{
    DWORD BytesRead; TCHAR buff[1];
 
    switch(dwCtrl) 
    {  
    case SERVICE_CONTROL_SHUTDOWN:
    case SERVICE_CONTROL_STOP: 
        OutputDebugString(TEXT("LPSrv SERVICE_CONTROL_STOP|SERVICE_CONTROL_SHUTDOWN"));
        ReportSvcStatus(SERVICE_STOP_PENDING, NO_ERROR, 5000);
 
        gServiceRunning = FALSE;
        
        ///CallNamedPipeW( lpNamePipe, buff, 0, buff, 0, &BytesRead, NMPWAIT_NOWAIT);
 
        SetEvent(ghSvcStopEvent);
        ReportSvcStatus(SERVICE_STOPPED, NO_ERROR, 0);
 
        break;
 
    case SERVICE_CONTROL_INTERROGATE: 
        break; 
 
    default: 
        break;
    } 
 
    if( SetServiceStatus( gSvcStatusHandle, &gSvcStatus ) == FALSE) {
        OutputDebugString(TEXT("LPSrv error -> SetServiceStatus"));
    }
 
}
 
DWORD ServiceExecutionThread( LPDWORD lpParam )
{
 
    while( gServiceRunning ) 
    {
        // Здесь нужный код сервиса
    }
    return 0;
}
0
Zagadohnik37
0 / 0 / 1
Регистрация: 23.01.2015
Сообщений: 307
13.08.2017, 23:07  [ТС] 9
ISergey, Этот код конечно хороший, но может можно как-нибудь по-проще? Да и вообще, какой это тип проекта(шаблон), в смысле как его создать?
Может всё же использовать уже готовое, только разве что на C#?
Тогда может напишите мне примерчик обмена строкой между GUI и dll через сервис? А то без примера я наврятли чего-то напишу...
0
Digit@ll
Brainsbreaker
888 / 366 / 51
Регистрация: 01.02.2011
Сообщений: 1,586
14.08.2017, 00:22 10
Можешь консоль выбрать, тип проекта в 31-й строке.
0
_lunar_
1452 / 1368 / 185
Регистрация: 03.05.2011
Сообщений: 3,184
Завершенные тесты: 1
14.08.2017, 10:03 11
Цитата Сообщение от Zagadohnik37 Посмотреть сообщение
Нужно как-то передать ей список процессов, которые надо "защитить".
процессы запущены или ещё нет?
в общем-то и не важно, перебираете ваш список по именам процессов, получаете handle и pID к примеру так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <TlHelp32.h>
 
HANDLE Snapshot;
HANDLE hProcess;
PROCESSENTRY32 Proc;
Proc.dwSize = sizeof(Proc);
Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
BOOL b = Process32First(Snapshot, &Proc);
while (b) {
    if (strcmp(Proc.szExeFile, "explorer.exe") == 0) {
        hProcess = OpenProcess(PROCESS_ALL_ACCESS, NULL, Proc.th32ProcessID);
        break;
    }
    b = Process32Next(Snapshot, &Proc);
}
имея хендл и идентификатор процесса "защищаете" его как вам надо.
0
Zagadohnik37
0 / 0 / 1
Регистрация: 23.01.2015
Сообщений: 307
14.08.2017, 17:09  [ТС] 12
Так у меня уже есть код в длл, который это всё проверяет:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
std::string plist = "calc.exe;taskmgr.exe;";
BOOLEAN IfProc(int PID)
{
    std::wstring add = L"";
    for (int i = 0; i < plist.size(); i++) {
        if (plist[i] != ';') {
            add += plist[i];
        }
        else {
            if (PID == FindProcessId(add)) { return false; }
            add = L"";
        }
    }
}
C++
1
2
3
4
5
6
7
8
9
10
11
HANDLE WINAPI DetourOpenProcess(DWORD dwDesiredAccess, BOOL  bInheritHandle, DWORD dwProcessId)
{
    if (IfProc(dwProcessId) == true) {
        return fpOpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);
    }
    else
    {
        SetLastError(ERROR_ACCESS_DENIED);
        return 0;
    }
}
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
DWORD FindProcessId(const std::wstring& processName)
{
    PROCESSENTRY32 processInfo;
    processInfo.dwSize = sizeof(processInfo);
 
    HANDLE processesSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if (processesSnapshot == INVALID_HANDLE_VALUE)
        return 0;
 
    Process32First(processesSnapshot, &processInfo);
    if (!processName.compare(processInfo.szExeFile))
    {
        CloseHandle(processesSnapshot);
        return processInfo.th32ProcessID;
    }
 
    while (Process32Next(processesSnapshot, &processInfo))
    {
        if (!processName.compare(processInfo.szExeFile))
        {
            CloseHandle(processesSnapshot);
            return processInfo.th32ProcessID;
        }
    }
 
     CloseHandle(processesSnapshot);
    return 0;
}

Мне нужно из GIU передать инжектированной в несколько(а может и в один) процессов dll вот эту строку: std::string plist = "calc.exe;taskmgr.exe;";

Добавлено через 77 минут
Кстати, почему из-за этой ф-ции после инжекта в процесс у него резко поднимается цп?:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
std::string plist = "calc.exe;taskmgr.exe;";
BOOLEAN IfProc(int PID)
{
    //return true;
    std::wstring add = L"";
    for (int i = 0; i < plist.size(); i++) {
        if (plist[i] != ';') {
            add += plist[i];
        }
        else {
            if (PID == FindProcessId(add)) { return false; }
            add = L"";
        }
    }
}
Если же я оставлю return true; в начале, то всё нормально, но ф-ция не работает...

Добавлено через 23 минуты
Стоп, я что-то слупил... return ведь кроме того, что возвращает значение, он ещё и прерывает ф-цию?..
0
_lunar_
1452 / 1368 / 185
Регистрация: 03.05.2011
Сообщений: 3,184
Завершенные тесты: 1
15.08.2017, 13:21 13
Цитата Сообщение от Zagadohnik37 Посмотреть сообщение
Мне нужно из GIU передать инжектированной в несколько(а может и в один) процессов dll вот эту строку: std::string plist = "calc.exe;taskmgr.exe;";
так не проще в самой dll сделать бесконечный цикл на проверку наличия этих процессов?
как только процесс найден и получен его хендл, прерывайте цикл.
0
Zagadohnik37
0 / 0 / 1
Регистрация: 23.01.2015
Сообщений: 307
15.08.2017, 13:38  [ТС] 14
Цитата Сообщение от _lunar_ Посмотреть сообщение
так не проще в самой dll сделать бесконечный цикл на проверку наличия этих процессов?
Снова объясняю: Мне нужно, что-бы из GUI программы можно было передать эту строку дллке, которая будет "защищать" этот "список" процессов! В GUI можно будет изменить этот список!.
0
_lunar_
1452 / 1368 / 185
Регистрация: 03.05.2011
Сообщений: 3,184
Завершенные тесты: 1
15.08.2017, 14:04 15
Цитата Сообщение от Zagadohnik37 Посмотреть сообщение
Снова объясняю
мне не нужно объяснять,я и так понял чего вы хотите.
я предложил простейшее решение, хотите заморачиваться с передачей через приложение дело ваше.
0
Zagadohnik37
0 / 0 / 1
Регистрация: 23.01.2015
Сообщений: 307
15.08.2017, 16:49  [ТС] 16
Цитата Сообщение от _lunar_ Посмотреть сообщение
хотите заморачиваться с передачей через приложение дело ваше
Дело-то моё, но может поможете это реализовать? Насколько я понял, это лучше реализовывать через CreateNamedPipe...
Не подкините примерчик, для моей задачи?

Добавлено через 2 часа 32 минуты
Ну так мне помогут это реализовать?
0
lArtl
236 / 114 / 50
Регистрация: 09.10.2014
Сообщений: 619
Завершенные тесты: 3
15.08.2017, 16:53 17
Велосипед уже сделали за вас
0
Zagadohnik37
0 / 0 / 1
Регистрация: 23.01.2015
Сообщений: 307
15.08.2017, 19:38  [ТС] 18
Цитата Сообщение от lArtl Посмотреть сообщение
Велосипед уже сделали за вас
Я там вижу только кучу ссылок...
0
lArtl
236 / 114 / 50
Регистрация: 09.10.2014
Сообщений: 619
Завершенные тесты: 3
15.08.2017, 23:26 19
Это печально
0
ISergey
Maniac
Эксперт С++
1414 / 924 / 149
Регистрация: 02.01.2009
Сообщений: 2,754
Записей в блоге: 1
16.08.2017, 00:56 20
Цитата Сообщение от _lunar_ Посмотреть сообщение
так не проще в самой dll сделать бесконечный цикл на проверку наличия этих процессов?
Нет не проще, только по той причине что шанс завалить приложение быстро растет с лишним кодом.
Цитата Сообщение от Zagadohnik37 Посмотреть сообщение
Снова объясняю: Мне нужно, что-бы из GUI программы можно было передать эту строку дллке, которая будет "защищать" этот "список" процессов! В GUI можно будет изменить этот список!.
Я вам дал пример, как это сделать. хоть в сервисе хоть в консоли или gui суть не меняется. Здесь Передача данных инжектированной длл где я написал "гдето в сервисе" можно сделать и в gui.
0
16.08.2017, 00:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.08.2017, 00:56

Модули(.длл) системных процессов
Всем доброго времени суток. Столкнулся с проблемой в выводе списка модулей...

Как получить атрибуты длл функции?
Как получить атрибуты длл функции? (GetFileAttributes) #include &lt;iostream&gt;...

Вопрос насчет использования длл в кейлогере
Хочу сделать так , что бы кейлогер представлял из себя 1 exe-шник. В чем...


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

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

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