Сейчас на форуме: (+7 невидимых)

 eXeL@B —› Вопросы новичков —› Документация к .fmt файлам WinRAR'а
Посл.ответ Сообщение

Ранг: 1.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 27 апреля 2014 14:20
· Личное сообщение · #1

Здравствуйте,

WinRAR - отличная прога, у которой в папке formats (в 4-ой версии) есть библиотеки для чтения различных форматов. Занимался ли кто их reverse engineering'ом? Очень нужны hearder'ы к функциями Prepare и Extract, потому что в отличии от свободно распространяемых библиотек, библиотеки WinRAR'а всеядны.



Ранг: 512.7 (!), 360thx
Активность: 0.270.03
Статус: Модератор

Создано: 27 апреля 2014 22:55
· Личное сообщение · #2

RAR 5.0 archive format

Here we describe basic data structures of archive format introduced in RAR 5.0. If you need information about algorithms or more detailed information on data structures, please use UnRAR source code.

http://www.rarlab.com/technote.htm



Ранг: 1.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 02 мая 2014 11:04
· Личное сообщение · #3

sendersu
это не совсем то, о чём я спрашивал.
Меня интересовали заголовочные файлы к formats\iso.fmt в 4-ой версии WinRAR'а.
Или реализация подобной библиотеки (для чтения iso-файлов) в открытых исходных кодах.
Вот что удалось поднять за 2 ночи разбора из iso.fmt, чтобы она начала, наконец, извлекать файлы.

