Предположим, что нам необходимо восстановить доступ к файловой базе данных 1С Предприятие. Как правило в таких случаях проводят некоторые манипуляции с паролями (либо брутфорсят, либо сбрасывают). Мене захотелось немного усложнить задачу и пойти другим путем — назначить обычному пользователю права администратора.
Для начала посоветую почитать о формате файла 1С. Сделать это можно здесь.
Итак, нам потребуется шестнадцатеричный редактор. Я использовал HIEW. Запускаем редактор и открываем файл 1Cv8.1CD. Переходим по смещению 0х4000 — это корневой объект конфигурации. Первые 32 байта код языка базы. Затем количество блоков(4 байта), и собственно сами адреса блоков. Начинаем искать таблицу V8USERS. У меня она была в 7 блоке, то есть со смещением 0x8E000 (00 00 00 8E 000, читаем с права налево, в конце добавляем 000).
![](https://habrastorage.org/r/w1560/files/aae/f4e/46a/aaef4e46a3a54f7685d49762d6b8a61e.png)
Переходим по этому адресу и видим
![](https://habrastorage.org/r/w1560/files/6e7/80a/86a/6e780a86a82345669c8fc7db0f09c0d4.png)
Перейдя по 0x91000 видим
![](https://habrastorage.org/r/w1560/files/5a7/fef/ca1/5a7fefca10654743b94f7521a7373103.png)
А уже по адресу 0x92000 находится описание таблицы. Просчитать длину полей можно как описывалось в статье которую я приводил выше, скажу только что длина записи равна 697 (0x2B9) байт, а смещение поле DATA — 678 (0x2A6) байт.
В конце описания таблицы видим три числа. Первое — адрес данных, второе — адрес Blob-данных, третье — индексы.
![](https://habrastorage.org/r/w1560/files/ea8/fe2/8b4/ea8fe28b404a41b5af53910d04b89bc2.png)
143 = 0x8F (адрес данных 0x8F000), 144 = 0x90 (адрес Blob-данных 0x90000).
Идем в данные. Там нас отправят в 0x193000, затем в 0x194000 (кстати, там может быть не по одному блоку как у меня, а несколько. Зависит от количества пользователей).
![](https://habrastorage.org/r/w1560/files/e5b/da4/282/e5bda4282d094f09b295ee6d74eab0f5.png)
![](https://habrastorage.org/r/w1560/files/649/220/34d/64922034d98c4d01b9aa84550252d3e6.png)
В вот мы в данных таблицы V8USERS. Первый блок длинной 697 байт пустой, дальше у меня шел пустой пользователь, затем пользователь Admin.
![](https://habrastorage.org/r/w1560/files/33b/ae0/e5c/33bae0e5c36a46c6b92589fc043ae53e.png)
Переместимся ещё на 0x2A6 байта. Это номер блока в Blob-данных.
![](https://habrastorage.org/r/w1560/files/437/ef9/70d/437ef970df394cf68d073c6ba191cc01.png)
Далее идем в Blob-данные (0x90000). От туда переходим в 0x195000, затем в 0x196000.
Нулевой блок Blob-данных пустой (размер блока 256 (0xFF) байт, первые 4 байта адрес следующего блока, если данные не влезли в один блок, затем 2 байта — размер блока, остальное сами данные). Нам нужен второй блок.
![](https://habrastorage.org/r/w1560/files/109/245/9d7/1092459d70064083a105d8315bca85ea.png)
Копируем эти данные в файл (в HIEW клавиша F2) и переходим к следующему блоку.
![](https://habrastorage.org/r/w1560/files/df7/61c/c91/df761cc9153a4ae7903da69e34fc333b.png)
Данные из него копируем в тот же файл.
Такие же манипуляции проводим с пользователем, пароль которого мы знаем. Полученные файлы можно открыть с помощью вот этой программы (спасибо пользователю Decker за алгоритм дешифровки)
Получим два вот таких файла
![](https://habrastorage.org/r/w1560/files/2dd/0ce/ab9/2dd0ceab9f724505a8cc8642f44b5003.png)
![](https://habrastorage.org/r/w1560/files/fba/80a/bed/fba80abed418467aaf3ed01eb112391a.png)
В принципе можно заменить роль пользователя User на роль Admin-а. В этом случае размер записи изменится не должен, но я просто добавил пользователю админскую роль.
![](https://habrastorage.org/r/w1560/files/f37/43c/b15/f3743cb15646491b8caacd5d03dde64f.png)
Дальше сохраняем в файл и с помощью редактора копируем данные в 1Cv8.1cd, в те же блоки из которых мы их взяли. Помните, что копируем мы кусочками по 250 (00-F9). Если, как в моем случае, размер данных изменился, не забываем изменить размер последнего блока. Возможно придется добавить ещё один блок, тогда нужно будет найти свободный блок и указать его номер.
Если все прошло гладко (у меня с первого раза не получилось, так-что backup, backup и еще раз backup), можно заходить с учетной записью User, она теперь с полными правами.
По такой-же методике можно получить хэш пароля пользователя, что бы его расшифровать или заменить. Вот он.
![](https://habrastorage.org/r/w1560/files/3d4/78d/758/3d478d75886a46c285b5c8f723474d13.png)
И напоследок. Прошу не считать эту статью руководством по взлому. В интернете полно информации, как изменив 2 байта получить несанкционированный доступ к данным. Это и быстрее и проще. Я же показал принцип работы с таблицами базы на низком уровне, что может пригодится при восстановлении испорченной базы.
Для начала посоветую почитать о формате файла 1С. Сделать это можно здесь.
Итак, нам потребуется шестнадцатеричный редактор. Я использовал HIEW. Запускаем редактор и открываем файл 1Cv8.1CD. Переходим по смещению 0х4000 — это корневой объект конфигурации. Первые 32 байта код языка базы. Затем количество блоков(4 байта), и собственно сами адреса блоков. Начинаем искать таблицу V8USERS. У меня она была в 7 блоке, то есть со смещением 0x8E000 (00 00 00 8E 000, читаем с права налево, в конце добавляем 000).
![](https://habrastorage.org/files/aae/f4e/46a/aaef4e46a3a54f7685d49762d6b8a61e.png)
Переходим по этому адресу и видим
![](https://habrastorage.org/files/6e7/80a/86a/6e780a86a82345669c8fc7db0f09c0d4.png)
Перейдя по 0x91000 видим
![](https://habrastorage.org/files/5a7/fef/ca1/5a7fefca10654743b94f7521a7373103.png)
А уже по адресу 0x92000 находится описание таблицы. Просчитать длину полей можно как описывалось в статье которую я приводил выше, скажу только что длина записи равна 697 (0x2B9) байт, а смещение поле DATA — 678 (0x2A6) байт.
Скрытый текст
(так было на всех конфигурациях, которые я рассматривал, скорее всего так вообще в каждой конфигурации, так как V8USERS служебная таблица)
В конце описания таблицы видим три числа. Первое — адрес данных, второе — адрес Blob-данных, третье — индексы.
![](https://habrastorage.org/files/ea8/fe2/8b4/ea8fe28b404a41b5af53910d04b89bc2.png)
143 = 0x8F (адрес данных 0x8F000), 144 = 0x90 (адрес Blob-данных 0x90000).
Идем в данные. Там нас отправят в 0x193000, затем в 0x194000 (кстати, там может быть не по одному блоку как у меня, а несколько. Зависит от количества пользователей).
![](https://habrastorage.org/files/e5b/da4/282/e5bda4282d094f09b295ee6d74eab0f5.png)
![](https://habrastorage.org/files/649/220/34d/64922034d98c4d01b9aa84550252d3e6.png)
В вот мы в данных таблицы V8USERS. Первый блок длинной 697 байт пустой, дальше у меня шел пустой пользователь, затем пользователь Admin.
Скрытый текст
(в HIEW чтобы перейти к следующему пользователю F5, затем +2B9)
![](https://habrastorage.org/files/33b/ae0/e5c/33bae0e5c36a46c6b92589fc043ae53e.png)
Переместимся ещё на 0x2A6 байта. Это номер блока в Blob-данных.
![](https://habrastorage.org/files/437/ef9/70d/437ef970df394cf68d073c6ba191cc01.png)
Далее идем в Blob-данные (0x90000). От туда переходим в 0x195000, затем в 0x196000.
Нулевой блок Blob-данных пустой (размер блока 256 (0xFF) байт, первые 4 байта адрес следующего блока, если данные не влезли в один блок, затем 2 байта — размер блока, остальное сами данные). Нам нужен второй блок.
Скрытый текст
(0x196000 + 0x100 + 0x100)
![](https://habrastorage.org/files/109/245/9d7/1092459d70064083a105d8315bca85ea.png)
Копируем эти данные в файл (в HIEW клавиша F2) и переходим к следующему блоку.
![](https://habrastorage.org/files/df7/61c/c91/df761cc9153a4ae7903da69e34fc333b.png)
Данные из него копируем в тот же файл.
Скрытый текст
(для HIEW не забудьте указать смещение 0xFA).
Такие же манипуляции проводим с пользователем, пароль которого мы знаем. Полученные файлы можно открыть с помощью вот этой программы (спасибо пользователю Decker за алгоритм дешифровки)
Получим два вот таких файла
![](https://habrastorage.org/files/2dd/0ce/ab9/2dd0ceab9f724505a8cc8642f44b5003.png)
![](https://habrastorage.org/files/fba/80a/bed/fba80abed418467aaf3ed01eb112391a.png)
В принципе можно заменить роль пользователя User на роль Admin-а. В этом случае размер записи изменится не должен, но я просто добавил пользователю админскую роль.
![](https://habrastorage.org/files/f37/43c/b15/f3743cb15646491b8caacd5d03dde64f.png)
Дальше сохраняем в файл и с помощью редактора копируем данные в 1Cv8.1cd, в те же блоки из которых мы их взяли. Помните, что копируем мы кусочками по 250 (00-F9). Если, как в моем случае, размер данных изменился, не забываем изменить размер последнего блока. Возможно придется добавить ещё один блок, тогда нужно будет найти свободный блок и указать его номер.
Если все прошло гладко (у меня с первого раза не получилось, так-что backup, backup и еще раз backup), можно заходить с учетной записью User, она теперь с полными правами.
По такой-же методике можно получить хэш пароля пользователя, что бы его расшифровать или заменить. Вот он.
![](https://habrastorage.org/files/3d4/78d/758/3d478d75886a46c285b5c8f723474d13.png)
И напоследок. Прошу не считать эту статью руководством по взлому. В интернете полно информации, как изменив 2 байта получить несанкционированный доступ к данным. Это и быстрее и проще. Я же показал принцип работы с таблицами базы на низком уровне, что может пригодится при восстановлении испорченной базы.