Zennoposter ошибка при работе с файлом

Обновлено: 05.07.2024

Итак, перед нами "мёртвая" файловая база. Задача, которая стоит перед нами на текущий момент - всесторонне обследовать базу, составить максимально полный перечень проблемных мест (ошибок). Одной из распространённых ошибок у начинающих специалистов является следующая: они либо сразу и надолго "ныряют" в содержимое файла базы в hex-редакторе, пытаясь вручную разобраться в тоннах байт, что, естественно, через некоторое время вызывает эффект отторжения, либо, попробовав один какой-нибудь инструмент, и получив неудачу, выдают заключение: "База не подлежит ремонту". Лично я считаю, что к услугам hex-редактора нужно прибегать только в исключительных случаях, либо изредка, на минутку, например, чтобы своими глазами посмотреть содержимое, находящееся по определённому смещению.
А перечень инструментов и приёмов для получения информации о проблемных местах вообще довольно широк, причём даже сама платформа 1С предоставляет, как минимум, два штатных способа. Рассмотрим их поподробнее.

1. Утилита chdbfl.exe из поставки 1С:Предприятие. Запускаем её с установленной галкой "Исправлять обнаруженные ошибки".

Утилита chdbfl.exe

Сразу хочу оговориться, что на данном этапе эта утилита будет использоваться нами исключительно для диагностики, поэтому, даже если она и выдаст нам какой-то изменённый, якобы отремонтированный файл базы, мы не имеем на него каких-то видов, и просто "выкидываем". Однако, внимательно изучаем протокол работы и фиксируем перечень ошибок, найденных этой утилитой.
Например, "Поврежден заголовок файла базы данных" чаще всего означает просто некорректно записанную в нём длину файла в блоках, а не полное его разрушение (чтобы в этом убедиться, достаточно на пару секунд обратиться к hex-просмотрщику или редактору, если в начале файла сигнатура 1CDBMSV8 на месте, значит, проблема только в поле длины). "Повреждено содержимое внутреннего файла " означает, что в корневом объекте существуют "битые записи", с некорректными номерами блоков заголовков, либо с испорченными блоками заголовков. И так далее.

Пример файла ТЖ

1С:Предприятие начинает загрузку базы с чтения содержимого системных таблиц. Системными таблицами являются:
V8USERS - таблица с данными пользователей (для баз версий 8.2 и выше)
DBSCHEMA - схема (структура) БД
_USERSWORKHISTORY - история работы пользователей
_COMMONSETTINGS, _FRMDTSETTINGS, _REPSETTINGS, _REPVARSETTINGS, _SYSTEMSETTINGS - хранилища различных настроек
а также системные таблицы-каталоги:
PARAMS - содержит файлы с параметрами БД
FILES - содержит прочие системные (служебные) файлы
CONFIG - содержит файлы конфигурации БД. Здесь же, в файлах с названиями вида GUID.GUID хранятся конфигурации поставщика (отсутствие таковых является нормальной ситуацией, означающей, что либо конфигурация полностью совпадает с типовой (не включен режим изменения), либо она снята с поддержки, либо является самописной).
CONFIGSAVE - содержит файлы основной конфигурации. Отсутствие записей в ней является нормальной ситуацией, означающей, что основная конфигурация полностью совпадает с конфигурацией БД. Стоит отметить, что здесь могут содержаться не все файлы конфигурации, а только изменённые (отличающиеся от файлов конфигурации БД).
Системные таблицы-каталоги являются, по сути, аналогами каталога в обычной файловой системе, т.е. являются хранилищем некоторого набора файлов, и имеют следующие поля:
FILENAME - имя файла
CREATION/MODIFIED - дата создания/изменения
ATTRIBUTES - атрибуты
DATASIZE - размер файла
BINARYDATA - содержимое файла (двоичные данные)


Теперь мы понимаем, что записи в ТЖ типа
22:42.0169-1,DBV8DBEng,2,process=1cv8,Trans=0,Func=selectFileName,FileName=ibparams.inf
22:42.0170-3,DBV8DBEng,1,process=1cv8,Trans=0,Func=readFile,CatName=Params,FileName=ibparams.inf
означают чтение файла "ibparams.inf" из таблицы PARAMS.


