Дамп

eXeL@B DVD

Материал из Справочник исследователя программ

Перейти к: навигация, поиск

Дамп это один из шагов при распаковке программ.

Что значить dump, дамп, сдампить, сделать дамп, снять dump?

Слово dump (дамп) может быть и существительным и глаголом. В первом случае, дамп означает - область (часть) памяти. Во втором случае, сдампить, снять дамп - значит сохранить нужную область памяти на жесткий диск. Часто дамп нужно снимать при распаковке программ. Это надо для того, чтобы получить распакованную программу. Ведь когда запакованная программа запускается, то она распаковывается в памяти. В этот момент распакованный код программы нужно сохранить на жесткий диск.


C

  BOOL DumpMZ(LPVOID lpBase, TCHAR *lpFName)
  {
    // проверяем что можем читать MZ-заголовок и указатель на имя не пустой
    if (IsBadReadPtr(lpBase, sizeof(IMAGE_DOS_HEADER)) || lpFName == NULL)
    return FALSE;

    // проверяем сигнатуру
    PIMAGE_DOS_HEADER lpDosHeader = (PIMAGE_DOS_HEADER)lpBase;
    if (lpDosHeader->e_magic != IMAGE_DOS_SIGNATURE)
      return FALSE;

    PIMAGE_NT_HEADERS lpNtHeaders = MAKE_PTR(PIMAGE_NT_HEADERS, lpBase, lpDosHeader->e_lfanew);

    // проверяем что можем прочесть PE-заголовок и сигнатуру
    if ((IsBadReadPtr(lpNtHeaders, sizeof(IMAGE_NT_HEADERS))) || (lpNtHeaders->Signature != IMAGE_NT_SIGNATURE))
      return FALSE;

    HANDLE hFile = CreateFile(lpFName, GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL ,NULL);
    if (hFile == INVALID_HANDLE_VALUE) {
      return FALSE;
    }

    DWORD nNumWr = 0;
    // здесь лучше писать в файл посекционно, проверяя привилегии доступа к ним
    WriteFile(hFile, lpBase, lpNtHeaders->OptionalHeader.SizeOfImage, &nNumWr, NULL);
    CloseHandle(hFile);
    return TRUE;
  }