الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف أستطيع تدمير الملفات لكي لا يتم استرجاعها مرة أخرى ؟

بدأه The Hidden Ghost في 7 أكتوبر 2012 · 8 رد · 989 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله تعالى و بركاته

smile.gif

كيف أستطيع تدمير الملفات لكي لا يتم استرجاعها مرة أخرى ؟

أي الكيفية التي تمكنني من مسح الملفات بشكل نهائي من على القرص الصلب و بالتالي

لن تستطيع برامج استرجاع الملفات مثل Data Recovery من استرجاعها .

أتمنى أن أجد عندكم الجواب المثال ، و إن بالإمكان يرجى إرفاق بعض الأمثلة على ذلك + أظن

أن سؤالي لم يتم التطرق إليه في هذا القسم . و الله أعلم smile.gif

rS3eY.png
#2

السلام عيكم ورحمة الله وبركاتة

الفكرة هي الكتابة على الملف ثم حذفة ....

مثلا نكتب على الملف بشكل عشوائي اصفار ووحايد او

او نكتب اكثر من مرة على الملف

فى النهاية هى خوارزمية انت تضعها وتبدا فى تطبيقها با ابسط اكواد سي او سي++ ان شاء الله

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#3

السلام عليكم

أعتقد أنه إذا أردت تدمير ملف لعدم إسترجاعه بإماكانك وضع أصفار في محرر الهيكس

للملف أو للقرص

Be the change you want to see in the world


#4

ارى ان الفكرة كلها فى تدمير محتوى الملف ثم حذفه فاذا تم استرجاعه لن يستطيع استعادة محتوياته السابقة


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#5

هل لديكم أمثلة على ذلك يا إخوتي ؟ مثلا كيف ندمر ملفا من نوع txt ؟

هل سنكتب فيه بالاعتماد على نمط البيناري هكذا ؟


#include <stdio.h>

int main()
{
char binary[1] = {0x0,0x1};
FILE *fp = fopen("filename.txt","wb");
write(&binary,sizeof(binary),sizeof(binary),fp);
fclose(fp);
return 0;
}

rS3eY.png
#6

عندما تحذف ملف ما فإنه فعلياً لايحذف من على القرص, ومايحدث أن نظام الملفات يلغي الروابط إليه وتُفك الحماية عنه بحيث يصبح مسموح الكتابة فوقة. أي أنّ الملف موجود إلى أن تأتي ملفات جديدة لتكتب فوقه.

برامج إستعادة الملفات تقرأ القرص بايت بايت وتعيد بناء الروابط لهذا الملفات لإستعادتها.

لحذف مف نهائياً قمّ بالكتابة فوقة بحيث يساوي حجم البيانات المكتوبة حجم هذا الملف, ربما أكثر من مرة فقط ليطمئن القلب. هذا مثال لدالة كتبتها تعيد الكتابة فوق الملف أكثر من مرة :

int destroy_file(FILE *fh, unsigned char byte, unsigned int times)

مرر مقبض الملف والبايت الذي تريد به طمس الملف وعدد مرات الكتابة :

#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>

int destroy_file(FILE *fh, unsigned char byte, unsigned int times);

int main(int argc, char **argv)
{
    FILE *fh;
    char *filename = "file.txt";

    if( (fh = fopen(filename, "r+")) == NULL ) {
        perror("Error:");
        return -1;
    }

    destroy_file(fh, '?', 2);

    fclose(fh);
    return 0;
}

int destroy_file(FILE *fh, unsigned char byte, unsigned int times)
{
    struct stat fst;
    off_t file_size = 0;

    if( fstat(fileno(fh), &fst) == -1 )
        return -1;

    while( times-- != 0 ) {
        file_size = (off_t) fst.st_size;
        while( file_size-- != 0 )
            fputc(byte, fh);

        fseek(fh, 0, SEEK_SET);
    }

    return 0;
}

تم تعديل هذه المشاركة بواسطة Mr.B في 7 أكتوبر 2012 في 14:23

1
#7

اخي الكريم الكود الدي تحتاجة هو

#include <limits.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>

#define SPC_WIPE_BUFSIZE 4096

static int write_data(int fd, const void *buf, size_t nbytes) {
  size_t  towrite, written = 0;
  ssize_t result;

  do {
    if (nbytes - written > SSIZE_MAX) towrite = SSIZE_MAX;
    else towrite = nbytes - written;
    if ((result = write(fd, (const char *)buf + written, towrite)) >= 0)
      written += result;
    else if (errno != EINTR) return 0;
  } while (written < nbytes);
  return 1;
}

static int random_pass(int fd, size_t nbytes)
{
  size_t        towrite;
  unsigned char buf[SPC_WIPE_BUFSIZE];

  if (lseek(fd, 0, SEEK_SET) != 0) return -1;
  while (nbytes > 0) {
    towrite = (nbytes > sizeof(buf) ? sizeof(buf) : nbytes);
    spc_rand(buf, towrite);
    if (!write_data(fd, buf, towrite)) return -1;
    nbytes -= towrite;
  }
  fsync(fd);
  return 0;
}

