- Группировка Cloud Atlas атакует организации в России и Белоруссии с 2014 года.
- Cloud Atlas продолжает использовать облачные сервисы в качестве C2-серверов. В частности, в рассматриваемой кампании злоумышленники использовали «Яндекс Диск» для хранения вредоносных модулей.
- Cloud Atlas совершенствует и усложняет свои инструменты. Бэкдор PowerShower выполняет зашифрованные команды, спрятанные в файлах формата XML. VBShower использует Google Sheets в качестве управляющего сервера.
Авторы:

Георгий Хандожко
Специалист департамента комплексного реагирования на киберугрозы PT ESC

Александр Григорян
Заместитель руководителя департамента комплексного реагирования на киберугрозы PT ESC

Владислав Лунин
Старший специалист группы исследования сложных угроз PT ESC
Ключевые моменты
Цепочка атаки
В ноябре 2024 года сотрудники одной из российских государственных организаций обнаружили фишинговую рассылку и обратились к команде PT ESC IR для помощи в расследовании вредоносной активности.
В ходе расследования мы выяснили, что атака является частью фишинговой кампании, нацеленной на сотрудников государственных организаций России и Белоруссии, за которой стоит группировка Cloud Atlas. Эту фишинговую кампанию PT ESC отслеживала с конца октября 2024 года, все известные пострадавшие организации были уведомлены. Активность группировки раннее мы уже описывали в отчете APT Cloud Atlas: Unbroken Threat.
На скриншотах ниже представлен пример фишингового письма, отправленного якобы Министерством связи и информатизации Республики Беларусь.

Рассылка осуществлялась с адресов @internet.ru. Такой домен почтового адреса можно получить при регистрации на сервисе mail.ru.

Если ранее в качестве документа-приманки Cloud Atlas, как правило, использовала тексты, связанные с текущей геополитической обстановкой, то в рамках этой кампании документы представляли собой запросы о предоставлении определенного рода информации, направленные различными якобы государственными ведомствами.
Обнаруженные нами в ходе расследования инцидента вредоносные документы использовали технику удаленной загрузки шаблона (Template injection).
На скриншотах ниже представлены примеры документов-приманок, которые использовали злоумышленники в ходе фишинговой кампании.


Ссылка на вредоносный шаблон вшита в поток 1Table вредоносного документа формата DOC.


На момент проведения фишинговой кампании вредоносные документы не детектировались средствами антивирусной защиты.

При запуске вредоносного документа загружается шаблон с сервера злоумышленника officeconfirm.technoguides[.]org. К моменту начала расследования инцидента этот сервер был уже недоступен, однако по артефактам, найденным на зараженных узлах, и срабатываниям средства антивирусной защиты мы сделали вывод, что загружаемый шаблон эксплуатировал уязвимость в компоненте Equation Editor.
Также нам удалось обнаружить результаты проверки аналогичного DOC-файла на VirusTotal: на момент загрузки образца управляющий сервер был доступен и результаты поведенческого анализа документа оказались релевантными.
В графе поведенческого анализа в песочнице C2AE был обнаружен GET-запрос к управляющему серверу, в ответ на который сервер вернул файл типа application/hta. Данный запрос был осуществлен через несколько секунд после запроса к вредоносному шаблону.


В более ранних атаках Cloud Atlas также использовала HTA-файлы для доставки на зараженные узлы других инструментов. В частности, в ходе анализа активности на зараженных узлах мы обнаружили факты выполнения вредоносных VB-скриптов, записанных в альтернативные потоки данных файлов с именем AppCache***.log по пути %APPDATA%\Microsoft\Windows. VB-скрипты взаимодействуют с C2-сервером, в качестве которого используется документ Google Sheets.
Команда выполнения вредоносного скрипта на исследуемых узлах была добавлена в ключ автозапуска HKCU:\Software\Microsoft\Windows\CurrentVersion\Run реестра Windows:
NcdAutoSetup - wscript /B "%APPDATA%\Microsoft\Windows\AppCache498625573823535133.log:AppCache 498625573823535133.vbs"
Рассматриваемый VB-скрипт отправляет данные о зараженном пользователе в документ Google Sheets по API, после чего на узле выполняется код Visual Basic, записанный в другой ячейке того же листа в зашифрованном виде. В результате выполнения таких команд на зараженные узлы доставлялись экземпляры других инструментов группировки Cloud Atlas. В частности, был доставлен бэкдор PowerShower, выполняющий команды, полученные с C2-сервера mehafon[.]com (подробнее — в разделе «Анализ ВПО»).
Следы закрепления PowerShower также были обнаружены в ключе автозапуска:
Canon_upd - powershell -ep bypass -w 01 "%AllUsersProfile%\Canon\CanonHost.ps1"
Таким же образом было доставлено ВПО, использующее технику DLL Side-Loading и маскирующееся под компоненты Cisco Webex:
- %APPDATA%\Cisco\CiscoCollabHost.exe;
- %APPDATA%\Cisco\CiscoSparkLauncher.dll.
Легитимный уязвимый файл CiscoCollabHost.exe вызывает функцию SparkEntryPoint библиотеки CiscoSparkLauncher.dll, расположенной в той же папке. В ней же расположен файл с полезной нагрузкой.