3. Открываем нашу базу при помощи утилиты Tool_1CD. Здесь мы можем просмотреть таблицы, а также их содержимое (данные записей), причём для системных таблиц (DBSCHEMA, PARAMS и т.д.) поддерживается автоматическая распаковка содержимого BLOB-полей, вплоть до показа содержимого упакованных контейнеров (в таблицах CONFIG и CONFIGSAVE). Наиболее пристальное внимание уделяем тем проблемным объектам, которые были нами найдены по результатам действий из пунктов 1 и 2, а также системным таблицам (хотя, зачастую список проблемных объектов, составленный по п. 1 и 2, ограничивается именно системными таблицами).

Просмотр содержимого таблиц в Tool_1CD


При просмотре перечня таблиц смотрим, есть ли таблицы с окончаниями "OG" - их наличие означает, что крах базы произошёл при ТиИ или реструктуризации (в процессе выполнения этих операций 1С создаёт новые таблицы с такими окончаниями, куда пишутся данные реструктуризованных таблиц, затем исходная таблица удаляется, а новой назначается исходное имя). Также бывает полезно сравнить перечень таблиц с содержимым старого бэкапа (при его наличии, и при условии, что конфигурация не обновлялась, иначе состав таблиц, связанных с метаданными, конечно, будет различаться), это поможет выявить отсутствующие таблицы.
При просмотре таблицы CONFIG обращаем внимание, есть ли в ней файлы с окончаниями ".new" - их наличие означает, что крах базы произошёл при обновлении конфигурации БД.
Также утилита позволяет сохранить конфигурацию БД в cf-файл, что и рекомендуется сделать. Загружаем далее эту конфигурацию из файла в пустую базу, и пробуем запустить. Если всё запустилось успешно, значит, проблема нашей базы не в конфигурации.

Просмотр содержимого таблиц в ViewRecords.epf

5. Загрузка базы в систему восстановления баз 1С restoration-base-1c8. По состоянию дел на текущий момент, в данном продукте многие функции не реализованы, а некоторые, на мой взгляд, реализованы не совсем прозрачно. Кроме того, практически вся смысловая обработка данных происходит на стороне 1С, что далеко не лучшим образом сказывается на быстродействии. Например, у меня полная загрузка файла размером 230 Мб длилась около часа, за это время я уже всесторонне обследовал базу другими инструментами, и приступил к непосредственному ремонту. Окончания же загрузки файла размером 1,5 Гб я вообще не дождался - закончилось терпение. Ещё один нюанс: поскольку система является конфигурацией для 1С, то все данные исходной базы загружаются также в базу 1С, но оказываются они в табличной части одного справочника. Следовательно, даже не принимая во внимание скорость загрузки, в случае файловой базы не получится загрузить файл с исходной базой размером более 4 Гб (из-за ограничений формата). Тем не менее, проект является свободным, с открытым кодом, доступным для изменения и доработки, поэтому не могу не упомянуть про него.

Загрузив нашу базу в систему restoration-base-1c8, мы можем иследовать список таблиц:

Система restoration-base-1c8 - основное окно

а также просмотреть и отредактировать данные любого блока во встроенном hex-редакторе:

Система restoration-base-1c8 - редактирование содержимого блока

Просмотр записей таблиц, к сожалению, не реализован.

На этом наш список, а также сам этап обследования заканчивается. Аккуратно фиксируем и систематизируем всю собранную информацию, которую мы будем использовать далее, в процессе "лечения". Конкретные, наиболее типичные проблемные ситуации и способы их устранения будут рассмотрены в следующих статьях.

Если в каком-то из экшенов возникает ошибка или выход из кубика происходит по красной ветке, то выполнение проекта перейдёт в блок, который привязан к действию Bad End. Это необходимо для того, чтобы можно было задать какие-то дополнительные действия в случае завершения работы шаблона с ошибкой.

Как добавить действие в проект?

Через контекстное меню Добавить действие → Логика → BadEnd

Для чего это используется?

При работе шаблона могут возникнуть непредвиденные ошибки, например:

Если изменилась верстка на сайте и шаблон теперь не может найти нужный HTML элемент

Не до конца продуманная логика шаблона, не предусматривающая определенные ситуации