static int pattern_pass(int fd, unsigned char *buf, size_t bufsz, size_t filesz) {
  size_t towrite;

  if (!bufsz || lseek(fd, 0, SEEK_SET) != 0) return -1;
  while (filesz > 0) {
    towrite = (filesz > bufsz ? bufsz : filesz);
    if (!write_data(fd, buf, towrite)) return -1;
    filesz -= towrite;
  }
  fsync(fd);
  return 0;
}

int spc_fd_wipe(int fd) {
  int           count, i, pass, patternsz;
  struct stat   st;
  unsigned char buf[SPC_WIPE_BUFSIZE], *pattern;

  static unsigned char single_pats[16] = {
    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
    0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff
  };
  static unsigned char triple_pats[6][3] = {
    { 0x92, 0x49, 0x24 }, { 0x49, 0x24, 0x92 }, { 0x24, 0x92, 0x49 },
    { 0x6d, 0xb6, 0xdb }, { 0xb6, 0xdb, 0x6d }, { 0xdb, 0x6d, 0xb6 }
  };

  if (fstat(fd, &st) =  = -1) return -1;
  if (!st.st_size) return 0;

  for (pass = 0;  pass < 4;  pass++)
    if (random_pass(fd, st.st_size) =  = -1) return -1;

  memset(buf, single_pats[5], sizeof(buf));
  if (pattern_pass(fd, buf, sizeof(buf), st.st_size) =  = -1) return -1;
  memset(buf, single_pats[10], sizeof(buf));
  if (pattern_pass(fd, buf, sizeof(buf), st.st_size) =  = -1) return -1;

  patternsz = sizeof(triple_pats[0]);
  for (pass = 0;  pass < 3;  pass++) {
    pattern = triple_pats[pass];
    count   = sizeof(buf) / patternsz;
    for (i = 0;  i < count;  i++)
      memcpy(buf + (i * patternsz), pattern, patternsz);
    if (pattern_pass(fd, buf, patternsz * count, st.st_size) =  = -1) return -1;
  }

  for (pass = 0;  pass < sizeof(single_pats);  pass++) {
    memset(buf, single_pats[pass], sizeof(buf));
    if (pattern_pass(fd, buf, sizeof(buf), st.st_size) =  = -1) return -1;
  }

  for (pass = 0;  pass < sizeof(triple_pats) / patternsz;  pass++) {
    pattern = triple_pats[pass];
    count   = sizeof(buf) / patternsz;
    for (i = 0;  i < count;  i++)
      memcpy(buf + (i * patternsz), pattern, patternsz);
    if (pattern_pass(fd, buf, patternsz * count, st.st_size) =  = -1) return -1;
  }

  for (pass = 0;  pass < 4;  pass++)
    if (random_pass(fd, st.st_size) =  = -1) return -1;
  return 0;
}

int spc_file_wipe(FILE *f) {
  return spc_fd_wipe(fileno(f));
}
The Unix implementations should work on Windows systems using the standard C runtime API; however, it is rare that the standard C runtime API is used on Windows. The following code implements SpcWipeFile( ), which is virtually identical to the standard C version except that it uses only Win32 APIs for file access.
#include <windows.h>
#include <wincrypt.h>

#define SPC_WIPE_BUFSIZE 4096

static BOOL RandomPass(HANDLE hFile, HCRYPTPROV hProvider, DWORD dwFileSize)
{
  BYTE  pbBuffer[SPC_WIPE_BUFSIZE];
  DWORD cbBuffer, cbTotalWritten, cbWritten;

  if (SetFilePointer(hFile, 0, 0, FILE_BEGIN) =  = 0xFFFFFFFF) return FALSE;
  while (dwFileSize > 0) {
    cbBuffer = (dwFileSize > sizeof(pbBuffer) ? sizeof(pbBuffer) : dwFileSize);
    if (!CryptGenRandom(hProvider, cbBuffer, pbBuffer)) return FALSE;
    for (cbTotalWritten = 0;  cbBuffer > 0;  cbTotalWritten += cbWritten)
      if (!WriteFile(hFile, pbBuffer + cbTotalWritten, cbBuffer - cbTotalWritten,
                     &cbWritten, 0)) return FALSE;
    dwFileSize -= cbTotalWritten;
  }
  return TRUE;
}

static BOOL PatternPass(HANDLE hFile, BYTE *pbBuffer, DWORD cbBuffer, DWORD dwFileSize) {
  DWORD cbTotalWritten, cbWrite, cbWritten;

  if (!cbBuffer || SetFilePointer(hFile, 0, 0, FILE_BEGIN) =  = 0xFFFFFFFF) return FALSE;
  while (dwFileSize > 0) {
    cbWrite = (dwFileSize > cbBuffer ? cbBuffer : dwFileSize);
    for (cbTotalWritten = 0;  cbWrite > 0;  cbTotalWritten += cbWritten)
      if (!WriteFile(hFile, pbBuffer + cbTotalWritten, cbWrite - cbTotalWritten,
                     &cbWritten, 0)) return FALSE;
    dwFileSize -= cbTotalWritten;
  }
  return TRUE;
}