В процессе поиска похожих образцов ВПО нам удалось найти библиотеку с совпадающей хеш-суммой списка импортируемых функций (imphash). Само ВПО представляет собой загрузчик конечных функциональных модулей, которые хранятся на «Яндекс Диске». Загрузчик закрепляется в системе посредством создания запланированной задачи с именем CiscoMngr:
<Actions Context="Author">
<Exec>
<Command>%APPDATA%\Cisco\CiscoCollabHost.exe</Command>
</Exec>
</Actions>
Итоговую цепочку заражения можно представить следующим образом:

Анализ ВПО
VBShower
Выполнение обфусцированных подобным образом VB-скриптов встречалось и в более ранних атаках Cloud Atlas. В частности, схожую активность описывали в своем отчете специалисты компании F.A.C.C.T., а также специалисты «Лаборатории Касперского», которые дали вредоносному скрипту имя VBShower.
Ключевым отличием рассматриваемых нами скриптов является использование в качестве C2-сервера Google Sheets, тогда как в предыдущих случаях осуществлялось взаимодействие со стандартными управляющими серверами.
Исходный скрипт выглядит следующим образом:

После деобфускации мы можем заметить, что скрипт считывает содержимое полезной нагрузки, записанной в файле с тем же именем, что и сам файл скрипта, но с расширением .dat. Сама нагрузка представляет собой набор байтов, записанных в шестнадцатеричном виде. Первые два байта являются служебными и используются в ходе дальнейших преобразований.
Обработка каждого байта полезной нагрузки, начиная с третьего, производится в одном из двух режимов:
- XOR с первым байтом полезной нагрузки с последующим преобразованием результата в соответствующий символ ASCII;
- добавление шестнадцатеричного представления байта к результирующей строке в исходном виде.
Каждый из обрабатываемых байтов сравнивается со вторым байтом файла полезной нагрузки. Если значения этих байтов равны между собой, происходит переключение режима обработки. В противном случае обработка продолжается в прежнем режиме.
В результате декодирования полезной нагрузки образуется следующая строка, содержащая VB-код, выполняемый с помощью команды Execute:

Обработка данных, записанных в переменной Pbqb, происходит по следующему алгоритму:
- Строка, записанная в переменной Pbqb, подается первым аргументом на вход функции деобфускации данных AEFe, результат которой выполняется с помощью функции Execute.
- Во второй аргумент (tIOe) функции передается значение переменной yQT6, равное 2. Эта переменная передается в функцию по ссылке, и ее значение модифицируется в теле функции.
- Аргумент tIOe определяет индекс, с которого будет считываться подстрока из строковой переменной, переданной в первый аргумент. Таким образом, строка, записанная в переменной Pbqb, считывается начиная со второго символа (опускается лидирующий пробел).
- Затем первые 8 символов полученной подстроки считываются и подаются на вход функции QkuA, которая осуществляет побайтовое декодирование данных из шестнадцатеричного формата в соответствующие символы ASCII.
- Декодированная строка представляет собой десятичное число, которое конвертируется в тип данных Int, после чего умножается на 2. К полученному числу прибавляется 8.
- Итоговое значение используется во вновь вызываемой функции декодирования и определяет длину декодируемой подстроки.
- Подстрока декодируется функцией QkuA, после чего из нее удаляются первые 4 символа, которые соответствуют десятичному представлению числа, из которого мы ранее получили длину подстроки.
- Значение второго аргумента функции AEFe увеличивается на число, равное длине подстроки. Это значение определяет индекс начала следующего декодируемого блока.
Разберем алгоритм на примере. В функцию деобфускации AEFe подается строка Pbqb. После удаления лидирующего пробела первые 8 символов имеют вид:
30303435
Данная строка представляется как последовательность шестнадцатеричных байтов (0×30 0×30 0×34 0×35), которая декодируется в ASCII-символы «0045».
Строка «0045» приводится к целочисленному типу. На выходе получаем число 45.
45 * 2 + 8 = 98.
Далее считываются и декодируются первые 98 символов исходной строки. После декодирования шестнадцатеричных байтов получается строка:
0045For uuHD=1 To 98:Execute AEFe(Pbqb,yQT6):Next
Первые 4 символа отбрасываются, и на выходе функция AEFe возвращает следующую строку, которая будет исполнена как VB-код:
For uuHD=1 To 98:Execute AEFe(Pbqb,yQT6):Next
Данный код говорит нам о том, что вызов функции деобфускации будет повторен еще 98 раз. Значение переменной yQT6, которое изначально равнялось 2, увеличилось на 98. Это значит, что следующий блок деобфусцируемого кода начинается с 100-го символа исходной строки Pbqb.
В результате выполнения цикла исходная строка Pbqb деобфусцируется полностью. Блоки получившегося VB-кода выполняются последовательно по ходу деобфускации.
Фрагменты соответствующего кода представлены на скриншотах ниже:

Рассмотренный код выполняет следующие действия:
- Считывает значения параметров ProxyServer и ProxyEnable для ключа реестра HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings и использует их в дальнейших HTTP-запросах, если они заданы.
- Считывает имя пользователя и домена из ключа реестра HKCU:\Volatile Environment.
Далее в бесконечном цикле осуществляется:
- Проверка наличия значения параметра NcdAutoSetup в ключе реестра HKCU:\Software\Microsoft\Windows\CurrentVersion\Run. Если значение не установлено, в него записывается строка исполнения текущего VB-скрипта. Таким образом обеспечивается закрепление ВПО в системе.
- Запись данных о скомпрометированном пользователе в первую свободную ячейку столбца A листа Google Sheets в формате CURRENT_TIMESTAMP#USERNAME#DOMAINNAME.
- Чтение шестнадцатеричных данных, записанных в ячейках столбца B, выполнение побайтового XOR с первым байтом полезной нагрузки (файл с расширением .dat) и выполнение декодированного VB-кода. После окончания выполнения полученного кода значение соответствующей ячейки заменяется на запись в формате done CURRENT_TIMESTAMP.
- Запись значения переменной result в ячейку столбца D той же строки, если она не пуста. В самом коде скрипта переменная result ранее нигде задается, но она может быть определена в теле команды, полученной из ячейки B на предыдущем этапе.
- Чтение данных из временного TMP-файла, расположенного в текущей папке, блоками по 25 000 символов. Каждый символ кодируется в шестнадцатеричном представлении, после чего шифруется методом XOR с ключом, соответствующим второму байту полезной нагрузки из файла .dat. Результат шифрования первого блока записывается в ячейку столбца E, второго блока — в столбец F, и так далее.
После окончания каждой итерации цикла скрипт засыпает на время, равное 2133767 ms + random_value (35+ минут).
Во время исследования скомпрометированных узлов нам не удалось обнаружить временных файлов, вероятно они были удалены. Однако нам удалось восстановить их содержимое. Эти файлы содержали, в частности, информацию о запущенных в системе процессах и запланированных задачах. Вероятно, во временные файлы записывался результат выполнения VB-кода, полученного из документа Google Sheets и выполненного ранее.
В результате сравнения временных меток в документе с временными метками файлов в MFT мы пришли к выводу, что другие инструменты, используемые злоумышленниками, были доставлены на зараженные узлы в результате выполнения полученного кода.
При исследовании файлов PREFETCH на зараженном узле было обнаружено, что процесс cmd.exe взаимодействовал с временным файлом в альтернативном потоке данных.

Помимо информации о процессах и задачах, во временных файлах мы обнаружили вывод содержимого папки %APPDATA%\Cisco с именами файлов и их размером.