Из-за этого проект не будет выполнен до конца и сразу завершит свою работу. Чтобы исключить такие ситуации, можно использовать Bad End для:

Возврата данных обратно в списки / таблицы для последующего их использования без потери.

Добавления в Blacklist невалидной информации

Как работать с экшеном?

В случае завершения шаблона ошибкой, выполнятся действия, привязанные к Bad End:

Также, Bad End сработает при прерывании шаблона или по истечению глобального таймаута выполнения. За это отвечает настройка в ZennoPoster - “Выполнять BadEnd при прерывании проекта“:

Bad End срабатывает 1 раз для каждого потока.

Многократный переход в BadEnd при отладке проекта

По умолчанию, при отладке проект переходит в Bad/GoodEnd только один раз. Затем нужно перезапустить проект кнопкой “С начала”.
Для возможности многократного перехода в эти экшены при отладке нужно включить опцию Переходить в Bad/GoodEnd при многократной отладке в настройках программы.

Пример использования

Восстановление данных в случае ошибки

Например, для работы мы берём из списка строку с удалением. Если в процессе работы шаблон завершился с какой-либо ошибкой, до того, как мы обработали эту строку, то эти данные будут утеряны. Чтобы этого не произошло, используем Bad End и добавляем к нему действие добавления строки обратно в список. Таким образом при неудачном завершении работы необработанные данные будут сохранены назад в список для последующей обработки.

Либо воспользоваться опцией “Показать ошибочное действие в PM“, которое сразу откроет проект в ProjectMaker с выделенным действием, которое вызвало ошибку при выполнении:

Но за всеми ошибками сложно уследить, поэтому мы рекомендуем логировать их в файл. Чтобы создать файл лога, в который запишется ошибка при выполнении проекта, необходимо после Bad End добавить кубик Записать в файл и вставить в него следующий текст:

Теперь при возникновении ошибки в шаблоне, Bad End создаст файл log.txt, в который запишется время и ID ошибки. Если одного только идентификатора мало для устранения проблемы, Вы можете добавить сохранение скриншота инстанса, исходного кода страницы и значения переменных. Это позволит максимально подробно восстановить картину, которая привела к ошибке, и внести необходимые правки для нормализации работы проекта.

Добавление в Blacklist невалидной информации

Можно создать список для хранения невалидной информации, приводящей к ошибкам. Например, неверный логин \ пароль к аккаунту. При последующей работе шаблона проверять наличие данных в Blacklist’e и в случае совпадения производить замену.

Сохранения бэкапа

Сохранить рабочий профиль, чтобы в случае возникновения ошибки не потерять его. А после устранения проблемы загрузить его и продолжить работу.


Большое количество задач, связанных со взломом, требуют автоматизированной обработки данных, но программировать для этого вовсе не обязательно. В этой статье я расскажу тебе, как пользоваться мощнейшим инструментом — программой ZennoPoster. В первую очередь она предназначена для SEO, но применений ей — великое множество.

Вступление

Вот неполный список того, что можно делать с помощью этого комплекса:


ZennoPoster был разработан семь лет назад программистами из Нижнего Новгорода.

Из окна ZennoPoster можно контролировать расписание и ход выполнения проектов, подбор прокси и разгадывание капчи

Из окна ZennoPoster можно контролировать расписание и ход выполнения проектов, подбор прокси и разгадывание капчи

С чего начать

Так может выглядеть проект для работы с соцсетью, аналогичный небезызвестному VKBot

Так может выглядеть проект для работы с соцсетью, аналогичный небезызвестному VKBot

ZennoPoster как хакерский инструмент

У меня для тебя есть еще один пример. Как ты знаешь, на многих сервисах до сих пор используется такой небезопасный способ восстановления пароля, как ответ на «секретный вопрос», назначенный пользователем при регистрации. Поскольку сами вопросы не отличаются разнообразием, да и вариантов ответа на вопрос типа «любимое блюдо» не так уж много, перебор вариантов остается одним из векторов атаки.

Сделав небольшой проект в ZennoPoster, мы узнаем, какая часть пользователей задает при регистрации секретный вопрос и какие бывают вопросы. Перебирать ответы мы не будем.

