Собственно сабж. Есть некий ключ реестра, у этого ключа есть некое значение, известно, что в некоторый момент в прошлом это значение было изменено. Есть ли какие то тулзы, которые могут восстановить старые данные значения, после его изменения? При каких ситуациях непосредственное значение реестра будет физически перезаписано, а при каких вероятнее всего, что данные останутся при изменении значения до последующего переиспользования этого места? Так же интересен опыт восстановления данных из удаленных ключей и значений реестра. Спасибо!
Ну, раз ресерч, то ресерчствуй: Код (C): /* -------------------------------------------------------------------------- */ #define HIVE_HEADER_SIGNATURE ((DWORD)'fger') #define HIVE_BIN_SIGNATURE ((DWORD)'nibh') #define HIVE_SECURITY_SIGNATURE ((WORD)'ks') #define HIVE_KEY_SIGNATURE ((WORD)'kn') #define HIVE_SUBKEY_LF_SIGNATURE ((WORD)'fl') #define HIVE_SUBKEY_LH_SIGNATURE ((WORD)'hl') #define HIVE_SUBKEY_LI_SIGNATURE ((WORD)'il') #define HIVE_SUBKEY_RI_SIGNATURE ((WORD)'ir') #define HIVE_VALUE_SIGNATURE ((WORD)'kv') #define HIVE_BIGDATA_SIGNATURE ((WORD)'bd') #define HIVE_KEYF_PREDEFINED 0x0040 #define HIVE_KEYF_ASCII_NAME 0x0020 #define HIVE_KEYF_SYMLINK 0x0010 #define HIVE_KEYF_DISABLE_DEL 0x0008 #define HIVE_KEYF_ROOT_KEY 0x0004 #define HIVE_KEYF_MOUNT_POINT 0x0002 #define HIVE_KEYF_VOLATILE 0x0001 #define HIVE_VALF_ASCII_NAME 0x0001 #define HIVE_INVALID_OFFSET 0xffffffff #define HIVE_MAX_OFFSET 0xffffffff #define HIVE_INVALID_SIZE 0xffffffff /* -------------------------------------------------------------------------- */ #pragma pack(push, 1) typedef struct _HIVE_HEADER { DWORD signature; DWORD sequence1; DWORD sequence2; DWORD timestampLow; DWORD timestampHigh; DWORD versionMajor; DWORD versionMinor; DWORD type; DWORD format; DWORD rootKey; DWORD lastBin; DWORD unknown2; CHAR fileName[64]; GUID unknown3; GUID unknown4; DWORD unknown5; GUID unknown6; DWORD unknown7; BYTE unknown8[340]; DWORD checksum; BYTE unknown9[3528]; GUID unknown10; GUID unknown11; GUID unknown12; DWORD unknown13; DWORD unknown14; /* bins... */ }hive_header_t; typedef struct _BIN { DWORD signature; DWORD relOffset; DWORD size; BYTE unknown[16]; DWORD nextBin; /* cells... */ }hive_bin_t; typedef struct _CELL { DWORD size; /* record... */ }hive_cell_t; typedef struct _SECURITY_RECORD { WORD signature; WORD unknown; DWORD prev; DWORD next; DWORD refCount; DWORD descriptorSize; /* BYTE securityDescriptor[] */ }hive_secutiry_record_t; typedef struct _KEY_RECORD { WORD signature; WORD flags; DWORD timestampLow; DWORD timestampHigh; DWORD unknown0; DWORD parentKey; DWORD subKeyCount; DWORD subKeyCountV; DWORD subKeyList; DWORD subKeyListVolatile; DWORD valueCount; DWORD valueList; /* cell with offsets to cells with VALUE_RECORD */ DWORD securityRecord; DWORD className; DWORD maxSubKeyNameLength; DWORD maxClassNameLength; DWORD maxValueNameLength; DWORD maxValueDataSize; DWORD unknown1; WORD nameLength; WORD classNameLength; /* BYTE name[] */ }hive_key_record_t; typedef struct _SUBKEY_LIST { WORD signature; WORD itemCount; /* items... */ }hive_subkey_list_t; /* typedef struct _SUBKEY_ITEM_LF_LH { DWORD keyOffset; / * hive_nk_record_t * / DWORD hash; }hive_item_lf_lh_t; typedef struct _SUBKEY_ITEM_RI { DWORD subKeyList; }hive_item_ri_t; typedef struct _SUBKEY_ITEM_LI { DWORD offset; ??? }hive_item_li_t; */ typedef struct _VALUE_RECORD { WORD signature; WORD nameLength; DWORD dataLength; DWORD data; /* offset to cell with data or data itself if MSB in dataLength is set */ DWORD type; WORD flags; WORD unknown; /* BYTE name[] */ }hive_value_record_t; typedef struct _BIGDATA_RECORD { WORD signature; WORD fragmentCount; DWORD indirectCells; DWORD unknown; }hive_bigdata_t; #pragma pack(pop) /* -------------------------------------------------------------------------- */ Не, ну серьезно, ты же не думал, что местные спецовые спецы тебе готовых скриптов на петоне или расте накидают?