Файла a.txt на момент анализа на зараженных узлах не было, однако, судя по размеру, его содержимое может совпадать с исполняемым файлом CiscoCollabHost.exe. Размеры файлов с полезной нагрузкой, найденных на скомпрометированных узлах, также совпадают, что может говорить об идентичности этих файлов.
Ниже представлен листинг кода, написанного на языке VB.NET, который расшифровывает полезную нагрузку и приводит вредоносный скрипт к его финальному виду.
Sub Main(args As String())
' Путь к вашему файлу с полезной нагрузкой
datPayload = "C:\your_path\payload.dat"
content = File.ReadAllText(datPayload)
xorByte = Mid(content, 3, 2)
checkByte = Mid(content, 1, 2)
cond = True
For i = 5 To Len(content) Step 2
currentByte = Mid(content, i, 2)
Do
If currentByte = xorByte Then
cond = Not cond
currentByte = " "
Exit Do
End If
If cond Then
currentByte = Chr("&H" & checkByte Xor "&H" & currentByte)
End If
Loop While False
firtsDecodeStage = firtsDecodeStage + currentByte
Next
resArr = Split(firtsDecodeStage, Chr(34))
hexPayload = resArr(1)
payloadIndex = 2
Deobfuscate(hexPayload, payloadIndex)
For uuHD = 1 To 98
decodedChunk = Deobfuscate(hexPayload, payloadIndex)
Console.WriteLine(decodedChunk)
Next
End Sub
Function Deobfuscate(inputStr, ByRef ind)
nextBlockLength = CInt(Decode(Mid(inputStr, ind), 8)) * 2
Deobfuscate = Mid(Decode(Mid(inputStr, ind), nextBlockLength + 8), 5)
ind = ind + nextBlockLength + 8
End Function
Function Decode(inputStr, Length)
ReDim resultArr(Length)
For ind = 1 To Length Step 2
resultArr(ind) = Chr(CInt(Chr(38) + "H" + Mid(inputStr, ind, 2)))
Next
Decode = Join(resultArr, "")
End Function
Листинг 1. Код для деобфускации VBShower

PowerShower
Бэкдор PowerShower, используемый группой Cloud Atlas, был описан в отчете исследователей из Palo Alto. Cкрипт PowerShell, обнаруженный нами в ходе расследования, является модификацией PowerShower. Рассматриваемый скрипт работает в бесконечном цикле, каждая итерация начинается с GET-запроса к управляющему серверу.
Если ответ сервера начинается с символа P, то содержимое ответа записывается в файл Firefox.zip в папке AppData\Local\Temp текущего пользователя. В противном случае содержимое ответа сервера, представляющее собой XML-разметку, записывается в файл со случайным названием.
Далее скрипт считывает значение атрибута annotation элемента xs XML-файла, начиная с последнего символа. Каждый символ получившейся строки сравнивается с символами строки-ключа: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/. Если символы совпадают, индекс соответствующего символа строки-ключа переводится в двоичную систему с добавлением незначащих нулей слева до 6 символов. Получившийся результат добавляется к результирующей строке. Таким образом, символу A будет соответствовать строка 000000, символу B — 000001, и так далее.
Далее результирующая строка, состоящая из нулей и единиц, делится на блоки по 8 символов. Если блок состоит из восьми нулей, то он пропускается. В противном случае строка двоичных символов конвертируется сначала в целочисленное значение, а затем в соответствующий символ ASCII, который добавляется к итоговой строке.
После обработки всех блоков на выходе получается строка, которая впоследствии исполняется как PowerShell-код. После выполнения команды скрипт должен удалить XML-файл с полезной нагрузкой, однако нам повезло обнаружить несколько таких файлов в карантине антивируса.
Ниже представлен пример содержимого одного из таких файлов:

После расшифровки строки в атрибуте annotation мы получим следующий PowerShell-код:
$la = net accounts;[io.file]::WriteAllText($env:temp+"\sapp.xtx", $la);;;
Результат выполнения кода, записанный в файле AppData\Local\Temp\sapp.xtx (имя файла может отличаться в других экземплярах PowerShower), отправляется на сервер, после чего файл удаляется из системы.

Код рассмотренного образца PowerShower выглядит следующим образом:

