Разбор обновления УРМ

Все вопросы по УРМ
Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

Разбор обновления УРМ

Сообщение Val » 15.01.2010 18:25

Частенько Криста предоставляет свои обновления без исходников. Для этих случаев была написана программа разбора такого обновления.
У меня не было никакой документации - анализировал содержимое файлов сам, так что могут быть недочеты.

Типичное обновление содержит файл files.dat и набор файлов update_XXX.
files.dat содержит описание файлов входящих в набор и некоторые данные о обновлении (номера версий, компрессия и т.п.).
updates_XXX - это порезанный на куски архив с самим обновлением.
1. Анализируем files.dat.
2. Склеиваем update_XXX
3. Разархивируем то что получилось и получаем файл (назовем его _PACKED_URM_UPDATE_.DAT).
Я сделал разархивирование только для обновлений, сжатых LZMA (при подготовке обновления в программе PatchCreator была установлена галка "Максимальное сжатие"). Формат сжатия для обычных обновлений (сделанных без галки "Максимальное сжатие") я понять не смог. Если у кого нибудь будут идеи - пишите.
Чтоб разархивировать обновление, которое не поддерживает моя прога - нужно на каталоге "URM_Update" в "безопасности" папки поставить запрет удаления файлов и подкаталогов и провести обновление обычным порядком, затем вытащить из папки URM_Update файл _PACKED_URM_UPDATE_.DAT и подсунуть каталог с ним моей проге вместо обновления.
Анализ файла files.dat
files_dat_001.gif

04ac - длина файла (4 байта)
23 - количество элементов (4 байта)
а8 - смещение данных (4 байта)
по смещению а8 начинаются данные
1 байт - тип записи(03,05,0f)
затем в зависимости от типа следует структура
если тип 03:
4 байта - длина имени
N байт - имя
4 байта - длина значения
M байт - значение

если тип 05:
4 байта - длина имени
N байт - имя
4 байта - значение

если тип 0f:
4 байта - длина имени
N байт - имя
4 байта - длина значения
M байт - значение
4 байта - значение1
4 байта - значение2

Анализ этого файла позволяет:
1. Узнать тип компрессии (если есть поле LZMA и значение=1, то используем LZMA, иначе неизвестный алгоритм)
2. Узнать количество и имена файлов - т.е. имена кусков на которое порезано обновление.
3. Узнать исходную и новую версию - я не использую
4. Сверить контрольные суммы файлов - я не использую
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

Re: Разбор обновления УРМ

Сообщение Val » 15.01.2010 19:18

После разархивации получаем файл _PACKED_URM_UPDATE_.DAT. Это microsoft compound file. С этим форматом работают word, excel, 1c и прочие мелкие программы :-) .
Как я допер? Посмотрел содержимое и сразу допер? Нет! Я еще до получения этого файла перехватывал вызовы API функций из PatchCreator и увидел вызов функции создания такого файла.
Для работы с этим типом файлов из под VB.net используем бесплатный модуль Edanmo's OLE Storage Classes For .net.
В данном файле нас интересует в первую очередь элемент с именем "0", в котором записана нужная нам информация. Сохраняем данный элемент в файл и анализируем его.
0.gif

68 - количество записей (4 байта)
5с - смещение данных (4 байта)
По смещению идут записи:
1 байт - тип записи (тут у всех 03)
4 байта - порядковый номер записи
4 байта - длина значения
N байт - значение

Все данные из этого файла надо прочитать и сохранить, они пригодятся далее.
Имя элемента в compound файле соответствует порядковому номеру записи в элементе "0". Посмотрев на содержимое элемента "0" мы понимаем, что теперь у нас есть настоящие имена файлов.
Продолжение следует
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

Re: Разбор обновления УРМ

Сообщение Val » 18.01.2010 17:21

Разбираем наш compound файл дальше.
Сразу после элемента "0" нам попадается элемент "1" с типом "1" (видимо хранилище 2го уровня). В ранее разобранном элементе "0" этому хранилищу соответствует имя RG. Логично предположить что он = каталогу, а все его содержимое - содержимому этого каталога.
Остальные элементы разбираем обычно.
В результате мы получаем:
1. кучу файлов upd_XXX
2. каталог RG, содержащий набор rg и xml файлов для подгрузки в реестр урм
3. файл updates.dat, содержащий набор описаний действий.

Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

Re: Разбор обновления УРМ

Сообщение Val » 18.01.2010 18:05

Разбираем файл updates.dat.
updates_dat.gif

41 - количество элементов (4 байта)
с8 - смещение данных (4 байта)
По смещению с8 находятся сами данные. Первый байт - тип данных.
тип 03:
4 байта - длина имени
N байт - имя
4 байта - длина значения
M байт - значение

тип 05:
4 байта - длина имени
N байт - имя
4 байта - длина значения
M байт - значение

тип 07:
4 байта - длина имени
N байт - имя
4 байта - длина значения
M байт - значение
4 байта - длина значения
NN байт - значение

тип 17:
4 байта - длина имени
N байт - имя
4 байта - длина значения
M байт - значение
4 байта - длина значения
NN байт - значение
4 байта - значение2

тип 2F:
4 байта - длина имени
N байт - имя
4 байта - длина значения
M байт - значение
4 байта - длина значения
NN байт - значение
4 байта - значение2
4 байта - значение3

Для примера рассмотрим запись с типом 17. Она расшифровывается "Создать новый файл из файла upd_83 и назвать его "Шаблоны\Новые Отчеты\Шаблоны БК\(30.01.43) Логический контроль заявки.критерии оценки.xlm".
На первом этапе просто разбираем этот файл в массив структур, а затем вызываем отдельную процедуру для осуществления действий.
Действия которые я обрабатывал:
CreateDir
CreateFile
PatchFile
RmFile
RmDir
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

Re: Разбор обновления УРМ

Сообщение Val » 18.01.2010 19:06

Отдельно рассмотрим самое сложное действие - PatchFile. Разбор файла действий для patch занял самое продолжительное время. Для него типичная запись в файле updates.dat - 31|9|PatchFile|6|upd_34|14|ocx\Tender.OCX... Файл upd_34 это файл действий, которые необходимо выполнить над ocx\Tender.ocx старой версии, чтоб получить ocx\Tender.ocx новой версии.
patch.gif

033A00 - размер выходного файла
Далее разбор по алгоритму:
читаем байт, если старший бит установлен - то тип 1, если не установлен - то тип 2.
если тип 1: читаем еще 4 байта - получаем 5 байт, старший бит в первом байте сбрасываем. Первые 2 байта - количество байт (в прямой записи), последние 3 байта - смещение.
P.S. тут я поделил по своему (2 байта и 3 байта), ошибок вроде нет.
Затем берем из исходного файла "количество" байт по "смещению" и пишем их в выходной поток.
если тип 2: первый байт - количество байт, далее идут данные. Берем "количество" байт данных и пишем их в выходной поток.
По завершении обработки можно сравнить размер выходного потока с тем размером, который записан в нашем файле описаний действий, так же можно сравнить CRC с CRC в файле updates.dat. Я этого пока не делал.
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

Re: Разбор обновления УРМ

Сообщение Val » 18.01.2010 19:18

Ну и собственно программа.
prog.gif

Папка обновления - задаем папку в которой должны лежать файлы files.dat и update_XXX ИЛИ compound файл (в эту папку копируем обновление, т.к. после работы программы начальные файлы будут УДАЛЕНЫ).
Папка версии УРМ до обновления - каталог со старой версией УРМ. Нужно только для действия patch. Если не указать, то действие patch выполнено не будет.
Использовать LZMA - если задан, то в папке "Папка обновления" будут искаться файлы files.dat и update_XXX и будут применены склейка и распаковка. Если не задан, то будет искаться copmound файл с именем "Имя compound файла". Как его получить - писал выше.
Логи без надобности лучше не трогать - сильно тормозят.
В результате мы получит набор файлов исходников обновления +
пустые файлы и каталоги "*.del" - значит было действие RmFile или RmDir.
файлы *.patch - файлы описаний для действия patch.
Эти файлы можно удалить.
Пример древа файлов получаемых при распаковке обновления 035900_037000

Код: Выделить всё

DataBase\
   budgetrm_empty.gdb
   budgetrm_empty.gdb.del
ocx\
   Agreements_masters.ocx
   Agreements_masters.ocx.patch
   BudgetNotify.ocx
   BudgetNotify.ocx.patch
   BudgetPromise.OCX
   BudgetPromise.OCX.patch
   copyright.txt
   copyright.txt.del
   cpOrgsEdit.OCX
   cpOrgsEdit.OCX.patch
   cpParams.ocx
   cpParams.ocx.patch
   ExecDocument.OCX
   ExecDocument.OCX.patch
   IncomesNotif.ocx
   IncomesNotif.ocx.patch
   OKDP.OCX
   OKDP.OCX.patch
   QManClient.OCX
   QManClient.OCX.patch
   Synchronize.OCX
   Synchronize.OCX.patch
   SysUtils.ocx
   SysUtils.ocx.patch
   TaskManager.OCX
   TaskManager.OCX.patch
   Tender.OCX
   Tender.OCX.patch
   UniReports.OCX
   UniReports.OCX.patch
   URM.tlb
   URM.tlb.del
   Viewers.OCX
   Viewers.OCX.patch
   XLSTransporter.OCX
   XLSTransporter.OCX.patch
RG\
   201.xml
   202.xml
   204.xml
   206.xml
   1901.xml
   2201.xml
   2203.xml
   {08F16109-75D7-4503-9967-1937907CBB5B}.xml
   {88399610-CA14-45C1-AC87-3E78740EB268}.xml
   {C5CBDC24-1BA1-4BA5-952D-137EB2E96FE3}.xml
   {D5DC1D27-5D36-4FC3-84FE-3B76264FE97F}.xml
   АнализКонтролируемойКлассификации.xml
   БК_ДоговораЛин.xml
   БК_КассовыйПланПБС.xml
   БК_ПланДоходов.xml
   БК_Роспись.xml
   БК_РосписьПоЗаимствованиям.xml
   БК_СБР_КассовыйПлан.xml
   БК_СметаДоходов.xml
   БК_СметаРасходов.xml
   Бюджет.xml
   Бюджетный контроль(логич.).xml
   ВычислитьСумму.xml
   ВычислитьСуммуКПИ.xml
   ВычислитьСуммуКПР.xml
   ЗапросыПланДоходов.xml
   ЗапросыРоспись.xml
   Копировать.xml
   КопироватьДокументы.xml
   КопироватьКПИ.xml
   КопироватьКПР.xml
   Название.xml
   НазваниеКПИ.xml
   НазваниеКПР.xml
   Параметры.xml
   ПланДоходов.xml
   ПоддержкаПроекта.xml
   ПоддержкаФорм_яПроверяемых.xml
   Справочники.xml
   Справочники2.xml
Шаблоны\
   Новые Отчеты\
      Документы\
         (02.01.07) Уведомление о бюджетных ассигнованиях по 3-лет. плану (расходы).xlc
         (19.01.02) Уведомление о бюджетных ассигнованиях по 3-лет. плану (источники).xlc
         (30.01.50) Заявка на размещение заказа.Часть1 (Заявка на размещение заказа).xlc
         (30.01.51) Заявка на размещение заказа.Часть2 (Предмет процедуры размещения заказа).xlc
         (30.01.52) Заявка на размещение заказа.Часть3 (Финансирование).xlc
         (30.01.53) Заявка на размещение заказа.Часть4 (Обеспечение заявки на участие в размещении заказа).xlc
         (30.01.54) Заявка на размещение заказа.Часть5 (Условия допуска к участию в размещении заказа).xlc
         (30.01.55) Заявка на размещение заказа.Часть6 (Критерии оценки).xlc
         (30.01.56) Заявка на размещение заказа.Часть7 (Преимущества, предоставляемые организациям).xlc
         (30.01.57) Заявка на размещение заказа.Часть8 (Обеспечение исполнения контракта).xlc
         (30.01.58) Заявка на размещение заказа.Часть9 (Существенные условия контракта).xlc
         (30.01.59) Заявка на размещение заказа.Часть10 (Срок заключения контракта).xlc
         (30.01.60) Заявка на размещение заказа.Часть11 (Представители заказчика).xlc
         (30.01.61) Заявка на размещение заказа.Часть12 (ФИО).xlc
         (30.01.62) Заявка на размещение заказа.Часть13 (Техническое задание).xlc
         (30.01.63) Заявка на размещение заказа.Часть14 (Проект муниципального контракта).xlc
      Шаблоны БК\
         (03.02.23.01) Контроль платежных документов по заявкам на самостоятельные закупки.xlm
         (25.01.16) Контроль спецификации контрактов по конкурсным заявкам.xlm
         (25.01.16.02) Контроль спецификации контрактов по заявкам на закупку с учетом способа закупки.xlm
         (25.02.12) Контроль бюджетных обязательств по заявкам на конкурсные закупки.xlm
         (25.02.13) Контроль бюджетных обязательств по заявкам на самостоятельные закупки.xlm
         (25.02.17.01) Контроль сметы договора по заявкам на закупку.xlm
         (25.02.17.02) Контроль сметы договора по заявкам на самостоятельные закупки.xlm
         (25.02.17.03) Контроль сметы договора по заякам на конкурсные закупки.xlm
         (25.03.07) Контроль сумм возвратного документа.xlm
         (25.03.10) Контроль документов исполнения по плану закупок.xlm
         (25.03.10.01) контроль документов исполнения по плану закупок_НУ.xlm
         (25.03.13) Контроль документов исполнения по заявкам на самостоятельные закупки.xlm
         (30.01.04) ЛогическийКонтрольЗаявкаНаЗакупку_Утвержденные.xlm
         (30.01.19) Контроль заявок по росписи (утвержденные суммы).xlm
         (30.01.22) Контроль уточнений к заявкам на закупку по исполнению с учетом способа закупки (заявленные суммы).xlm
         (30.01.23) Контроль уточнений к заявкам на закупку по исполнению с учетом способа закупки (утвержденные суммы).xlm
         (30.01.28) Контроль уточнений заявок на закупку по оплате с учетом способа закупок (заявленные суммы).xlm
         (30.01.29) Контроль уточнений заявок на закупку по оплате с учетом способа закупок (утвержденные суммы).xlm
         (30.01.30) Контроль уточнений заявок на соответствие итогам конкурсов.xlm
         (30.01.35) Логический контроль заявки.заголовок.xlm
         (30.01.36) Логический контроль заявки.лоты.xlm
         (30.01.37) Логический контроль заявки. Контактные лица.xlm
         (30.01.41) Логический контроль заявки.документы поставщика.xlm
         (30.01.42) Логический контроль заявки.условия допуска.xlm
         (30.01.43) Логический контроль заявки.критерии оценки.xlm
PostInstall.abl
UpdateInstaller.exe
val_text.txt


Внесены изменения. код будет позже.
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

Re: Разбор обновления УРМ

Сообщение Val » 27.10.2011 16:34

Изменилось основое окно программы.
update_main.gif

Добавлен флаг "Новый формат", т.к. в обновлении 05.02.00 - 05.02.01 новый формат файлов описаний. Признак новой версии - наличие в файле files.dat по смещению 4 строки "TRNс0" (шестн. 54524EF1).
Программа умеет распаковывать любой тип обновления (если при упаковке стоял флаг UseLZMA и если не стоял этот флаг).
В связи с изменениями и недостатком времени смещение данных в файлах описаний берутся из константы и количество записей высчитывается при разборе (для старой версии эти данные брались из файла описания).
У вас нет необходимых прав для просмотра вложений в этом сообщении.


Вернуться в «УРМ»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей

cron