Code:
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <stdio.h>
  4. #include <tchar.h>
  5. #include <Windows.h>
  6.  
  7. wchar_t *out_filename, *in_iso, *in_filename;
  8.  
  9. // --- INNER WINRAR REVERSE ENGENEERED STRUCTURES -------------------------------------------------
  10.  
  11. const DWORD fmt_ver = 0x1D8;
  12.  
  13. struct prepare_data {
  14.          const DWORD *ver; // *ver == 0x1D8 // 0x000
  15.          DWORD data1; // := 1; // 0x004
  16.          DWORD skip1[4]; // 0x008
  17.          DWORD data2[10]; // 0x018
  18.          char  skip2[0x40]; // 0x040
  19.          DWORD flag; // := 1; // 0x080
  20.          char  skip3[0x94]; // 0x084
  21.          DWORD dataZ; // := 0x6F7369 // 0x118
  22. };
  23.  
  24. struct getlistitem_data {
  25.          char reserved[0x400];
  26.          wchar_t filename[0x600];
  27.          int reserved2[6];
  28. };
  29.  
  30. struct extract_data {
  31.          char filename[0x400];
  32.          wchar_t filename_w[0x800];
  33. };
  34.  
  35. typedef BOOL (__stdcall *fmt_open)(char* isofilename, wchar_t* isofilenamew, char* header, size_t header_size); // header_size = = 0x100000
  36. typedef BOOL (__stdcall *fmt_getlistitem)(getlistitem_data* data, char* unk); // unk = NULL
  37. typedef BOOL (__stdcall *fmt_extract)(extract_data* isofilename);
  38. typedef BOOL (__stdcall *fmt_close)(void* cookie);
  39. typedef BOOL (__stdcall *fmt_prepare)(void* func_ptr, prepare_data* arg2);
  40.  
  41. int  __stdcall fmt_callback58E4(DWORD arg1, DWORD arg2, DWORD arg3, DWORD arg4, DWORD arg5, DWORD arg6, DWORD arg7) {
  42.          return 0; // if == 0x43 then abort
  43. }
  44.  
  45. BOOL __stdcall fmt_callback5914(DWORD arg1, wchar_t* out_filename, DWORD arg3, size_t buffer_size) {
  46.          wcscpy(out_filename, ::out_filename); // can change name
  47.          return 1; // check retval = 1
  48. }
  49. void __stdcall fmt_callback58FC(DWORD arg1, DWORD arg2, DWORD arg3) {
  50.          __asm {
  51.                  mov bl, 0
  52. #ifdef _DEBUG
  53.                  mov byte ptr [esp+8],0     // works for debug version only. Function needs to set BL to zero
  54. #else
  55.                  mov byte ptr [esp], 0
  56. #endif
  57.          };
  58. }
  59. void __stdcall fmt_callback58DC(DWORD arg1) {}
  60. void __stdcall fmt_callback58E0(DWORD arg1, DWORD arg2, DWORD arg3, DWORD arg4, DWORD arg5) {}
  61. void __stdcall fmt_callback58F8(DWORD arg1, DWORD arg2, DWORD arg3) {}
  62. void __stdcall fmt_callback5904(DWORD arg1, DWORD arg2) {}
  63. void __stdcall fmt_callback5900(DWORD arg1, DWORD arg2, DWORD arg3, DWORD arg4, DWORD arg5) {}
  64. BOOL __stdcall fmt_callback58F0() {
  65.          return FALSE;
  66. }
  67.  
  68. BOOL __stdcall fmt_callback58D4(char* isofilename, void* memptr, wchar_t* filename) {
  69.          // if true then extract
  70.          if (!wcscmp(filename, in_filename))
  71.                  return TRUE;
  72.          return FALSE;
  73. }
  74.  
  75. #define NULL4 NULL,NULL,NULL,NULL
  76. #define NULL8 NULL4, NULL4
  77. #define NULL10 NULL8, NULL8
  78. #define NULL20 NULL10, NULL10
  79. #define NULL40 NULL20, NULL20
  80.  
  81. DWORD __stdcall bad_callback() {
  82.          __asm {int 3}; // something went wrong...
  83. }
  84.  
  85. void* fmt_func_ptr[] = {
  86.          (void*)0x148,     fmt_callback58D4, bad_callback,     fmt_callback58DC,
  87.          fmt_callback58E0, fmt_callback58E4,         bad_callback,     bad_callback,
  88.          fmt_callback58F0, bad_callback,     fmt_callback58F8, fmt_callback58FC,
  89.          fmt_callback5900, fmt_callback5904, bad_callback,     bad_callback,
  90.          bad_callback,     fmt_callback5914, bad_callback,     bad_callback,
  91.          bad_callback,     bad_callback,     bad_callback,
  92.          NULL10, NULL8, NULL4,
  93.          (void*)0x602,
  94.          NULL40, NULL20, NULL10, NULL8, NULL4
  95. };
  96. // 0x52 / 4 = 20 functions
  97. // start address == 58D0
  98.  
  99. // ------------------------------------------------------------------------------------------------
  100.  
  101. int _tmain(int argc, _TCHAR* argv[])
  102. {
  103.          // parameters
  104.          in_iso = argv[1];
  105.          in_filename = argv[2];
  106.          out_filename = argv[3];
  107.  
  108.          bool success;
  109.          HMODULE hlib = LoadLibrary(_T("iso.fmt"));
  110.          fmt_prepare prepare = (fmt_prepare)GetProcAddress(hlib, "Prepare");
  111.          fmt_extract extract = (fmt_extract)GetProcAddress(hlib, "Extract");
  112.  
  113.          prepare_data pdata;
  114.          memset(&pdata, 0, sizeof(prepare_data));
  115.          pdata.ver = &fmt_ver;
  116.          success = !!prepare(fmt_func_ptr, &pdata);
  117.  
  118.          extract_data edata;
  119.          memset(&edata, 0, sizeof(extract_data));
  120.          WideCharToMultiByte(CP_ACP, 0, in_iso, -1, edata.filename, sizeof(edata.filename), NULL, NULL);
  121.          wcscpy(edata.filename_w, in_iso);
  122.  
  123. #if 1
  124.          fmt_open open = (fmt_open)GetProcAddress(hlib, "Open");
  125.          size_t size = 0x100000;
  126.          char *buffer = new char[size];
  127.          FILE *= fopen(edata.filename, "rb");
  128.          fread(buffer, 1, size, f);
  129.          fclose(f);
  130.          success = !!open(edata.filename, in_iso, buffer, size);
  131. #else
  132.          // above code equivalent
  133.          __asm {
  134.                  MOV BYTE PTR DS:[69B758CDh],1
  135.          }
  136. #endif
  137.  
  138.          success = !!extract(&edata);
  139.  
  140.          return 0;
  141. }


Добавлено спустя 6 минут
Но, к сожалению, библиотека iso.fmt только лишь последовательно извлекает файлы из iso-образа. Мне же нужна поддержка перехода (seek) по файлу внутри образа.
Есть ли подобные библиотеки, которые бы либо позволяли читать файлы из iso-образа, начиная с заданной позиции, либо возвращали вектор смешений блоков одного файла в iso-образе вместе с размерами этих блоков.

P.S. Странно, что тема попала в раздел новичков, но, думаю, профессионалы здесь тоже появляются.

Добавлено спустя 34 минуты
В 10-ый раз загуглив, наконец, нашёл, что искал:
libdvdread + набор патчей для mplayer.
Вот один из них: http://lists.mplayerhq.hu/pipermail/dvdnav-discuss/attachments/20090927/60a9b9fa/attachment-0001.txt
( http://lists.mplayerhq.hu/pipermail/dvdnav-discuss/2008-September/000796.html )



Ранг: 19.4 (новичок), 11thx
Активность: 0.020
Статус: Участник

Создано: 02 мая 2014 12:00
· Личное сообщение · #4

slavanap пишет:
Или реализация подобной библиотеки (для чтения iso-файлов) в открытых исходных кодах.

Не знаю, пойдёт ли, но исходники там есть: --> Link <--


 eXeL@B —› Вопросы новичков —› Документация к .fmt файлам WinRAR'а
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати