Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.73
ZLOI
0 / 0 / 0
Регистрация: 17.05.2009
Сообщений: 7
#1

Кто-нибудь создаёт потоки как в MSDN? - C++

17.05.2009, 08:10. Просмотров 1842. Ответов 18
Метки нет (Все метки)

Приветствую, жизнь заставила писать на 2005м MVS и использовать MS SQL SERVER (требует ObjectARX).
Вообщем, раньше было какое-то предвзятое отношение, что C++ - это зло, но поработав с этим чудовищем недавно понял, что С++ - это и вправду зло.
Когда приходилось работать в Delphi, Java, PHP и даже ассемблере(MASM), то скорость разработки была гораздо выше.
Но раз некоторые утверждают, что С++ лучшее, что есть, то хочу проверить это, может быть я в чём-то ошибался.
Постановка задачи:
Для разработки программы "AntiCS", которую у меня попросили с кафедры, где я учусь в аспирантуре мне требуется разработать программный модуль запускаемый при загрузке Windows в виде скрытого процесса, который не виден в диспетчере задач и toolbar. Основная цель - уничтожение процессов hl.exe и czero.exe при их появлении в системе.
Впринципе, подобные программы я писал на Delphi за несколько минут, но есть желание быть универсалом и освоить С++, прошу Вашей помощи, потому что в процессе работы на С++ возникают разные маленькие проблемы, которые тормозят разработку, а в MSDN приходиться долго искать.
Итак вопрос:
Почему такая конструкция вызывает ошибку:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DWORD KillCS(void)
{
    MessageBeep(2);
    return 0;
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    DWORD dwThreadId;
    HANDLE hThread; 
            hThread = CreateThread( 
            NULL,              
            0,                 
            KillCS,        
            0,             
            0,                 
            &dwThreadId);
Ошибка звучит так:
cannot convert parameter 3 from 'DWORD (__cdecl *)(void)' to 'LPTHREAD_START_ROUTINE'
Но в то же самое время, такая конструкция проходит свободно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DWORD WINAPI KillCS(LPVOID lpParam)
{
    MessageBeep(2);
    return 0;
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    DWORD dwThreadId;
    HANDLE hThread; 
            hThread = CreateThread( 
            NULL,              
            0,                 
            KillCS,        
            0,             
            0,                 
            &dwThreadId);
Хотелось бы ещё комментариев, нормальна ли такая конструкция:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    HANDLE hSnapshot;
    PROCESSENTRY32 Entry;
    Entry.dwFlags = sizeof( PROCESSENTRY32 );
 
     // создаем моментальный снимок
    hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnapshot == INVALID_HANDLE_VALUE)
        return FALSE;
 
    // получаем информацию о первом процессе
    Entry.dwSize = sizeof(Entry);
    if (!Process32First(hSnapshot, &Entry))
        return FALSE;
 
    // перечисляем остальные процессы и уничтожаем неугодные
    do
    {    
        if ((wcscmp(Entry.szExeFile,L"czero.exe")==0)||(wcscmp(Entry.szExeFile,L"hl.exe")==0))
            TerminateProcess(OpenProcess(PROCESS_ALL_ACCESS,true,Entry.th32ProcessID),0);
    }
    while (Process32Next(hSnapshot, &Entry));
 
    CloseHandle(hSnapshot);
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2009, 08:10     Кто-нибудь создаёт потоки как в MSDN?
Посмотрите здесь:

C++ Кто нибудь подскажет просто как объявить динамический массив M на M (с буквой M, я не ошибся)
проверьте кто-нибудь C++
ну кто нибудь составит программу???????? C++
Подскажите кто-нибудь, как записать квадратную динамическую матрицу в файл??? C++
C++ кто нибудь знает?(про винмэйн)
C++ Кто-нибудь найдите ошибку в RSA кодировании!!!
C++ Кто-нибудь реализовывал класс множество?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6473 / 2248 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.05.2009, 09:21     Кто-нибудь создаёт потоки как в MSDN? #2
вот такая она функция...
DWORD WINAPI ThreadProc(
__in LPVOID lpParameter
);
Rififi
2336 / 1051 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
17.05.2009, 11:56     Кто-нибудь создаёт потоки как в MSDN? #3
ZLOI,
... Ошибка звучит так: ...
... Но в то же самое время, такая конструкция проходит свободно: ...

А по-твоему, это одно и то же?

DWORD KillCS(void)
DWORD WINAPI KillCS(LPVOID lpParam)

Хотелось бы ещё комментариев, нормальна ли такая конструкция:
будет работать нормально, если процесс не защищен дескриптором безопасности и/или драйвером
ZLOI
0 / 0 / 0
Регистрация: 17.05.2009
Сообщений: 7
17.05.2009, 15:45  [ТС]     Кто-нибудь создаёт потоки как в MSDN? #4
Цитата Сообщение от Rififi Посмотреть сообщение
А по-твоему, это одно и то же?

DWORD KillCS(void)
DWORD WINAPI KillCS(LPVOID lpParam)
Нет, но в качестве 3го параметра CreateThread я посылаю ссылку на подпрограмму, разве это гибко вставлять такие ограничения.
Зачем они нужны?
В Delphi всё равно функция это или процедура, с параметрами или без, кинул @KillCS и всё работает.
Цитата Сообщение от Rififi Посмотреть сообщение
будет работать нормально, если процесс не защищен дескриптором безопасности и/или драйвером
Обычно CS не защищён
Меня на самом деле удивляет то, что нельзя так
C++
1
if (Entry.szExeFile==L"czero.exe")
вместо
C++
1
if ((wcscmp(Entry.szExeFile,L"czero.exe")==0)||(wcscmp(Entry.szExeFile,L"hl.exe")==0))
Объясните почему не сравниваются строки? У него не перегружен ==?

Вообще, подскажете какие-нибудь готовые библиотеки для эффективной работы в MVS.
В линуксе я работал с QT3, не плохо получалось несмотря на убогость Kdeveloperа, помоему он так назывался.
Rififi
2336 / 1051 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
17.05.2009, 21:40     Кто-нибудь создаёт потоки как в MSDN? #5
ZLOI,
разве это гибко вставлять такие ограничения.
Зачем они нужны?

это называется жесткой типизацией.

Объясните почему не сравниваются строки?
потому что в C/C++ строк нет.
alex_x_x
бжни
2443 / 1648 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
17.05.2009, 22:04     Кто-нибудь создаёт потоки как в MSDN? #6
ZLOI, сделай явное преобразование
C++
1
2
3
4
5
6
7
hThread = CreateThread( 
            NULL,              
            0,                 
            (LPTHREAD_START_ROUTINE)KillCS,        
            0,             
            0,                 
            &dwThreadId);
C++
1
if(0==wcscmp(Entry.szExeFile,L"czero.exe"))
ZLOI
0 / 0 / 0
Регистрация: 17.05.2009
Сообщений: 7
18.05.2009, 05:52  [ТС]     Кто-нибудь создаёт потоки как в MSDN? #7
Цитата Сообщение от alex_x_x Посмотреть сообщение
ZLOI, сделай явное преобразование
C++
1
2
3
4
5
6
7
hThread = CreateThread( 
            NULL,              
            0,                 
            (LPTHREAD_START_ROUTINE)KillCS,        
            0,             
            0,                 
            &dwThreadId);
Спасибо, вчера тоже дошёл, работает.
Цитата Сообщение от alex_x_x Посмотреть сообщение
C++
1
if(0==wcscmp(Entry.szExeFile,L"czero.exe"))
Нет меня интересовало именно без функций дополнительных.
Взял и сравнил какую-нибудь "строку" с переменной.
Типа
C++
1
if (a=="Hello World?")
Добавлено через 3 минуты 34 секунды
Цитата Сообщение от Rififi Посмотреть сообщение
ZLOI,
разве это гибко вставлять такие ограничения.
Зачем они нужны?

это называется жесткой типизацией.
Чтобы код у всех был одинаковый?
Цитата Сообщение от Rififi Посмотреть сообщение
Объясните почему не сравниваются строки?
потому что в C/C++ строк нет.
Ну понято, что char* это ссылка, но на строку же... ну хорошо на массив символов
А массив символов называется строкой.

Добавлено через 13 минут 17 секунд
Кстати, программу написал, проверена в полевых условиях. Если хотите,
чтобы у Вас на работе не играли в Counter-Strike, то в тихушку пропишите в реестре по адресу
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Run новую строковую переменную с адресом программы, лучше конечно переделать под сетевую версию, но на моей кафедре так не получится, сервак постоянно выключен:
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
// ANTIHL.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>
#include <stdlib.h>
#include <cstdio>
#include <string.h>
#include <process.h>
#include <stddef.h>
#include <wincon.h>
 
void KillCS(void)
{
    while(1==1)
    {
    HANDLE hSnapshot;
    PROCESSENTRY32 Entry;
    Entry.dwFlags = sizeof( PROCESSENTRY32 );
 
     // создаем моментальный снимок
    hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    // получаем информацию о первом процессе
    Entry.dwSize = sizeof(Entry);
    // перечисляем остальные процессы и уничтожаем неугодные
    do
    {    
        if ((wcscmp(Entry.szExeFile,L"czero.exe")==0)||(wcscmp(Entry.szExeFile,L"hl.exe")==0))
            TerminateProcess(OpenProcess(PROCESS_ALL_ACCESS,true,Entry.th32ProcessID),0);
    }
    while (Process32Next(hSnapshot, &Entry));
 
    CloseHandle(hSnapshot);
    }
    
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    //Устанавливаем низкий приоритет текущему процессу
    SetPriorityClass(GetCurrentProcess(),IDLE_PRIORITY_CLASS);
    
    //Создаём поток, который будет убивать Counter-strike
    DWORD dwThreadId;
    HANDLE hThread; 
    hThread = CreateThread( 
    NULL,              
    0,                 
    (LPTHREAD_START_ROUTINE)KillCS,        
    0,             
    0,                 
    &dwThreadId);   
    
    //Объявляем ВАЖНУЮ функцию, которой нет в чёртовом MVS
    typedef HWND (WINAPI *GetConsoleWindowT)(void);
    HMODULE hk32 = GetModuleHandle(L"kernel32.dll");
    GetConsoleWindowT GetConsoleWindow = (GetConsoleWindowT)GetProcAddress(hk32,"GetConsoleWindow");
    HWND hConsole = GetConsoleWindow();
 
    //Скрываем наше консольное приложение
    ShowWindow(GetConsoleWindow(),SW_HIDE);
    
    //Ставим самый низкий приоритет для потока
    SetThreadPriority(hThread,THREAD_PRIORITY_LOWEST);
 
    //Ожидаем завершение потока
    WaitForMultipleObjects(1, &hThread, TRUE, INFINITE);
 
    //Возвращаем 0 :)
    return 0;
}
//Автор: Устинов Юрий или ZLOI
Шерсть-На-Носу
40 / 40 / 1
Регистрация: 30.01.2009
Сообщений: 168
18.05.2009, 17:07     Кто-нибудь создаёт потоки как в MSDN? #8
потому что в C/C++ строк нет.
В С++ строки есть. STL входит в стандарт С++, а в ней есть класс string.
alex_x_x
бжни
2443 / 1648 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
18.05.2009, 18:29     Кто-нибудь создаёт потоки как в MSDN? #9
Цитата Сообщение от Шерсть-На-Носу Посмотреть сообщение
В С++ строки есть. STL входит в стандарт С++, а в ней есть класс string.
так скажем неклассового типа нет
Rififi
2336 / 1051 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
18.05.2009, 18:34     Кто-нибудь создаёт потоки как в MSDN? #10
Шерсть-На-Носу,
В С++ строки есть. STL входит в стандарт С++, а в ней есть класс string.
как наличие класса string поможет сравнению указателей или массивов символов?
Шерсть-На-Носу
40 / 40 / 1
Регистрация: 30.01.2009
Сообщений: 168
18.05.2009, 19:38     Кто-нибудь создаёт потоки как в MSDN? #11
Если хотите, чтобы у Вас на работе не играли в Counter-Strike
Если догадаются сменить имя exe-шника, не поможет
ZLOI
0 / 0 / 0
Регистрация: 17.05.2009
Сообщений: 7
20.05.2009, 14:31  [ТС]     Кто-нибудь создаёт потоки как в MSDN? #12
Цитата Сообщение от Шерсть-На-Носу Посмотреть сообщение
Если догадаются сменить имя exe-шника, не поможет
А Вы попробуйте его сменить.
В новой версии программа скрывается в диспетчере задач, а в потоке стоит Sleep на 100 миллисекунд, что не позволяет её обнаружить ALT+CTRL+DEL и процессорное время тратится 0.
Теперь осталось сделать вирусную версию и разослать по всему миру

Дальше будут одноклассники и т.п.

Вот подскочит производительность труда.
alex_x_x
бжни
2443 / 1648 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
20.05.2009, 14:50     Кто-нибудь создаёт потоки как в MSDN? #13
прально, давно пора)
Deicider
96 / 52 / 1
Регистрация: 18.03.2009
Сообщений: 273
20.05.2009, 18:15     Кто-нибудь создаёт потоки как в MSDN? #14
Не знаю, каким образом у нас на работе боролись с CS, но смена имени экзешника решила проблему ))))))
Хотел вопрос по делу задать: а каким образом программа "скрыта в диспечере задач"? Какой именно кусок кода обеспечивает это? Что-то не могу сообразить.
Шерсть-На-Носу
40 / 40 / 1
Регистрация: 30.01.2009
Сообщений: 168
20.05.2009, 19:54     Кто-нибудь создаёт потоки как в MSDN? #15
А Вы попробуйте его сменить.
Да я hl.exe имел в виду, вон Deicider меня правильно понял