Код PowerShell для расшифрования полезной нагрузки в XML-файле представлен ниже:
function DecodeAnnotation($annotation) {
$customAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
$binaryString = ""
foreach ($char in $annotation.ToCharArray()) {
$index = $customAlphabet.IndexOf($char)
if ($index -ge 0) {
$binaryString += [Convert]::ToString($index, 2).PadLeft(6, '0')
}
}
$byteList = @()
for ($i = 0; $i -lt $binaryString.Length; $i += 16) {
$byte = $binaryString.Substring($i, [Math]::Min(16, $binaryString.Length - $i))
if ($byte.Length -eq 16) {
$byteList += [Convert]::ToByte($byte.Substring(0, 8), 2)
$byteList += [Convert]::ToByte($byte.Substring(8, 8), 2)
}
}
$decodedText = [System.Text.Encoding]::Unicode.GetString($byteList)
return $decodedText
}
function DecodeXmlFile($xmlFilePath) {
[xml]$xmlContent = Get-Content -Path $xmlFilePath -Raw
$annotationNodes = $xmlContent.Relationships.xs.annotation
if ($annotationNodes -eq $null) {
Write-Output "No annotation field found in the XML file."
return
}
$annotationString = ($annotationNodes[-1..-$annotationNodes.Length] -join '')
$decodedText = DecodeAnnotation $annotationString
return $decodedText
}
# Путь к файлу полезной нагрузки
$xmlFilePath = "C:\your_path\payload.xml"
$decodedAnnotation = DecodeXmlFile $xmlFilePath
Write-Output "Decoded annotation: $decodedAnnotation"
Листинг 2. Код для расшифрования полезной нагрузки в XML-файле
Загрузчик
Файл CiscoSparkLauncher.dll является первым стейджером загрузчика модулей Cloud Atlas, который расшифровывает и выполняет полезную нагрузку, содержащуюся в файле в той же папке.
Функциональность загрузчика и модулей описывалась в нашей статье APT Cloud Atlas: Unbroken Threat в разделе «Анализ ВПО» и с тех пор практически не изменилась. Небольшому функциональному изменению подвергся основной модуль: в отличие от более ранних версий, теперь в нем для работы с криптографией используется статически слинкованная библиотека Crypto++, убрано сжатие, а также в качестве хранилища украденных данных и вредоносных модулей используется WebDAV «Яндекс Диска». Для доступа в хранилище используется учетная запись pe9ov.sem@yandex.ru. Как и раньше, злоумышленники загружали модуль для похищения файлов с зараженного устройства по определенным параметрам, таким как пути к файлам и их расширения.


