Нужно полностью удалить файл (например C:\1.txt), так чтобы на то место, где ранее находился файл произвести запись логических нулей (чисел вида 0х00) в каждый байт каждого сектора. Для NTFS и FAT32. Знаю, что на форуме есть темы где описывается запись(чтение) на физический диск через CreateFile("\\.\PHYSICALDRIVEX") или логический (\\.\C, но как работать с конкретным файлом не понятно. Кто-нибудь знает(предполагает) необходимую логику действий? Какие API для этого понадобятся? Как правильно задавать путь для файла в CreateFile, так C:\1.txt или может \\.\C:\1.txt?
Может, так: Код (Text): local temp: dword local zerobuffer[2048]:byte invoke RtlZeroMemory, addr zerobuffer, sizeof zerobuffer invoke CreateFile, ..., GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_WRITE_THROUGH or FILE_FLAG_DELETE_ON_CLOSE, 0 mov edi, eax invoke GetFileSize, edi, nil mov ecx, eax shr ecx, 11 ; \ 2^11 = \2048 inc ecx @loop: push ecx invoke WriteFile, edi, addr zerobuffer, sizeof zerobuffer, addr temp, nil pop ecx loop @loop Или что-то в этом роде...
Я об этом думал. Может быть. Но не уверен, что получится именно запись логических нулей во все очищаемые сектора. Кто-нибудь знает точно?
Запись не обязательно будет в те же сектора, скорее наоборот, в свободные, с правкой цепочек кластеров. Но фокус в том, что после удаления файла найти его прежнее содержимое будет проблематично, придется весь диск перелопатить, созерцая море мусора Но есть и "надежный" способ: http://www.wasm.ru/article.php?article=lockfileswork только ни на 9x, ни под ХРюном данный пример не сработал А разбираться времени нет. Но чем черт не шутит, попробуй
Тебе шашечки или ехать? Просто перетирай файл, пока размер не увеличится, ты будешь писать точно поверх его прежних данных. Единственно - пиши сначала не нули, т.к. в sparce-файлах они не пишутся реально, а просто сохраняется информация о смещении и кол-ве нулей.
vg Да. Точнее, sparce files — разреженные файлы. Здесь и здесь описано. Коротко - файлы, в которых блоки, состоящие из одних нулей, не сохраняются на диск, а сохраняется только информация о них. im1111 Это о "сжатых" томах с FAT32? Возможно, я знаю о том механизме сжатия лишь то, что такие тома нередко глючили. Но ведь какой-то POC (документ по безопасному и полному стиранию данных файла) всё же реализовывали и для FAT, поэтому здесь стоит смотреть те реализации.
Исходя из выше изложенного можно предположить следующее(без учёта sparce-файлов) szFileName db "C:\1.txt", 0 invoke RealDeleteFile,ADDR szFileName . . . RealDeleteFile proc pathfile WORD LOCAL zerobuffer[2048] :BYTE LOCAL filehandle WORD LOCAL writedbyte WORD invoke RtlZeroMemory,addr zerobuffer,sizeof zerobuffer invoke CreateFile,pathfile,GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0 mov filehandle,eax invoke GetFileSize,filehandle,0 mov ecx,eax shr ecx,11 inc ecx @loop: push ecx invoke WriteFile,filehandle,addr zerobuffer,sizeof zerobuffer,writedbyte,0 pop ecx loop @loop invoke CloseHandle,filehandle ret RealDeleteFile endp Но содержимое файла остаётся без изменений. Где ошибка?
Просто открываешь файл и пишешь НЕ нули, как сказал IceStudent. Желательно рандомные данные, видимо для того, чтобы не нашли сами цепочки размещения данных (сектора) (цепочки кластеров). Ну и пишешь в несколько проходов. Потом делаешь размер файла равным нулю. Ну и само имя файла надо затереть обязательно. Готово! Так делает Eraser.
Это я знаю. С алгоритмами удаления данных я знаком. Хотелось бы для начала разобраться с записью нулей. Как это сделать?
SetFilePointer/SetEndOfFile, или сделать FileMapping с размером равным нулю. Но здесь надо тестить, хз как он там в итоге изменится....