BOOL SpcWipeFile(HANDLE hFile) {
  BYTE       pbBuffer[SPC_WIPE_BUFSIZE];
  DWORD      dwCount, dwFileSize, dwIndex, dwPass;
  HCRYPTPROV hProvider;

  static BYTE  pbSinglePats[16] = {
    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
    0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff
  };
  static BYTE  pbTriplePats[6][3] = {
    { 0x92, 0x49, 0x24 }, { 0x49, 0x24, 0x92 }, { 0x24, 0x92, 0x49 },
    { 0x6d, 0xb6, 0xdb }, { 0xb6, 0xdb, 0x6d }, { 0xdb, 0x6d, 0xb6 }
  };
  static DWORD cbPattern = sizeof(pbTriplePats[0]);

  if ((dwFileSize = GetFileSize(hFile, 0)) =  = INVALID_FILE_SIZE) return FALSE;
  if (!dwFileSize) return TRUE;

  if (!CryptAcquireContext(&hProvider, 0, 0, 0, CRYPT_VERIFYCONTEXT))
    return FALSE;

  for (dwPass = 0;  dwPass < 4;  dwPass++)
    if (!RandomPass(hFile, hProvider, dwFileSize)) {
      CryptReleaseContext(hProvider, 0);
      return FALSE;
    }

  memset(pbBuffer, pbSinglePats[5], sizeof(pbBuffer));
  if (!PatternPass(hFile, pbBuffer, sizeof(pbBuffer), dwFileSize)) {
    CryptReleaseContext(hProvider, 0);
    return FALSE;
  }
  memset(pbBuffer, pbSinglePats[10], sizeof(pbBuffer));
  if (!PatternPass(hFile, pbBuffer, sizeof(pbBuffer), dwFileSize)) {
    CryptReleaseContext(hProvider, 0);
    return FALSE;
  }

  cbPattern = sizeof(pbTriplePats[0]);
  for (dwPass = 0;  dwPass < 3;  dwPass++) {
    dwCount   = sizeof(pbBuffer) / cbPattern;
    for (dwIndex = 0;  dwIndex < dwCount;  dwIndex++)
      CopyMemory(pbBuffer + (dwIndex * cbPattern), pbTriplePats[dwPass],
                  cbPattern);
    if (!PatternPass(hFile, pbBuffer, cbPattern * dwCount, dwFileSize)) {
      CryptReleaseContext(hProvider, 0);
      return FALSE;
    }
  }

  for (dwPass = 0;  dwPass < sizeof(pbSinglePats);  dwPass++) {
    memset(pbBuffer, pbSinglePats[dwPass], sizeof(pbBuffer));
    if (!PatternPass(hFile, pbBuffer, sizeof(pbBuffer), dwFileSize)) {
      CryptReleaseContext(hProvider, 0);
      return FALSE;
    }
  }

  for (dwPass = 0;  dwPass < sizeof(pbTriplePats) / cbPattern;  dwPass++) {
    dwCount   = sizeof(pbBuffer) / cbPattern;
    for (dwIndex = 0;  dwIndex < dwCount;  dwIndex++)
      CopyMemory(pbBuffer + (dwIndex * cbPattern), pbTriplePats[dwPass],
                  cbPattern);
    if (!PatternPass(hFile, pbBuffer, cbPattern * dwCount, dwFileSize)) {
      CryptReleaseContext(hProvider, 0);
      return FALSE;
    }
  }

  for (dwPass = 0;  dwPass < 4;  dwPass++)
    if (!RandomPass(hFile, hProvider, dwFileSize)) {
      CryptReleaseContext(hProvider, 0);
      return FALSE;
    }

  CryptReleaseContext(hProvider, 0);
  return TRUE;
}

الموضوع الاصلي http://etutorials.org/Programming/secure+programming/Chapter+2.+Access+Control/2.5+Erasing+Files+Securely/

1
#8

شكرا لكم جميعا laugh.gif + هل يمكنك إعادة كتابة البرنامج للويندوز أخي ؟ أي بالاعتماد على مكتبة الويندوز دوت إتش مثلا smile.gif

rS3eY.png
#9

أظن أن هذا يفي بالغرض أليس كذلك ؟؟؟؟ smile.gif


#include <stdio.h>

int main() {

char data[] = { 0x00 , 0x01 };

int offset = 0x0000;

FILE* destroyEXE;

if((destroyEXE = fopen("file.exe","w+b")) != NULL) {

fseek(destroyEXE,offset,SEEK_SET);

fwrite(data,sizeof(data),sizeof(data),destroyEXE);

fclose(destroyEXE);

printf("File is Destroyed !!!");

getchar();

} else {

printf("File Not Found !!!");

getchar();

}
return 0;
}

rS3eY.png

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…