1

Тема: Відновлення даних з образа флешки за відсутності файлової системи

Всім привіт. Спіткала така біда, на флешці з дорогоцінними фото злетіла файлова система. CD-картка з фотоапарата на 32 Гб, на ній востаннє було 411 фото, але після того як з файловою системою сталась біда, звичайно ж комп бачить що всі 30 Гб зайняті чимось, і це не що інше як старі фото. Так ось, я колись вже відновлював фотографії виконуючи задачку з курсів по програмуванню CS50, програмка залишилась.
Зробив образ флешки і трохи змінив програму, все працює, але не довго. Відновлює максимум 507 фото з початку, і зупиняється. Коли за допомогою fseek переходжу в кінець файлу - і ftell-ом дивлюсь позицію - показує максимум 6422144 байт.
Можливо ви підкажете як вийти за ці межі?
Ось код:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h> 


int main(int argc, char* argv[])
{

    FILE* cpcard = fopen("raw.img", "rb");
    if (cpcard == NULL)
    {
        printf("could not open file");
        return 1;
    } 

    uint8_t bufer[4];
    int count = 0;
    uint8_t check[5]  = {0xff, 0xd8, 0xff, 0xe0, 0xe1};
    FILE* picture;
    char nameFile[9] = {'0', '0', '0', '/', '.', 'j', 'p', 'g', '\0'};
    int    flag = 0; 
    int i;
    fseek(cpcard, 0, SEEK_END);
    long long len = ftell(cpcard);
    printf("%d", &len);
    fseek(cpcard, 0, SEEK_SET);
    for (i=0; i++; i<1024)
        fseek(cpcard, 6422144, SEEK_SET);

       while (fread(&bufer, 4, 1, cpcard) > 0)
       {
           if (bufer[0] == check[0] &&  bufer[1] == check[1] && 
               bufer[2] == check[2] && (bufer[3] == check[3] || bufer[3] == check[4]))
           {
//               printf('True\n');
            picture = fopen(nameFile, "wb");
            if (nameFile[3] == '9')
            {
                if (nameFile[2] == '9')
                {
                    if (nameFile[1] == 9)
                    {
                        nameFile[1] = '0';
                        nameFile[2] = '0';
                        nameFile[3] = '0';
                        nameFile[0]++;
                    }
                    else
                    {
                        nameFile[1]++;
                        nameFile[2] = '0';
                        nameFile[3] = '0';
                    }
                }
                else
                {
                    nameFile[2]++;
                    nameFile[3] = '0';
                }
            }
            else nameFile[3]++;
            
            fwrite(&bufer, 4, 1, picture);
            
            while(fread(&bufer, 4, 1, cpcard) > 0)
            {
                if (bufer[0] == check[0] &&  bufer[1] == check[1] && 
                   bufer[2] == check[2] && (bufer[3] == check[3] || bufer[3] == check[4]))
                   {
                       count++;
//                          printf("%d\n", &count);    
                       break;
                }

                fwrite(&bufer, 4, 1, picture);
            }
           }
       }
       
    fclose(cpcard);
    fclose(picture);
    return 0;
}

Сам я на С дуже давно не пишу, більше 2 років, все забув вже. Буду дуже вдячним за допомогу.
Можете запропонувати якісь інші методи відновлення даних, дієві. Але задачку з цією програмкою хотілось би все таки вирішити.
Може можна якось файл такого розміру розбити на менші файли?

Про 3D друк та програмування українською: http://freakspace.xyz
Подякували: koala, leofun012

2

Re: Відновлення даних з образа флешки за відсутності файлової системи

Самому теж цікаво, підпишусь, щоб не згубити тему.
А взагалі, всі люди діляться на 2 типи: ті, хто не робить бекапи і ті, хто вже робить бекапи.

Мій блог про ОС сімейства *nix - http://nixtravelling.blogspot.com/

3

Re: Відновлення даних з образа флешки за відсутності файлової системи

Master_Sergius написав:

А взагалі, всі люди діляться на 2 типи: ті, хто не робить бекапи і ті, хто вже робить бекапи.

Ну проблеми почались саме коли фото скидались. Одне фото скинуло і все, файлова система відсутня, вінда просить форматнути флешку

Про 3D друк та програмування українською: http://freakspace.xyz

4 Востаннє редагувалося navchalkin (10.08.2017 00:27:18)

Re: Відновлення даних з образа флешки за відсутності файлової системи

Переписав на python, тепер проблем як з С-шкою немає, правда працює разів в 50 повільніше. Для наглядності добавив progress bar. Прямо зараз іде відновлення, 290 фотографій вже відновило і це (якщо вірити прогресс-бару) трохи більше 1% зі всього.

https://scontent-waw1-1.xx.fbcdn.net/v/t31.0-8/20643272_946998315438041_8869939226871839337_o.jpg?oh=46a9044a1f3949e2ba40eb0f5b96a977&amp;oe=59EFE0FE

Код заливаю на git, сподобалось, вирішив підтримувати і розвивати аппку. Буду радий, якщо хтось вирішить долучитись до розробки: ImageRestorer

Про 3D друк та програмування українською: http://freakspace.xyz
Подякували: koala, LoganRoss, leofun013

5

Re: Відновлення даних з образа флешки за відсутності файлової системи

0. Recuva не пробували використовувати?
1. Ви шукаєте певну комбінацію (початок jpg-файлу), перебираючи по 4 байти. Оскільки початки файлів вирівняні по кластерах, а їхній розмір - ступінь 2, це працює. Але ви при цьому додаєте до лічильника i 1, а не 4.
2. Ніхто не гарантує неперервність файлів на диску. Розірвані файли ваша програма відновити не в змозі.
3. Вікі каже, що ще є варіант FF D8 FF DB. І взагалі

check=[b'\xFF\xD8\xFF\xDB',b'\xFF\xD8\xFF\xE0',b'\xFF\xD8\xFF\xE1']
...
if bufer in check:

виглядає краще.
4. Якщо посеред файлу зустрінеться сигнатура jpg (а це може бути як випадково, так і, скажімо, вкладений thumbnail), то ваша програма розіб'є його на шматки. Може, краще розібратися в тому, як зберігаються jpg, і перевіряти, чи дійсно все ще читається той самий jpg? Це, до речі, допоможе не різати весь диск на окремі файли (із купами сміття в кінці), а витягати саме фотографії.

Подякували: NagarD, navchalkin, ostap34PHP, LoganRoss, leofun015

6 Востаннє редагувалося ping (10.08.2017 10:58:51)

Re: Відновлення даних з образа флешки за відсутності файлової системи

якщо флешка у форматі FAT , то , наскільки приигадую часи роботи з MS DOS - є дві таблиці file allocation table (основна і дублююча)

The FAT Region.

    This typically contains two copies (may vary) of the File Allocation Table for the sake of redundancy checking, although rarely used, even by disk repair utilities.

може можна спробувати з двох зробити одну діючу і по ній вибирати маючи номери кластерів?

First, solve the problem. Then, write the code. (c)JJ
Подякували: navchalkin1

7

Re: Відновлення даних з образа флешки за відсутності файлової системи

koala написав:

0. Recuva не пробували використовувати?

Ні, не пробував

koala написав:

1. Ви шукаєте певну комбінацію (початок jpg-файлу), перебираючи по 4 байти. Оскільки початки файлів вирівняні по кластерах, а їхній розмір - ступінь 2, це працює. Але ви при цьому додаєте до лічильника i 1, а не 4.

Я не розбирався як записуються дані на флеш-носії і все ж думав що початок картинки може зустрітись в наступному байті

koala написав:

2. Ніхто не гарантує неперервність файлів на диску. Розірвані файли ваша програма відновити не в змозі.

Ну без файлової системи мені здається що це навряд вийде відновити

koala написав:

3. Вікі каже, що ще є варіант FF D8 FF DB. І взагалі

check=[b'\xFF\xD8\xFF\xDB',b'\xFF\xD8\xFF\xE0',b'\xFF\xD8\xFF\xE1']
...
if bufer in check:

виглядає краще.

Так, звісно, дякую. Скриптик був написаний за 4 хв, і це була повна копія програми на С. Тому, оптимізація в майбутньому))

koala написав:

4. Якщо посеред файлу зустрінеться сигнатура jpg (а це може бути як випадково, так і, скажімо, вкладений thumbnail), то ваша програма розіб'є його на шматки. Може, краще розібратися в тому, як зберігаються jpg, і перевіряти, чи дійсно все ще читається той самий jpg? Це, до речі, допоможе не різати весь диск на окремі файли (із купами сміття в кінці), а витягати саме фотографії.

Читаючи літературу про jpeg виконуючи завдання на CS50 я зрозумів що файли даного розширення починаються з 4 байт по яких їх і відрізняють від інших. Проблема, що в даних картинках немає визначеної послідовності байт, які б вказували на завершення файлу. Я теж боявся що зустрінеться така ж послідовність чисел десь посеред картинки, але на щастя обійшлось. Відновив всі 411 фото

Про 3D друк та програмування українською: http://freakspace.xyz
Подякували: koala1

8

Re: Відновлення даних з образа флешки за відсутності файлової системи

ping написав:

якщо флешка у форматі FAT , то , наскільки приигадую часи роботи з MS DOS - є дві таблиці file allocation table (основна і дублююча)

The FAT Region.

    This typically contains two copies (may vary) of the File Allocation Table for the sake of redundancy checking, although rarely used, even by disk repair utilities.

може можна спробувати з двох зробити одну діючу і по ній вибирати маючи номери кластерів?

Цікаво. Треба доки читати.

І взагалі, в мене пропозиція до форумчан, написати нормальну прогу по відновленню файлів))

Про 3D друк та програмування українською: http://freakspace.xyz

9

Re: Відновлення даних з образа флешки за відсутності файлової системи

navchalkin написав:
ping написав:

якщо флешка у форматі FAT , то , наскільки приигадую часи роботи з MS DOS - є дві таблиці file allocation table (основна і дублююча)

The FAT Region.

    This typically contains two copies (may vary) of the File Allocation Table for the sake of redundancy checking, although rarely used, even by disk repair utilities.

може можна спробувати з двох зробити одну діючу і по ній вибирати маючи номери кластерів?

Цікаво. Треба доки читати.

І взагалі, в мене пропозиція до форумчан, написати нормальну прогу по відновленню файлів))

Fat  має чіітку структуру. Правда мої спогади відносяться до фат8, це було давно.

First, solve the problem. Then, write the code. (c)JJ