Заключение
Группировка Cloud Atlas атакует государственные организации в России и Белоруссии уже на протяжении 10 лет. Несмотря на то что арсенал Cloud Atlas не претерпел значительных изменений и злоумышленники все так же полагаются на облачные сервисы, они продолжают экспериментировать с различными популярными платформами.
Использование Google Sheets в качестве управляющего сервера является наиболее важной особенностью рассмотренной кампании и отличает ее от предыдущих атак.
Злоумышленники продолжают совершенствовать свои тактики, техники, процедуры и используемый инструментарий. Вредоносное ПО, используемое Cloud Atlas, дорабатывается и усложняется.
Авторы благодарят за помощь в подготовке статьи команды Incident Response и Threat Intelligence экспертного центра Positive Technologies (PT Expert Security Center).
Следующие разделы содержат информацию о всех полученных образцах и обновленных TTPs.
Сетевые индикаторы
Домены:
| mehafon.com |
| officeconfirm.technoguides.org |
| technoguides.org |
| mirconnect.info |
| jhsdshdkajdhgfyhsfhjshh.cfd |
| web-whatapp.net |
IP-адреса:
| 79.143.87[.]233 |
| 188.127.235[.]216 |
| 185.99.2[.]168 |
| 176.124.33[.]86 |
| 80.85.153[.]195 |
User-Agent:
| Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:132.0) Gecko/20200201 Firefox/132.0 |
| Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.2535.93 |
Легитимные сервисы, с которыми взаимодействует ВПО:
| webdav.yandex.ru (213.180.204.148) |
| oauth2.googleapis.com |
| sheets.googleapis.com |
| googleusercontent.com |
Файловые индикаторы
MITRE TTPs
Выявление активности группировки Cloud Atlas продуктами Positive Technologies
Правила корреляции MaxPatrol SIEM:
| Alternate_Data_Stream |
| Malicious_Office_Document |
| Windows_Autorun_Modification |
| Execute_Malicious_Powershell_Cmdlet |
| Execute_Malicious_Command |
| Execute_Encoded_Powershell |
| Scheduled_Task_Manipulation |
| Script_Files_Execution |
| DLL_Side_Loading |
| Malicious_Activity_From_Office_Documents |
| Obfuscated_Powershell |
| Run_Masquerading_Executable_File |
PT NAD & PT NGFW (сигнатуры):
| LOADER [PTsecurity] RtcpProxy (APT CloudAtlas) sid: 10008367 |
| SUSPICIOUS [PTsecurity] PROPFIND method in http request sid: 10008218 |
| SUSPICIOUS [PTsecurity] MKCOL method in http request sid: 10008219 |
Срабатывания последних двух сигнатур не являются однозначным признаком активности Cloud Atlas, они могут использоваться для ретроспективного анализа угроз.
PT NAD (репутационные списки):
| ESC-manual-cloudatlas-ip |
| ESC-manual-cloudatlas-dns |
PT Sandbox:
| apt_win_ZZ_CloudAtlas__Stealer__Plugin |
| apt_win_ZZ_CloudAtlas__Dropper__FirstDll |
| apt_win_ZZ_CloudAtlas__Dropper__FirstExe |
| apt_mem_ZZ_CloudAtlas__Trojan__InitialModule |
| apt_win_ZZ_CloudAtlas__Backdoor__MainModule |
| apt_mem_ZZ_CloudAtlas__Backdoor__MainModule |
| apt_win_ZZ_CloudAtlas__Dropper__RTF |
| apt_win_ZZ_CloudAtlas__Dropper__VBS |
| apt_win_ZZ_CloudAtlas__Backdoor__PS |
| apt_win_ZZ_CloudAtlas__Stealer__PS |
| apt_win_ZZ_CloudAtlas__Trojan__PS |
| apt_win_ZZ_CloudAtlas__Backdoor__native__PowerShower |
Файловые сигнатуры
rule PTESC_tool_win_ZZ_OfficeTemplate__Downloader__DOC_v2{
strings:
$a = {00 A5 06 6E 04 B4}
$b = {FF FF FF 7F FF FF FF 7F}
$c = {B4 00 B4 00 81 81 12 30 00}
condition:
uint16be ( 0 ) == 0xd0cf and filesize < 10MB and ( for any i in ( 300 .. 400 ) : ( ( ( uint8be ( @a + i ) == 0x68 ) or ( uint8be ( @a + i ) == 0x48 ) ) and ( ( uint8be ( @a + i + 2 ) == 0x74 ) or ( uint8be ( @a + i + 2 ) == 0x54 ) ) and ( ( uint8be ( @a + i + 4 ) == 0x74 ) or ( uint8be ( @a + i + 4 ) == 0x54 ) ) and ( ( uint8be ( @a + i + 6 ) == 0x70 ) or ( uint8be ( @a + i + 6 ) == 0x50 ) ) and ( for any y in ( 14 .. 70 ) : ( uint8be ( @a + y + i ) == 0x2f and ( for any z in ( 4 .. 70 ) : ( uint8be ( @a + z + i + y ) == 0x2f or uint8be ( @a + z + i + y ) == 0x3f ) ) ) ) ) or for any j in ( 100 .. 200 ) : ( ( ( uint8be ( @b + j ) == 0x68 ) or ( uint8be ( @b + j ) == 0x48 ) ) and ( ( uint8be ( @b + j + 2 ) == 0x74 ) or ( uint8be ( @b + j + 2 ) == 0x54 ) ) and ( ( uint8be ( @b + j + 4 ) == 0x74 ) or ( uint8be ( @b + j + 4 ) == 0x54 ) ) and ( ( uint8be ( @b + j + 6 ) == 0x70 ) or ( uint8be ( @b + j + 6 ) == 0x50 ) ) and ( for any y in ( 14 .. 70 ) : ( uint8be ( @b + y + j ) == 0x2f and ( for any z in ( 4 .. 70 ) : ( uint8be ( @b + z + j + y ) == 0x2f or uint8be ( @b + z + j + y ) == 0x3f ) ) ) ) ) or for any k in ( 200 .. 400 ) : ( ( ( uint8be ( @c + k ) == 0x68 ) or ( uint8be ( @c + k ) == 0x48 ) ) and ( ( uint8be ( @c + k + 2 ) == 0x74 ) or ( uint8be ( @c + k + 2 ) == 0x54 ) ) and ( ( uint8be ( @c + k + 4 ) == 0x74 ) or ( uint8be ( @c + k + 4 ) == 0x54 ) ) and ( ( uint8be ( @c + k + 6 ) == 0x70 ) or ( uint8be ( @c + k + 6 ) == 0x50 ) ) and ( for any y in ( 14 .. 70 ) : ( uint8be ( @c + y + k ) == 0x2f and ( for any z in ( 4 .. 70 ) : ( uint8be ( @c + z + k + y ) == 0x2f or uint8be ( @c + z + k + y ) == 0x3f ) ) ) ) ) )
}