С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
4 / 4 / 1
Регистрация: 23.01.2015
Сообщений: 330

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

12.08.2017, 22:34. Показов 1594. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.08.2017, 22:34
Ответы с готовыми решениями:

Передача процессу функции внедрения длл через другую длл (Очень сложно и не понятно)
Допустим у меня есть dll1.dll и 2 процесса game.exe и calc.exe, мне нужно написать длл т.е. dll2.dll, которая будет внедрятся в calc.exe и...

Подгрузка мануал мапом длл из другой длл
Помогите, у меня есть процесс который подгружает в себя 1 бесполезную длл которая никак не влияет на работу этого процесса назовем ее...

Передача ссылки в функцию из длл С++
Здравствуйте!!! Нужна помощь. В общем есть ДЛЛ написанная мною на плюсах в VS 2005,она подключается к проекту на vb 6.0. Сейчас все...

19
322 / 174 / 78
Регистрация: 09.10.2014
Сообщений: 809
13.08.2017, 02:14
Тут глянь
0
4 / 4 / 1
Регистрация: 23.01.2015
Сообщений: 330
13.08.2017, 12:02  [ТС]
А парочка примеров кода не у кого не найдётся? Допустим надо передать переменную sring всем моим моим инжектированным dll. Как это реализовать?
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
13.08.2017, 17:21
Делай отдельно сервис, который будет решать это доверенное или не доверенное приложение.
Псевдо кодом примерно так
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
4 / 4 / 1
Регистрация: 23.01.2015
Сообщений: 330
13.08.2017, 21:38  [ТС]
Цитата Сообщение от ISergey Посмотреть сообщение
Делай отдельно сервис, который будет решать это доверенное или не доверенное приложение.
Псевдо кодом примерно так
Спасибо за пример кода, но я сервисы ни разу не создавал, по этому попрошу немного по-точнее: Нужен код в Gui приложении, который будет передавать одну строку сервису, соответственно код в сервисе, который "обрабатывает" эту строку и делает её доступной для всех длл. И наконец код для длл, который будет считывать эту строку, а обработчик я сам напишу(как я собираюсь передавать список процессов в строке: calc.exe;taskmgr.exe.

А вообще идея с сервисом хорошая, но мне-бы по-подробнее.
0
4 / 4 / 1
Регистрация: 23.01.2015
Сообщений: 330
13.08.2017, 21:41  [ТС]
Возникла серьёзная проблема... у меня нет шаблона создания сервиса на C++... Только на C# и Vb.net...
Миниатюры
Передача данных инжектированной длл  
0
4 / 4 / 1
Регистрация: 23.01.2015
Сообщений: 330
13.08.2017, 21:45  [ТС]
Возможно ли делать примерно тоже самое, только что-бы служба на C#, а dll и GUI на c++? Что-то мне подсказывает, что можно, поэтому - как?
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
13.08.2017, 21:54
Цитата Сообщение от Zagadohnik37 Посмотреть сообщение
Возникла серьёзная проблема... у меня нет шаблона создания сервиса на C++..
Я никогда и не слышал о таких шаблонах)))
Вот пример на msdn
https://msdn.microsoft.com/ru-... s.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
4 / 4 / 1
Регистрация: 23.01.2015
Сообщений: 330
13.08.2017, 23:07  [ТС]
ISergey, Этот код конечно хороший, но может можно как-нибудь по-проще? Да и вообще, какой это тип проекта(шаблон), в смысле как его создать?
Может всё же использовать уже готовое, только разве что на C#?
Тогда может напишите мне примерчик обмена строкой между GUI и dll через сервис? А то без примера я наврятли чего-то напишу...
0
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
14.08.2017, 00:22
Можешь консоль выбрать, тип проекта в 31-й строке.
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
14.08.2017, 10:03
Цитата Сообщение от 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
4 / 4 / 1
Регистрация: 23.01.2015
Сообщений: 330
14.08.2017, 17:09  [ТС]
Так у меня уже есть код в длл, который это всё проверяет:
Кликните здесь для просмотра всего текста
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_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
15.08.2017, 13:21
Цитата Сообщение от Zagadohnik37 Посмотреть сообщение
Мне нужно из GIU передать инжектированной в несколько(а может и в один) процессов dll вот эту строку: std::string plist = "calc.exe;taskmgr.exe;";
так не проще в самой dll сделать бесконечный цикл на проверку наличия этих процессов?
как только процесс найден и получен его хендл, прерывайте цикл.
0
4 / 4 / 1
Регистрация: 23.01.2015
Сообщений: 330
15.08.2017, 13:38  [ТС]
Цитата Сообщение от _lunar_ Посмотреть сообщение
так не проще в самой dll сделать бесконечный цикл на проверку наличия этих процессов?
Снова объясняю: Мне нужно, что-бы из GUI программы можно было передать эту строку дллке, которая будет "защищать" этот "список" процессов! В GUI можно будет изменить этот список!.
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
15.08.2017, 14:04
Цитата Сообщение от Zagadohnik37 Посмотреть сообщение
Снова объясняю
мне не нужно объяснять,я и так понял чего вы хотите.
я предложил простейшее решение, хотите заморачиваться с передачей через приложение дело ваше.
0
4 / 4 / 1
Регистрация: 23.01.2015
Сообщений: 330
15.08.2017, 16:49  [ТС]
Цитата Сообщение от _lunar_ Посмотреть сообщение
хотите заморачиваться с передачей через приложение дело ваше
Дело-то моё, но может поможете это реализовать? Насколько я понял, это лучше реализовывать через CreateNamedPipe...
Не подкините примерчик, для моей задачи?

Добавлено через 2 часа 32 минуты
Ну так мне помогут это реализовать?
0
322 / 174 / 78
Регистрация: 09.10.2014
Сообщений: 809
15.08.2017, 16:53
Велосипед уже сделали за вас
0
4 / 4 / 1
Регистрация: 23.01.2015
Сообщений: 330
15.08.2017, 19:38  [ТС]
Цитата Сообщение от lArtl Посмотреть сообщение
Велосипед уже сделали за вас
Я там вижу только кучу ссылок...
0
322 / 174 / 78
Регистрация: 09.10.2014
Сообщений: 809
15.08.2017, 23:26
Это печально
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
16.08.2017, 00:56
Цитата Сообщение от _lunar_ Посмотреть сообщение
так не проще в самой dll сделать бесконечный цикл на проверку наличия этих процессов?
Нет не проще, только по той причине что шанс завалить приложение быстро растет с лишним кодом.
Цитата Сообщение от Zagadohnik37 Посмотреть сообщение
Снова объясняю: Мне нужно, что-бы из GUI программы можно было передать эту строку дллке, которая будет "защищать" этот "список" процессов! В GUI можно будет изменить этот список!.
Я вам дал пример, как это сделать. хоть в сервисе хоть в консоли или gui суть не меняется. Здесь Передача данных инжектированной длл где я написал "гдето в сервисе" можно сделать и в gui.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.08.2017, 00:56
Помогаю со студенческими работами здесь

Вызов процедуры из инжектированной DLL
Приветствую. Имеется игра с именем MP.exe Имеется DLL, написанная на Си. Известно имя процедуры внутри DLL (Test) Имеется рабочий...

CDialogEx + dll, После завершения модального диалога (CDialogEx) из длл-библиотеки работа длл-библиотеки прерывается
Добрый день, подскажите, пожалуйста, новичку с++/mfc. Работаю в VS 2010. Есть необходимость разработки длл-библиотеки, которая в своём...

Передача ссылки в конструктор (передача данных между формами)
Из темы &quot;Ответы на 7 самых частых вопроса по WinForms&quot; Реализовал метод № 2.3 без проблем, а вот 2.4 не получается( вот текст из той...

передача json данных с внешнего сервера через клиент в базу данных
Доброго времени суток. Времени до завтра мало, а который день бьюсь уже, новичок в этом деле. Имеется внешний сервер с json данными,...

Передача данных по Анонимным (Неименованым) каналам с последующим использованием этих данных
Всем доброго времени суток. Нужна помощь: Имеется Сервер и Клиент связанные анонимным каналом. Через анонимный канал нужно передать 4...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru