DEMBEL | Дата: Понедельник, 09 Марта 2009, 09:44 | Сообщение # 2 |
Наш дизайнер
Группа: Модераторы
Сообщений: 2266
Репутация: 135
Награды: 32
Статус: Offline
| лучше на что нибудь полезное свои силы направь, тут кому надо он и сам все извлечет, изменит, распакует sl и все что захочет. а то будут потом баловаться все кому не лень...
Win7x64 SP1 Neobook v5.70 (Trial) WinXP SP3 Neobook v5.62
|
|
| |
Sower | Дата: Понедельник, 09 Марта 2009, 09:48 | Сообщение # 4 |
Ветеран форума
Группа: Проверенные
Сообщений: 916
Репутация: 11
Награды: 3
Статус: Offline
| Quote (toizy) В смысле версию? не понял... Ну версию MMB, где был сделан проект! mbd файла!!!
Сообщение отредактировал Grand - Понедельник, 09 Марта 2009, 09:49 |
|
| |
toizy | Дата: Понедельник, 09 Марта 2009, 10:03 | Сообщение # 8 |
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
| Кстати, в ридми написано, что если меняем версию 30 на более низкую, то нужно удалить строку Created... На самом деле, эта строка ни на что не влияет, и проект будет открыт как ни в чём не бывало. Зато можно случайно удалить кое-что нужное... А идея сделать определитель версии и защищённости на ММВ интересная Щас я тебе маленько помогу
Жизнь оказалась не такой уж и забавной, как поначалу...
|
|
| |
toizy | Дата: Понедельник, 09 Марта 2009, 17:08 | Сообщение # 10 |
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
| Не, прям щас не помогу - файл с моими заметками я оставил на домашнем компьютере. Схожу на обед, заберу Добавлено (09 Март 2009, 17:07) --------------------------------------------- Вот соответствие идентификаторов проекта версиям файла, смещения заголовка окна, пароля и флага защиты. Всё в коде делфи, но ты разберёшься. Code type TMBDVer = ( {0} MMBuilder00, {1} MMBuilder5, {2} MMBuilder8, {3} MMBuilder10, {4} MMBuilder11, {5} MMBuilder13, {6} MMBuilder14, {7} MMBuilder15, {8} MMBuilder16, {9} MMBuilder17, {10} MMBuilder24, {11} MMBuilder25, {12} MMBuilder26, {13} MMBuilder27, {14} MMBuilder28, {15} MMBuilder29, {16} MMBuilder30);
var VerNum: array[TMBDVer] of string = ( {0} '', {1} 'MMBuilder5', {2} 'MMBuilder8', {3} 'MMBuilder10', {4} 'MMBuilder11', {5} 'MMBuilder13', {6} 'MMBuilder14', {7} 'MMBuilder15', {8} 'MMBuilder16', {9} 'MMBuilder17', {10} 'MMBuilder24', {11} 'MMBuilder25', {12} 'MMBuilder26', {13} 'MMBuilder27', {14} 'MMBuilder28', {15} 'MMBuilder29', {16} 'MMBuilder30');
VerDsc: array[TMBDVer] of string = ( {0} 'Unknown (?)', {1} 'Unknown (MMBuilder5)', {2} 'Unknown (MMBuilder8)', {3} 'Unknown (MMBuilder10)', {4} '4.0\4.4', {5} '4.6\4.7', {6} '4.8.0.1\4.8.2\4.8.3', {7} 'Unknown (MMBuilder15)', {8} 'Unknown (MMBuilder16)', {9} '4.9.0.1', {10} 'Unknown (MMBuilder24)', {11} 'Unknown (MMBuilder25)', {12} 'Unknown (MMBuilder26)', {13} '4.9.5\4.9.6', {14} '4.9.7', {15} '4.9.8.5', {16} '4.9.8.13');
CaptionOffset: array[TMBDVer] of DWORD = ( {0} 0, {1} 11, {2} 47, {3} 52, {4} 52, {5} 56, {6} 56, {7} 56, {8} 56, {9} 56, {10} 56, {11} 56, {12} 56, {13} 56, {14} 56, {15} 56, {16} 56);
PassOffset: array[TMBDVer] of DWORD = ( // пароль появился в версии 4.0 (?) {0} 0, {1} 0, {2} 0, {3} 0, {4} 16, {5} 16, {6} 16, {7} 16, {8} 16, {9} 16, {10} 16, {11} 16, {12} 16, {13} 16, {14} 16, {15} 16, {16} 16);
PackedMBDOffset: array[TMBDVer] of DWORD = ( // SL - начиная с версии 4.6 {0} 0, {1} 0, {2} 0, {3} 0, {4} 0, {5} 24, {6} 24, {7} 24, {8} 24, {9} 24, {10} 24, {11} 24, {12} 24, {13} 24, {14} 24, {15} 24, {16} 24); Тут характеристики всех найденных мною версии ММВ, так что вперёд и с песнями. Добавлено (09 Март 2009, 17:08) --------------------------------------------- На всякий случай, вот кусок кода из дебаггера, процедура анализа файла. Приведу целиком, сам разберись, что к чему, тут не сложно Code function Analyze(FileName: string): Boolean; var FLen: Byte; str: string; fs: PStream; MBDVer: string; begin Result := False; // Очищаем запись MBDFile.Caption := ''; MBDFile.Filename := ''; MBDFile.HeaderLen := 0; MBDFile.Header := ''; MBDFile.Offset := 0; MBDFile.PackedSize := 0; MBDFile.Password := ''; MBDFile.SecureLayer := False; MBDFile.Size := 0; MBDFile.UnpackedSize := 0; MBDFile.Version := MMBuilder00;
if not FileExists(Filename) then begin ShowMsg('Исходный файл не существует!', MB_OK or MB_ICONERROR or MB_TASKMODAL); Exit; end; MBDFile.Filename := Filename; MBDFile.Offset := GetImageSize(Filename); // Читаем поля версии if MBDFile.Offset <> 0 then FileVersionInfo(MBDFile.Filename); // Проверяем, сжат ли файл if MBDFile.Offset <> 0 then begin MBDFile.UPXStatus := usUnknown; str := GetDosOutput(GetStartDir + 'upx.exe', ' -t "' + Filename + '"'); if FindInList(str, 'NotPackedException') then MBDFile.UPXStatus := usNotPacked else if FindInList(str, 'CantUnpackException') then MBDFile.UPXStatus := usUnknown else if FindInList(str, '[OK]') then MBDFile.UPXStatus := usPackedOk; end; //if
fs := NewReadFileStream(Filename); MBDFile.Size := fs.Size; // Перемещаемся на смещение пректа fs.Position := MBDFile.Offset; // Читаем длину идентификатора и идентификатор fs.Read(MBDFile.HeaderLen, SizeOf(MBDFile.HeaderLen)); SetLength(MBDVer, MBDFile.HeaderLen); fs.Read(MBDVer[1], MBDFile.HeaderLen); MBDFile.Header := MBDVer; // 1 -> if Copy(MBDVer, 1, 9) <> 'MMBuilder' then ShowMsg('Файл не является проектом MMB!', MB_OK or MB_ICONERROR or MB_TASKMODAL) else begin // Получаем версию проекта GetMBDVersion(MBDVer); // if MBDFile.Version = MMBuilder00 then ShowMsg('Файл имеет неподерживаемую версию!', MB_OK or MB_ICONERROR or MB_TASKMODAL) else begin Result := True; // Читаем флаг сжатия fs.Read(MBDFile.SecureLayer, SizeOf(MBDFile.SecureLayer)); // Поправляем флаг, если используется версия 4.4 if MBDFile.Version <= MMBuilder11 then MBDFile.SecureLayer := False; // if MBDFile.SecureLayer then begin // UnpackedSize, PackedSize try fs.Position := MBDFile.Offset + PackedMBDOffset[MBDFile.Version] - 8; fs.Read(MBDFile.UnpackedSize, SizeOf(MBDFile.UnpackedSize)); fs.Read(MBDFile.PackedSize, SizeOf(MBDFile.PackedSize)); finally end; end else begin // Получаем заголовок окна try fs.Position := MBDFile.Offset + CaptionOffset[MBDFile.Version]; fs.Read(FLen, SizeOf(FLen)); SetLength(MBDFile.Caption, FLen); fs.Read(MBDFile.Caption[1], FLen); finally end;
// Пароль if MBDFile.Version >= MMBuilder11 then begin try // Получаем пароль fs.Position := fs.Position + PassOffset[MBDFile.Version]; fs.Read(FLen, SizeOf(FLen)); SetLength(MBDFile.Password, FLen); fs.Read(MBDFile.Password[1], FLen); finally end;
// Декодируем пароль try MBDFile.Password := DecodePass(MBDFile.Password); finally end; end; //if
end; //if end; //if end; //if MBDFile.Version = MMBuilder00 then // <- 1
fs.Free; end;
Жизнь оказалась не такой уж и забавной, как поначалу...
|
|
| |
Sower | Дата: Воскресенье, 26 Апреля 2009, 08:01 | Сообщение # 11 |
Ветеран форума
Группа: Проверенные
Сообщений: 916
Репутация: 11
Награды: 3
Статус: Offline
| Спасибо! Добавлено (26 Апрель 2009, 08:01) ---------------------------------------------
Я вот погладел,и честно скажу, что почти нифига не понял (извните за выражения) в коде, но хотя есть озарение, toizy, можешь объяснить по порядку, хотябы основное, плизз ЗАРаНЕЕ СПАСИБО!!!
|
|
| |