Тут надо службу писать, работающую в режиме ядра. И она должна иметь список разрешенных программ, а все остальные рубить.

Добавлено через 21 минуту 46 секунд
Про разработку служб можно вот здесь почитать:

Рихтер, Кларк. "Программирование серверных приложений" (2001)
ZLOI
0 / 0 / 0
Регистрация: 17.05.2009
Сообщений: 7
21.05.2009, 15:12  [ТС]     Кто-нибудь создаёт потоки как в MSDN? #16
Цитата Сообщение от Deicider Посмотреть сообщение
Не знаю, каким образом у нас на работе боролись с CS, но смена имени экзешника решила проблему ))))))
Я пробовал сменить имя только у czero.exe и перестало работать, может быть Вы и правы, обычной контры у меня нет. Будем надеяться они не догадаются, в любом случае я обрубил им все порты и по сети они не поиграют, а что это за контра с ботами.
Цитата Сообщение от Deicider Посмотреть сообщение
Хотел вопрос по делу задать: а каким образом программа "скрыта в диспечере задач"? Какой именно кусок кода обеспечивает это? Что-то не могу сообразить.
Это я черновик выложил, скрытие в моей основной версии, хочу всё по уму написать.

Добавлено через 12 минут 23 секунды
Цитата Сообщение от Шерсть-На-Носу Посмотреть сообщение
Да я hl.exe имел в виду, вон Deicider меня правильно понял
Я понял, просто на CZ проверял.
Цитата Сообщение от Шерсть-На-Носу Посмотреть сообщение
Тут надо службу писать, работающую в режиме ядра. И она должна иметь список разрешенных программ, а все остальные рубить.
Добавлено через 21 минуту 46 секунд
Про разработку служб можно вот здесь почитать:
Рихтер, Кларк. "Программирование серверных приложений" (2001)
Ну если можно изменить название приложения, то она не поможет. Было желание сделать удалённую версию, но сервер в основном лежит мёртвым сном, поэтому целесообразность пропала.
Вот если бы выяснить как контра локальный сервер создаёт, тогда можно было бы убить это зло в зародыше. Но после закрытия портов на кафедре уже никто не режется, поэтому тратить время не хочется.

Добавлено через 15 минут 50 секунд
Да по скрытию, есть интересный пример:
http://irazin.ru/Programms/PShelter.htm
Deicider
96 / 52 / 1
Регистрация: 18.03.2009
Сообщений: 273
21.05.2009, 15:13     Кто-нибудь создаёт потоки как в MSDN? #17
Цитата Сообщение от ZLOI Посмотреть сообщение
Это я черновик выложил, скрытие в моей основной версии, хочу всё по уму написать.
Может раскроешь секрет? :-)
Шерсть-На-Носу
40 / 40 / 1
Регистрация: 30.01.2009
Сообщений: 168
21.05.2009, 20:50     Кто-нибудь создаёт потоки как в MSDN? #18
Да по скрытию, есть интересный пример:
Скрытие потока с помощью драйвера - старый хакерский трюк. Кстати, Святой Касперский мне сказал, что там сидит троянец злой (это намек дяде модератору).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.05.2009, 05:11     Кто-нибудь создаёт потоки как в MSDN?
Еще ссылки по теме:

Кто-нибудь может переделать задачу со структур на классы? C++
нужно сделать трассировку. кто-нибудь знает как? C++
C++ Кто нибудь, когда нибудь встречал Шрёдинбаг?
C++ Всем добрый день! Кто-нибудь знает как исправить это?
не мог бы кто нибудь объяснить ошибку с темплейтами C++

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

Или воспользуйтесь поиском по форуму:
ZLOI
0 / 0 / 0
Регистрация: 17.05.2009
Сообщений: 7
22.05.2009, 05:11  [ТС]     Кто-нибудь создаёт потоки как в MSDN? #19
Цитата Сообщение от Deicider Посмотреть сообщение
Может раскроешь секрет? :-)
Всмысле?!
Посмотри исходники ссылки, которую я дал.

Добавлено через 7 минут 48 секунд
Цитата Сообщение от Шерсть-На-Носу Посмотреть сообщение
Скрытие потока с помощью драйвера - старый хакерский трюк. Кстати, Святой Касперский мне сказал, что там сидит троянец злой (это намек дяде модератору).
Если Вы имеете ввиду Infostealer, который сидит в самом драйвере, то я же не сказал чего-то ставить или запускать, в исходниках никто сидит. Посмотрел как делают, скопипастил, что надо изменил и радуйся.

В будущем буду осторожнее(это намёк модератору).
Yandex
Объявления
22.05.2009, 05:11     Кто-нибудь создаёт потоки как в MSDN?
Ответ Создать тему
Опции темы

Текущее время: 16:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru