"Как в С++ написать программу, позволяющую получить доступ к файлу SAM?"


Страницы: 1
Пользователь: diman-189
Сообщений: 2
Статус: Незримый
Зарегистрирован:
18 июня 2008, 19:21
Был:18 июня 2008, 19:29
diman-189
smsup
Дата: 18 июня 2008, 19:28 Сообщение № 1
Как в С++ написать программу, позволяющую получить доступ к файлу SAM?
Пользователь: irvin
Сообщений: 1
Статус: Незримый
Зарегистрирован:
11 сентября 2008, 21:45
Был:11 сентября 2008, 22:00
irvin
smsup
Дата: 11 сентября 2008, 21:59 Сообщение № 2
луче всего на асемблере считатть кластеры на винте на том месте где находится этот файл
Пользователь: DMT
Сообщений: 123
Статус: Программист
Зарегистрирован:
18 октября 2007, 2:35
Был:13 ноября 2017, 4:54
DMT
smsup
Дата: 11 сентября 2008, 23:57 Сообщение № 3
Да кстате открываешь винт и ищеш имя нужного файла в MFT, переходишь на первый кластер и далее проходишь по цепочки.

В данном случае этот фрагмент не пойдёт!!! Т.к напрямую к файлу обратиться мы не можем.

DeviceIoControl нужен идентификатор файла!! Может получица каким нибуть образом его открыть, для получения идентификатора. Если это выйдет, то найдём начальный VCN экстента.

Код на C++
  1. void GetFileClusters(
  2. PCHAR lpFileName, //имя файла
  3. ULONG ClusterSize //размер кластера на диске
  4. )
  5. {
  6. HANDLE hFile; //хэндл нерезидентного файла
  7. ULONG OutSize; //размер буфера OutBuf
  8. ULONG FileSize; //размер файла
  9. ULONG Bytes, //количество байт. возвращаемых eviceIoControl
  10. ClCount, //количество кластеров в файле
  11. r, //счетчики
  12. CnCount; //количество кластеров в файле
  13. LARGE_INTEGER PrevVCN, Lcn;
  14. STARTING_VCN_INPUT_BUFFER InBuf; //номер начального виртуального кластера
  15. PRETRIEVAL_POINTERS_BUFFER OutBuf;
  16. //буфер структуры, описывающей размещение файла на диске
  17. hFile = CreateFile(lpFileName, FILE_READ_ATTRIBUTES,
  18. FILE_SHARE_READ,
  19. NULL, OPEN_EXISTING, 0, 0); //открываем нерезидентный файл
  20. if (hFile != INVALID_HANDLE_VALUE)
  21. {
  22. FileSize = GetFileSize(hFile, NULL); //определяем размер файла
  23. //определяем размер буфера OutBuf
  24. OutSize = sizeof(RETRIEVAL_POINTERS_BUFFER)
  25. + (FileSize / ClusterSize)*
  26. sizeof(OutBuf->Extents);
  27. //выделяем память для структуры
  28. OutBuf = (PRETRIEVAL_POINTERS_BUFFER)malloc(OutSize);
  29. InBuf.StartingVcn.QuadPart = 0; //номер VCN начального экстента файла
  30. //заполняем структуру, описывающую размещение файла
  31. if (DeviceIoControl(hFile,
  32. FSCTL_GET_RETRIEVAL_POINTERS,
  33. &InBuf,sizeof(InBuf), OutBuf,
  34. OutSize, &Bytes, NULL))
  35. {
  36. //количество кластеров в файле
  37. ClCount = (FileSize + ClusterSize - 1) / ClusterSize;
  38. PrevVCN = OutBuf->StartingVcn; //начальный VCN экстента (равен 0)
  39. //цикл перемещения по экстентам файла
  40. for (r = 0; r < OutBuf->ExtentCount; r++)
  41. {
  42. Lcn = OutBuf->Extents[r].Lcn; //LCN кластера начала экстента
  43. //количество кластеров в текущем экстенте:
  44. for(CnCount=OutBuf->Extents[r].NextVcn.QuadPart-PrevVCN.QuadPart;
  45. //печатаем номер кластера
  46. CnCount; CnCount--, Lcn.QuadPart++) printf("%I64x ",Lcn.QuadPart);
  47. //переходим к следующему экстенту
  48. PrevVCN = OutBuf->Extents[r].NextVcn;
  49. }
  50. }
  51. free(OutBuf);
  52. CloseHandle(hFile);
  53. }
  54. }
  55.  
При использовании обязательна ссылка на http://DMTSoft.ru


Можно конечно и просканить всё дерево, предварительно конечно расшифровать структуру файловой системы.

Просканить напрямую можно примерно так:
Код на Pascal
  1. var
  2. hFile:LongWord;
  3. i,c,r:integer;
  4. buff:parraybyte;
  5. bytesread:LongWord;
  6. f:file;
  7. begin
  8. //GetMem(bytesread,sizeof(LongWord));
  9. hFile:=CreateFile(drive_name,GENERIC_READ,FILE_SHARE_READ
  10. or FILE_SHARE_WRITE, nil,OPEN_EXISTING,0,0);
  11. if(hFile=INVALID_HANDLE_VALUE) then begin
  12. MessageBox(0,'Открыть устройство НЕ удалось',nil,
  13. MB_OK or MB_ICONSTOP);
  14. exit;
  15. end;
  16. GetMem(buff,512);
  17. //ReadFile(hFile,buff,numberofsectors*512,bytesread, nil);
  18. AssignFile(f,FileName);
  19. rewrite(f,1);
  20. for i:=0 to numberofsectors-1 do begin
  21. SetFilePointer(hFile, 512*sector+512*i, nil, FILE_BEGIN);
  22. if( not ReadFile(hFile,buff^,512,bytesread, nil)) then begin
  23. freeMem(buff,512);
  24. MessageBox(0,'Чтение данных НЕ удалось', nil,
  25. MB_OK or MB_ICONSTOP);
  26. exit;
  27. end;
  28. BlockWrite(f,buff^,512);
  29. end;
  30. closefile(f);
  31. CloseHandle(hFile);
  32. FreeMem(buff,512);
  33.  
При использовании обязательна ссылка на http://DMTSoft.ru
Пользователь: i386
Сообщений: 6
Статус: Незримый
Зарегистрирован:
2 декабря 2008, 17:13
Был:7 декабря 2008, 16:34
i386
smsup
Дата: 2 декабря 2008, 17:42 Сообщение № 4
да скорее всего лучше на ассемблере,повкалываешь и в итоге получешь норм прогу
Пользователь: kiber_shurik
Сообщений: 3
Статус: Незримый
Зарегистрирован:
24 января 2009, 5:33
Был:24 января 2009, 6:15
kiber_shurik
smsup
Дата: 24 января 2009, 5:50 Сообщение № 5
Здесь очень важны права программы(premissions)

и кроме покластерного считывания, можешь попробовать поэксперементировать с дескриптором файла:
DuplicateHandle() - для копии handl'ы к файлу
CloseHandle() - для закрытия его процессом system
но нет гарантии, что ситема переоткроет хэндл

и ещё: для этого есть много программ, попробуй их либо дизассемблировать(и вставить hex-код секции, для получения прав в свою программу), либо декомпилировать(для С++ есть плагин[платный вроде бы] под IDA Pro 5.0)

Страницы: 1