#include "Reader.h" #define path "Bhuitre_or.dsparty" void print_header(ds_header *header) { printf("m_ProductId = %.4s\n", header->m_ProductId); printf("m_TankId = %.4s\n", header->m_TankId); printf("m_HeaderVersion = %x\n", header->m_HeaderVersion); printf("m_DirSetOffset = %x\n", header->m_DirSetOffset); printf("m_FileSetOffset = %x\n", header->m_FileSetOffset); printf("m_IndexSize = %d\n", header->m_IndexSize); printf("m_DataOffset = %x\n", header->m_DataOffset); printf("m_Priority = %x\n", header->m_Priority); printf("m_Flags = %x\n", header->m_Flags); printf("m_CreatorId = %.4s\n", header->m_CreatorId); printf("m_IndexCRC32 = %x\n", header->m_IndexCRC32); printf("m_DataCRC32 = %x\n", header->m_DataCRC32); printf("m_CopyrightText = %ls\n", header->m_CopyrightText); printf("m_BuildText = %ls\n", header->m_BuildText); printf("m_TitleText = %ls\n", header->m_TitleText); printf("m_AuthorText = %ls\n", header->m_AuthorText); } void print_dirset(DirSet *dirset) { int i = 0; for (i = 0; i < dirset->m_Count; i++) printf("Dir\n"); } void print_fileset(char *mapping, FileSet *fileset, int DataOffset) { int i = 0; int j = 0; FileEntry *fileentry = NULL; CompressedHeader *CompHead = NULL; char *data = NULL; uLongf ldest = 0; int fd; HANDLE hFile; DWORD nb; for (i = 0; i < fileset->m_Count; i++) { printf(" == FileEntry == \n"); fileentry = (FileEntry*)((char*)fileset + fileset->m_Offsets[i]); printf("m_ParentOffset = %x\n", fileentry->m_ParentOffset); printf("m_Size = %d\n", fileentry->m_Size); printf("m_Offset = %x\n", fileentry->m_Offset); printf("m_CRC32 = %x\n", fileentry->m_CRC32); printf("m_Format = %d\n", fileentry->m_Format); printf("m_Flags = %d\n", fileentry->m_Flags); printf("m_Name.len = %d\n", fileentry->m_Name.len); printf("Name = "); for (j = 0; j < fileentry->m_Name.len; j++) printf("%c", fileentry->m_Name.name[j]); printf("\n"); CompHead = (CompressedHeader*)((char*)&fileentry->m_Name + align4(fileentry->m_Name.len + 3)); printf("m_CompressedSize = %d\n", CompHead->m_CompressedSize); printf("m_ChunkSize = %d\n", CompHead->m_ChunkSize); data = malloc(fileentry->m_Size * sizeof(char)); if (data == NULL) { printf("[-] malloc failed\n"); break; } ldest = fileentry->m_Size; uncompress(data, &ldest, mapping + DataOffset + fileentry->m_Offset, CompHead->m_CompressedSize); hFile = CreateFileA(fileentry->m_Name.name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); if (hFile == INVALID_HANDLE_VALUE) { printf("[-] Echec lors de l'ouverture du fichier\n"); break; } WriteFile(hFile, data, fileentry->m_Size, &nb, 0); CloseHandle(hFile); free(data); } } int main(void) { HANDLE hFile, hMapp; char *mapping = NULL; ds_header *header = NULL; DirSet *dirset = NULL; FileSet *fileset = NULL; hFile = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if (hFile == INVALID_HANDLE_VALUE) { printf("[-] Echec lors de l'ouverture du fichier\n"); return (0); } hMapp = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL); mapping = (char*)MapViewOfFile(hMapp, FILE_MAP_READ, 0, 0, 0); if (mapping == NULL) { printf("[-] Echec lors du mapping du fichier\n"); goto error; } header = (ds_header*)mapping; print_header(header); dirset = (DirSet*)(mapping + header->m_DirSetOffset); print_dirset(dirset); fileset = (FileSet*)(mapping + header->m_FileSetOffset); print_fileset(mapping, fileset, header->m_DataOffset); return (0); error: CloseHandle(hMapp); CloseHandle(hFile); return (1); }