Общий план такой: соберем логины всех авторов рассылок, а потом воспроизведем попытку восстановить пароль, используя выбранный хозяином аккаунта способ восстановления. Проанализируем данные и решим, какие аккаунты наиболее уязвимы.

Все, что находится между знаками - и @ , — логин пользователя, в нашем случае — xepsu. Если пройти по ссылкам «Войти -> Забыли пароль? -> Восстановить доступ по логину», то мы увидим секретный вопрос, например «Ваше прозвище в школе».

Мы соберем все логины и секретные вопросы. Чтобы сделать это вручную, пришлось бы потратить неделю или больше, а с ZennoPoster мы проанализируем четыре с половиной тысячи аккаунтов за пару часов (продолжительность зависит от того, сколько потоков потянут твой компьютер и интернет-канал).

Итак, приступим. В Project Maker создай новый проект. В окне проектов кликни правой клавишей мыши на белом поле и выбери «Добавить действие -> Таблицы -> Таблица». В нее мы будем сохранять результаты. Укажи имя results .

Добавить таблицу в проект можно в два клика

Добавить таблицу в проект можно в два клика

В нижней части окна проектов появится значок таблицы. Двойной клик по нему отобразит свойства. Укажи их, как на скриншоте. Поставь галочки «Загружать из файла», «Сохранять изменения таблицы в файл»; тип файла: «.csv, xls», путь: \deliveries.xls .

Запись вида </p>
<p>\deliveries.xls указывает на то, что файл должен быть сохранен в той же папке, что и сам проект
Запись вида \deliveries.xls указывает на то, что файл должен быть сохранен в той же папке, что и сам проект

Теперь включи режим записи, нажав на панели кнопок кнопку с характерным красным кружочком, или воспользуйся шоткатом . В этом режиме почти все, что ты делаешь, сохраняется в проект в виде отдельных блоков-действий.

Прямо в окне Project Maker еще раз зайдем в «Каталог» и отобразим страницу какой-нибудь рассылки. URL страницы с информацией об авторе рассылки имеет следующий вид:

В панели переменных кликни на + и добавь переменную с именем paramDelId — в ней мы будем хранить счетчик ID авторов рассылки во время перебора.

Выключи режим записи (Ctrl + R) и выдели последний записанный блок. В панели «Свойства действия» ты увидишь URL — замени в нем число на макрос нашей переменной.

Теперь добавим еще несколько действий, кликая правой клавишей рядом с нашей диаграммой, и проект готов!

Будем перебирать страницы, увеличивая значение счетчика. «Добавить действие», «Данные -> Обработка переменных». В свойствах действия: «Увеличить счетчик», «Значение: 1», «Записать в переменную: paramDelId».

С загруженной страницы будем выдирать данные логина с помощью регулярного выражения:


В Project Maker есть встроенный конструктор регулярных выражений, который поможет формулировать регэкспы для вытаскивания нужных кусочков текста.

Теперь добавим блок сохранения полученных данных в таблицу:

Расставь стрелочки, сохрани файл проекта, и все будет готово для сбора данных. Убедись, что не нажата кнопка «Отложенная отрисовка» (Ctrl + D). Этот режим нужен, чтобы увидеть, как выполняется проект: граница у блоков на диаграмме будет по очереди становиться жирной.

Нажми F10, чтобы выполнять проект пошагово, или F11, чтобы просто запустить его. Когда счетчик дойдет до 4500, выполнение проекта можно остановить. Результатом будет таблица логинов.

Конечно, этот пример неидеален, но ты можешь взять более продвинутый — с сохранением большего количества данных, многопоточной работой и поддержкой прокси, скачав его по ссылке.


Кстати, ребята из ZennoLab делают еще пару полезных программ: Zenno Proxy Checker и CapMonster 2. Последняя умеет разгадывать почти любые современные капчи без обращения в интернет.

Находим уязвимые аккаунты

Из таблички, в которую мы сохранили логины, скопируй колонку логинов на отдельный лист. Чтобы избавиться от пустых строк, отсортируй по имени и удали дубли, сохрани результат в файл logins.txt.

Создадим в Project Maker еще один небольшой проект, который будет заходить на страничку восстановления пароля и узнавать секретный вопрос.

В окне проектов на белом поле кликни правой клавишей мыши и выбери:

  • Добавить действие
  • Списки
  • Список
  • Оставь имя «Список 1». Из него мы будем брать логины с удалением
  • Двойной клик по значку списка, укажи путь к файлу: \logins.txt . Ты также можешь просто указывать обычный путь, но такая специальная запись позволяет использовать относительный путь и переносить проект в другие папки — возможно, на других компьютерах

Теперь еще добавим таблицу:

  • Добавить действие
  • Таблицы
  • Таблица. В нее мы будем сохранять секретные вопросы. Можно оставить название «Таблица 1»

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

  • Загружать из файла
  • Сохранять изменения таблицы в файл
  • Типа файла: .csv, xls
  • Путь: \smartresponder_secret_phrases.xls

Отлично, структуры данных мы создали! Теперь добавим в проект буквально пять действий, и можно запускать.

Описание действий

Поначалу действия могут показаться нудными и не до конца понятными, но, немного освоившись, ты будешь без особого напряга клепать проекты пачками и экономить кучу времени. Так что вперед, к финишной прямой!

Будем вытаскивать логины из списка, привязанного к файлу:

  • Добавить действие
  • Списки -> Операция над списком
  • В свойствах действия: «Список 1 -> Получить строку -> Первую» — поставь галочку «Удалить строку после взятия». Это позволит не создавать цикл для перебора логинов, а просто вырезать их из списка по одному
  • В поле «Положить в переменную» кликни на пункт «Новая. » и назови ее login .

Запись позволяет подставить в запрос значение логина, только что взятого из файла:

  • Тип данных: application/x-www-form-urlencoded; charset=UTF-8
  • Загрузить: только содержимое
  • Положить в переменную -> Создать новую. -> result

На вкладке «Дополнительно» поставь галочку «Редирект» и выставь значение 5. Результат должен быть, как на скриншоте.

Так настраивается GET-запрос, который позволяет скачивать или отправлять информацию

Так настраивается GET-запрос, который позволяет скачивать или отправлять информацию

Теперь вытащим из раскодированного ответа текст вопроса. Для этого воспользуемся уже знакомой тебе операцией применения регулярного выражения:

  • Добавить действие
  • Данные -> Обработка данных
  • В свойствах действия: , Regex
  • Значение Regex: (?<=question":").*?(?=")
  • В поле «Положить результат в переменную» выбери result

Теперь добавим блок сохранения полученных данных в таблицу:

  • Добавить действие
  • Данные
  • Таблицы
  • Операции над таблицей
  • В свойствах действия: таблица «Таблица 1»
  • Добавить строку

Наш мини-проект будет выглядеть примерно как на следующем скриншоте.

Всего несколько действий, и нужная инфа у нас в табличке!

Всего несколько действий, и нужная инфа у нас в табличке!

Этот проект берет один логин, делает запрос и получает один секретный вопрос. Чтобы перебрать их все, протяни стрелочку из последнего блока в первый. Тогда выполнение зациклится и остановится при опустошении файла логинов. Либо добавь этот проект в список проектов ZennoPoster и в поле «Сколько делать» укажи 4500.

Результат эксперимента

Прогнав первый проект, мы получим около 4500 логинов, из которых после удаления дублей останется 1760 уникальных логинов. Скормив их скрипту восстановления пароля по секретному вопросу, мы получим некоторую статистику:

Встречаются и совсем абсурдные варианты:

  • «Цвет светофора, открывающий путь»;
  • «Столица Украины»;
  • «Месяц рождения детей».

Ответ на такие вопросы можно дать вообще без всякого перебора.

В принципе, с помощью ZennoPoster и списка дешевых прокси мы могли бы накидать еще один несложный проект и перебирать пароли по словарю или с помощью генератора, но я не буду об этом рассказывать или советовать это делать — это незаконно. ZennoPoster поможет тебе зарабатывать и более-менее легальными методами: написать бота и продавать лицензии на него; извлекать данные из открытых источников на заказ и продавать их; работать по CPA-партнеркам, наливая трафик и получая комиссию. Качай готовые проекты, изучай, допиливай под свои нужды. Удачной тебе автоматизации!

Читайте также: