Decode IonCube: автоматизация процесса

  • Автор темы Автор темы Daniel
  • Дата начала Дата начала

Daniel

Разрушитель (V)
Сообщения
256
Реакции
629
Баллы
21 334
Надоела уже эта "мода" на кодирование php-файлов ионкубом. Каждый раз приходиться искать файлы, отправлять на декодирование, заменять кодированные на декодированные. Все это отнимает кучу времени. Поэтому, решил это как-то автоматизировать.
Основной план действий:
  1. поиск кодированных файлов;
  2. декодирование файлов;
  3. замена исходных файлов на декодированные.
Как найти файлы?
В общих случаях, для поиска вручную, следует использовать какой-либо файловый менеджер, например, Total Commander или Far Manager.
Суть поиска: найти все файлы по маске *.php содержащие текст "HR+". Почему нужно искать так, а не слово "ionCube"? Многие извращенцы специально удаляют часть кода, проверяющую наличие установленного расширения 'ionCube Loader', чтобы усложнить жизнь простым пользователям. Поэтому при поиске по слову ionCube вы ничего не найдете!

Далее следует как-то собрать эти файлы в одно место. Для этого используем полезную возможность вышеуказанных файловых менеджеров - копировать результаты поиска во временную панель. Почти все хорошо, но когда файлов много, то стоит как-то сохранить все исходные папки, в которых находились эти файлы. Тут возникает сложность. Скопировать файлы с временной панели можно в любую папку, но все исходные пути будут утеряны. Сохранить файлы с путями можно выделив все файлы на временной панели и поместив из в архив. Но тут возникает другое неудобство - нужно перемещаться по всем папкам доходя до нужного файла (-ов) для отправки его на декодирование. Нужно как-то сохранить исходные папки и при этом разместить все файлы в одной папке, чтобы можно было отправить их все сразу на декодирование. Тут уже проблему в ручную тяжело решить. Поэтому родился первый батник 1_find_encode.cmd.
Он делает следующее:
находит все кодированные файлы и копирует их в папку Encode. При этом он переименовывает файлы так, что в имени сохраняется весь относительный путь.
Теперь нужно это все как-то отправить на декодирование на сервис easytoyou.eu. Для декодирования нужно купить доступ, стоимость 10 Евро/месяц.
На гитхабе https://github.com/ip-rw/easy4us был найден скрипт на питоне, который позволяет найти все файлы, кодированные ионкубом, отправить их на декодирование и скачать декодированные файлы. Для работы нужно установить питон и установить необходимые расширения.
Код:
pip install -r requirements.txt
При установке зависимостей, скорее всего будут проблемы и ошибки. Читаем то что пишется на экране и устанавливаем необходимое.
Для упрощения процесса второго шага, создаем второй батник 2_decode.cmd
В нем нужно будет настроить две переменные, логин и пароль для вашего аккаунта на easytoyou.eu и сохранить отредактированный файл

Код:
set USERNAME=тут ваш логин
set PASSWORD=тут ваш пароль
Третий шаг, восстановление путей декодированных файлов решает третий батник 3_rename_encode.cmd
Объединим все операции в батнике 0_start_decode.cmd
В результате получаем такую структуру:
Код:
0_start_decode.cmd
1_find_encode.cmd
2_decode.cmd
3_rename_encode.cmd
main.py
requirements.txt
requirements.txt - после установки зависимостей ( pip install -r requirements.txt ) можно будет удалить.

Для работы помещаем папку проекта рядом с батниками и запускаем 0_start_decode.cmd - будут выполнены все задачи из файлов
Код:
1_find_encode.cmd - создает папку Encode, куда помещает все найденные кодированные файлы
2_decode.cmd - отправляет файлы из Encode на декодирование и перезаписывает на декодированные файлы в папке Encode
3_rename_encode.cmd - создает паку Decode, в которой все декодированные файлы расположены на своих местах (папках)
Эти же файлы, можно запускать в ручную, для достижения результата соответствующей задачи.
Файлы проекта выложу чуть позже, утомила меня эта писанина.
 
Последнее редактирование:
Да уж, больше часа понадобилось, чтобы написать первый пост. После публикации улыбнуло сообщение "Вы заработали 4 балла, за создание новой темы"
Нужно переходить в разряд тех, кто пишет помогите,..., сделайте за меня..., ищу...
Все хотят потреблять полезную информацию, но мало кто хочет ее создавать и делать доступной. А многие еще любят взять и выложить на других ресурсах от своего имени. Поэтому доступ к файлам будет ограничен уровнем группы пользователя. Все остальные или повышают свой уровень или делают все сами

Видео, как все это работает

Скачать все файлы проекта с результатом его работы:
Скрытое содержимое. Вам нужно войти или зарегистрироваться.
 
Последнее редактирование:
Улучшаем обработку. Появились следующие идеи.
  1. Использовать изначально исходные архивы, создав батник распаковки каждого архива в отделенную папку с именем архива.
  2. Скопировать декодированные файлы в папку с исходником, заменив кодированные файлы.
  3. Архивировать готовые исходники с декодированными файлами в архивы с именем, к которому будет добавлено _decode (опционально).
  4. Тут возможно что-то еще...
Все делать путем добавления отдельных батников, каждый из которых реализует одну задачу: поиск архивов и их распаковку, копирование декодированных файлов в исходную папку, создание нового архива.
Для этого нужно немножко изменить стартовый батник, чтоб избавиться от жесткого запуска только указанных файлов. Пусть он сам найдет все *.cmd файлы и выполнит последовательно каждый, игнорируя самого себя. Также избавимся от жесткой привязки к именам файлов.
Улучшенный стартовый батник выглядит так:
Bash:
@ECHO OFF & CLS
REM Find all *.cmd file and execute

For /R  %%i in (*.cmd) Do (
IF "%%~nxi" NEQ "%~nx0" CALL %%i
)
Для копирования декодированных файлов в исходную папку используем следующий батник 4_copy_decode_to_src.cmd:
Bash:
REM Copy decode files to source folder
@ECHO off & cls
ECHO Copy decode files to source folder

IF exist "%~dp0Decode" (
xcopy /s /f /y "%~dp0Decode" "%~dp0"
)

Распаковка упаковка архивов еще в стадии реализации. Возможно у кого-то есть еще каки-то предложения по улучшению (изменению) процесса.
 
Распаковка упаковка архивов еще в стадии реализации. Возможно у кого-то есть еще каки-то предложения по улучшению (изменению) процесса.
Переписать все это на пых. :wizard:
 
Есть один баг у easytoyou.eu

Если аккаунт старый, он какие то старые файлы скачивает, если качать с easytoyou.eu архивом
 
Есть один баг у easytoyou.eu

Если аккаунт старый, он какие то старые файлы скачивает, если качать с easytoyou.eu архивом
Это не баг а фича. Я в свое время просил владельца почистить папку. Файлы остаются если сервис при декоде падает.
 
Есть один баг у easytoyou.eu

Если аккаунт старый, он какие то старые файлы скачивает, если качать с easytoyou.eu архивом
Есть такая проблема. Поэтому и завел себе новый. Тоже думал написать, чтоб почистил, но потом решил, что проще новый завести. Есть еще один питновский скрипт, он скачивает из ссылки. Но тот код я так и не понял как использовать. Он использует куки а не логин пароль для авторизации.
 
Переписать все это на пых. :wizard:
Да да, и к форуму подвязать как нибудь
Есть еще один питновский скрипт, он скачивает из ссылки. Но тот код я так и не понял как использовать. Он использует куки а не логин пароль для авторизации.
А не проще ли написать телеграмм бота на питоне?
 
Доработанная версия ICv2
Добавлены несколько задач, изменены некоторые моменты работы. По факту, нужны только две версии декодера. Поэтому файлы отправляются автоматически дважды. Скрипт на питоне был подкорректирован на правильный поиск файлов и устранено его падение при повторной отправке файлов. Так как, после первой отправки в папке уже находиться декодированные файлы часть или все, то скрипт выдавал ошибку что невозможно скопировать файл сам в себя. Эта ошибка появляется если источник и результат полностью совпадает. Теперь просто выводиться сообщение и файлы пропускаются.
  1. 00_start_all_steps.cmd - находит и запускает последовательно каждый пакетный файл, себя игнорирует
  2. 01_unpack_zip.cmd - находит все архивы *.zip в исходной папке, распаковывает их (вложенные архивы не поддерживаются), корректирует имена папок, заменяя символы пробела на подчеркивание, удаляет & в именах папок
  3. 02_find_encode.cmd - находит все кодированные *.php файлы, переименовывает их, копирует в папку Encode
  4. 03_decode_easytoyou.cmd - отправляет файлы на easytoyou.eu. Необходимо отредактировать этот файл указав данные своей учетной записи: в строках
    set USERNAME=
    set PASSWORD=
    Записывать сразу после знака равно (=) без пробела в начале и конце строки, например
    set USERNAME=user
    set PASSWORD=pass
    Файлы после декодера помещаются в папку Encode, заменяя кодированные
  5. 04_rename_encode.cmd - находит все *.php файлы в папке Encode и восстанавливает всю исходную структуру расположения файлов в папке Decode
  6. 05_copy_decode_to_src.cmd - копирует из Decode папки со всеми декодированными файлами в исходную папку проекта (получена после распаковки архива)
  7. 06_pack_zip.cmd - упаковывает готовый проект в архив добавляя decode_ к имени архива
Скачать:
Скрытое содержимое. Вам нужно войти или зарегистрироваться.
 
Это не баг а фича. Я в свое время просил владельца почистить папку. Файлы остаются если сервис при декоде падает.
Геморрой от этой фичи. Не понятно какая практическая ценность от этого. Постепенно начинает накапливаться мусор в скачиваемом архиве. Нужно писать этому кренделю, чтоб добавил возможность очистки всех файлов в аккаунте.
Для устранения влияния, в файле 05_copy_decode_to_src.cmd добавить ключ /u к команде xcopy
Код:
REM /u : копировать только те файлы которые уже есть в папке назначения. Т.е. обновить их.
xcopy /s /f /y /u "%~dp0Decode" "%~dp0"
Полный код 05_copy_decode_to_src.cmd будет такой
Код:
REM Copy decode files to source folder
@ECHO off & cls
ECHO Copy decode files to source folder

IF exist "%~dp0Decode" (
xcopy /s /f /y /u "%~dp0Decode" "%~dp0"
)
В результате в исходную папку и архив не будет попадать весь накопившийся мусор.

Хотел сделать распаковку вложенных архивов, но оказалось, что у авторов такой зоопарк в структурах архивов, что невозможно ничего сделать. Поэтому лучше найти вручную нужные архивы и положить их на обработку. Пока идеи на этот счет закончились.
 
Последнее редактирование:
Геморрой от этой фичи. Не понятно какая практическая ценность от этого. Постепенно начинает накапливаться мусор в скачиваемом архиве. Нужно писать этому кренделю, чтоб добавил возможность очистки всех файлов в аккаунте.
Так то да. Особенно если отправляешь index.php и в архиве есть файл с таким именем, то он по идее затрёт нужный
 
Все... Питоновский скрипт больше не работает.
Python:
import os
import codecs
import argparse
import shutil
import urllib
import zipfile
from io import BytesIO
import requests
import bs4

parser = argparse.ArgumentParser(
    usage="easy4us", description="decode directories with easytoyou.eu")
parser.add_argument("-u", "--username", required=True,
                    help="easytoyou.eu username")
parser.add_argument("-p", "--password", required=True,
                    help="easytoyou.eu password")
parser.add_argument("-s", "--source", required=True, help="source directory")
parser.add_argument("-o", "--destination", required=True,
                    help="destination directory", default="")
parser.add_argument("-d", "--decoder",
                    help="decoder (default: ic11php72)", default="ic11php72")
parser.add_argument("-w", "--overwrite", help="overwrite",
                    action='store_true', default=False)
base_url = "https://easytoyou.eu"
args = parser.parse_args()

headers = {"Connection": "close",
           "Cache-Control": "max-age=0",
           "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.30 Safari/537.36",
           "Origin": "https://easytoyou.eu"}

not_decoded = []


def login(username, password):
    session = requests.session()
    login = base_url + "/login"
    login_data = {"loginname": username, "password": password}
    resp = session.post(login, headers=dict(headers, **{"Content-Type": "application/x-www-form-urlencoded"}),
                        data=login_data, allow_redirects=True)
    if "/account" in resp.url:
        return session
    return False


def copy(src, dest, files):
    for file in files:
        csrc = os.path.join(src, file)
        cdest = os.path.join(dest, file)
        try:
            shutil.copyfile(csrc, cdest)
            print("Copied %s to %s" % (file, cdest))

        # If source and destination are same
        except shutil.SameFileError:
            print("Source and destination represents the same file.")

        # If destination is a directory.
        except IsADirectoryError:
            print("Destination is a directory.")


def clear(session):
    print("clearing page", end='')
    c = 0
    while True:
        c += 1
        res = session.get(base_url + "/decoder/%s/1" %
                          args.decoder, headers=headers)
        s = bs4.BeautifulSoup(res.content, features="lxml")
        inputs = s.find_all(attrs={"name": "file[]"})
        if len(inputs) < 1:
            print()
            break
        final = ""
        for i in inputs:
            final += "%s&" % urllib.parse.urlencode({i["name"]: i["value"]})
        session.post(base_url + "/decoder/%s/1" % args.decoder, data=final,
                     headers=dict(headers, **{"Content-Type": "application/x-www-form-urlencoded"}))
        print("...%d" % c, end='')

        # print("deleted %s files" % len(inputs))


def parse_upload_result(r):
    s = bs4.BeautifulSoup(r.content, features="lxml")
    success = []
    failure = []
    for el in s.find_all("div", {"class": "alert-success"}):
        res = [s.strip() for s in el.text.split()]
        success.append(res[1])

    for el in s.find_all("div", {"class": "alert-danger"}):
        # print(el.text)
        res = [s.strip() for s in el.text.split()]
        failure.append(res[3])
    return success, failure


def upload(session, dir, files):
    r = session.get(base_url + "/decoder/%s" %
                    args.decoder, headers=headers, timeout=300)
    s = bs4.BeautifulSoup(r.content, features="lxml")
    el = s.find(id="uploadfileblue")
    if not el:
        print(s.text)
        print("Error: Couldnt find upload form")
        return
    n = el.attrs["name"]
    upload = []
    for file in files:
        if file.endswith(".php"):
            full = codecs.open(os.path.join(dir, file), 'rb')
            upload.append((n, (file, full, "application/x-php")))
    upload.append(("submit", (None, "Decode")))
    if len(upload) > 0:
        r = session.post(base_url + "/decoder/%s" % args.decoder,
                         headers=headers,
                         files=upload)
        return parse_upload_result(r)


def download_zip(session, outpath):
    try:
        if not os.path.exists(outpath):
            os.makedirs(outpath)
        r = session.get(base_url + "/download.php?id=all", headers=headers)
        bytes = BytesIO(r.content)
        zf = zipfile.ZipFile(bytes)
        for name in zf.namelist():
            data = zf.read(name)
            dest = os.path.join(outpath, os.path.basename(name))
            f = open(dest, 'wb+')
            wrote = f.write(data)
            f.close()
            print("Write %d bytes to %s" % (wrote, dest))
        zf.close()
        return True
    except Exception as e:
        print(e)
        return False


def batch(iterable, n=1):
    l = len(iterable)
    for ndx in range(0, l, n):
        yield iterable[ndx:min(ndx + n, l)]


def process_files(session, dir, dest, phpfiles):
    print("Uploading %d files..." % len(phpfiles), end='', flush=True)
    res = upload(session, dir, phpfiles)
    if res:
        success, failure = res
        print("Done. %s successful, %d failed." % (len(success), len(failure)))
        # copy(dir, dest, failure)
        not_decoded.extend([os.path.join(dir, f) for f in failure])
        # download zip
        if len(success) > 0:
            if not download_zip(session, dest):
                # print("download failed. refreshing session...", end='')
                # session = login(args.username, args.password)
                # print("done")
                # if not download_zip(session, dest):
                print("Couldn't download. Copying originals and continuing")
                # copy(dir, dest, phpfiles)
                not_decoded.extend([os.path.join(dir, f) for f in phpfiles])
            clear(session)


if __name__ == '__main__':
    if args.destination == "":
        args.destination = os.path.basename(args.source) + "_decoded"

    session = login(args.username, args.password)
    if session:
        clear(session)
        for dir, dirnames, filenames in os.walk(args.source):
            print("Processing %s" % dir)
            rel = os.path.relpath(dir, args.source)
            dest = os.path.join(args.destination, rel).strip(".")
            if not os.path.exists(dest):
                os.makedirs(dest)
                # print("Created %s" % dest)
            phpfiles = []
            other = []
            for f in filenames:
                csrc = os.path.join(dir, f)
                if f.endswith(".php") and b"HR+" in open(csrc, "rb").read():
                    phpfiles.append(f)
                else:
                    other.append(f)

            copy(dir, dest, other)

            # check overwrite
            if not args.overwrite:
                needed = []
                for f in phpfiles:
                    csrc = os.path.join(dest, f)
                    if not os.path.exists(csrc):
                        needed.append(f)
                    # else:
                    #    print("%s exists already. Skipping." % f)
                phpfiles = needed

            # upload
            if len(phpfiles) > 0:
                for f in batch(phpfiles, 25):
                    process_files(session, dir, dest, f)
        print("Finished. Ioncube files that failed to decode:")
        for f in not_decoded:
            print(f)
Последовательно выплыло две проблемы. Функция clear(session): - выкидывает ошибку, что отсутствует атрибут "value" строка
Python:
final += "%s&" % urllib.parse.urlencode({i["name"]: i["value"]})
Это удалось исправить. И вроде все заработало. но оказалось не все. Файлы не отправляются. Причина тоже вроде найдена, но исправить не получилось. Причина, что при разборе кода страницы ищется форма для отправки по id="uploadfileblue"
Python:
    s = bs4.BeautifulSoup(r.content, features="lxml")
    el = s.find(id="uploadfileblue")
    ...
    // тут получаем атрибут Name поля Input
    n = el.attrs["name"]
    ...
    // далее отправляются файлы
Но Name возвращается как "file[]", но в коде браузера атрибут Name создается динамически и каждый раз разный, например
HTML:
<input id="uploadfileblue" accept=".php" type="file" name="cfbda5ea[]" multiple="multiple">
Поэтому ничего не отправляется.
 
Все... Питоновский скрипт больше не работает.
Python:
import os
import codecs
import argparse
import shutil
import urllib
import zipfile
from io import BytesIO
import requests
import bs4

parser = argparse.ArgumentParser(
    usage="easy4us", description="decode directories with easytoyou.eu")
parser.add_argument("-u", "--username", required=True,
                    help="easytoyou.eu username")
parser.add_argument("-p", "--password", required=True,
                    help="easytoyou.eu password")
parser.add_argument("-s", "--source", required=True, help="source directory")
parser.add_argument("-o", "--destination", required=True,
                    help="destination directory", default="")
parser.add_argument("-d", "--decoder",
                    help="decoder (default: ic11php72)", default="ic11php72")
parser.add_argument("-w", "--overwrite", help="overwrite",
                    action='store_true', default=False)
base_url = "https://easytoyou.eu"
args = parser.parse_args()

headers = {"Connection": "close",
           "Cache-Control": "max-age=0",
           "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.30 Safari/537.36",
           "Origin": "https://easytoyou.eu"}

not_decoded = []


def login(username, password):
    session = requests.session()
    login = base_url + "/login"
    login_data = {"loginname": username, "password": password}
    resp = session.post(login, headers=dict(headers, **{"Content-Type": "application/x-www-form-urlencoded"}),
                        data=login_data, allow_redirects=True)
    if "/account" in resp.url:
        return session
    return False


def copy(src, dest, files):
    for file in files:
        csrc = os.path.join(src, file)
        cdest = os.path.join(dest, file)
        try:
            shutil.copyfile(csrc, cdest)
            print("Copied %s to %s" % (file, cdest))

        # If source and destination are same
        except shutil.SameFileError:
            print("Source and destination represents the same file.")

        # If destination is a directory.
        except IsADirectoryError:
            print("Destination is a directory.")


def clear(session):
    print("clearing page", end='')
    c = 0
    while True:
        c += 1
        res = session.get(base_url + "/decoder/%s/1" %
                          args.decoder, headers=headers)
        s = bs4.BeautifulSoup(res.content, features="lxml")
        inputs = s.find_all(attrs={"name": "file[]"})
        if len(inputs) < 1:
            print()
            break
        final = ""
        for i in inputs:
            final += "%s&" % urllib.parse.urlencode({i["name"]: i["value"]})
        session.post(base_url + "/decoder/%s/1" % args.decoder, data=final,
                     headers=dict(headers, **{"Content-Type": "application/x-www-form-urlencoded"}))
        print("...%d" % c, end='')

        # print("deleted %s files" % len(inputs))


def parse_upload_result(r):
    s = bs4.BeautifulSoup(r.content, features="lxml")
    success = []
    failure = []
    for el in s.find_all("div", {"class": "alert-success"}):
        res = [s.strip() for s in el.text.split()]
        success.append(res[1])

    for el in s.find_all("div", {"class": "alert-danger"}):
        # print(el.text)
        res = [s.strip() for s in el.text.split()]
        failure.append(res[3])
    return success, failure


def upload(session, dir, files):
    r = session.get(base_url + "/decoder/%s" %
                    args.decoder, headers=headers, timeout=300)
    s = bs4.BeautifulSoup(r.content, features="lxml")
    el = s.find(id="uploadfileblue")
    if not el:
        print(s.text)
        print("Error: Couldnt find upload form")
        return
    n = el.attrs["name"]
    upload = []
    for file in files:
        if file.endswith(".php"):
            full = codecs.open(os.path.join(dir, file), 'rb')
            upload.append((n, (file, full, "application/x-php")))
    upload.append(("submit", (None, "Decode")))
    if len(upload) > 0:
        r = session.post(base_url + "/decoder/%s" % args.decoder,
                         headers=headers,
                         files=upload)
        return parse_upload_result(r)


def download_zip(session, outpath):
    try:
        if not os.path.exists(outpath):
            os.makedirs(outpath)
        r = session.get(base_url + "/download.php?id=all", headers=headers)
        bytes = BytesIO(r.content)
        zf = zipfile.ZipFile(bytes)
        for name in zf.namelist():
            data = zf.read(name)
            dest = os.path.join(outpath, os.path.basename(name))
            f = open(dest, 'wb+')
            wrote = f.write(data)
            f.close()
            print("Write %d bytes to %s" % (wrote, dest))
        zf.close()
        return True
    except Exception as e:
        print(e)
        return False


def batch(iterable, n=1):
    l = len(iterable)
    for ndx in range(0, l, n):
        yield iterable[ndx:min(ndx + n, l)]


def process_files(session, dir, dest, phpfiles):
    print("Uploading %d files..." % len(phpfiles), end='', flush=True)
    res = upload(session, dir, phpfiles)
    if res:
        success, failure = res
        print("Done. %s successful, %d failed." % (len(success), len(failure)))
        # copy(dir, dest, failure)
        not_decoded.extend([os.path.join(dir, f) for f in failure])
        # download zip
        if len(success) > 0:
            if not download_zip(session, dest):
                # print("download failed. refreshing session...", end='')
                # session = login(args.username, args.password)
                # print("done")
                # if not download_zip(session, dest):
                print("Couldn't download. Copying originals and continuing")
                # copy(dir, dest, phpfiles)
                not_decoded.extend([os.path.join(dir, f) for f in phpfiles])
            clear(session)


if __name__ == '__main__':
    if args.destination == "":
        args.destination = os.path.basename(args.source) + "_decoded"

    session = login(args.username, args.password)
    if session:
        clear(session)
        for dir, dirnames, filenames in os.walk(args.source):
            print("Processing %s" % dir)
            rel = os.path.relpath(dir, args.source)
            dest = os.path.join(args.destination, rel).strip(".")
            if not os.path.exists(dest):
                os.makedirs(dest)
                # print("Created %s" % dest)
            phpfiles = []
            other = []
            for f in filenames:
                csrc = os.path.join(dir, f)
                if f.endswith(".php") and b"HR+" in open(csrc, "rb").read():
                    phpfiles.append(f)
                else:
                    other.append(f)

            copy(dir, dest, other)

            # check overwrite
            if not args.overwrite:
                needed = []
                for f in phpfiles:
                    csrc = os.path.join(dest, f)
                    if not os.path.exists(csrc):
                        needed.append(f)
                    # else:
                    #    print("%s exists already. Skipping." % f)
                phpfiles = needed

            # upload
            if len(phpfiles) > 0:
                for f in batch(phpfiles, 25):
                    process_files(session, dir, dest, f)
        print("Finished. Ioncube files that failed to decode:")
        for f in not_decoded:
            print(f)
Последовательно выплыло две проблемы. Функция clear(session): - выкидывает ошибку, что отсутствует атрибут "value" строка
Python:
final += "%s&" % urllib.parse.urlencode({i["name"]: i["value"]})
Это удалось исправить. И вроде все заработало. но оказалось не все. Файлы не отправляются. Причина тоже вроде найдена, но исправить не получилось. Причина, что при разборе кода страницы ищется форма для отправки по id="uploadfileblue"
Python:
    s = bs4.BeautifulSoup(r.content, features="lxml")
    el = s.find(id="uploadfileblue")
    ...
    // тут получаем атрибут Name поля Input
    n = el.attrs["name"]
    ...
    // далее отправляются файлы
Но Name возвращается как "file[]", но в коде браузера атрибут Name создается динамически и каждый раз разный, например
HTML:
<input id="uploadfileblue" accept=".php" type="file" name="cfbda5ea[]" multiple="multiple">
Поэтому ничего не отправляется.
@Daniel , подскажи пожалуйста, а когда нет HR+ в кодированном файле(как будто другая кодировка), но есть файл лицензии. Чито делать? Я про модуль https://ucrack.com/threads/3735/post-23993

Там файл лицензии и файлы под кубом, которые не расшифровываются на всем известном сайте. Ладно понятно, динамик Кей, функции пустые, тут же он отказывается его расшифровывать
 
@pomansur написать владельцу известного сайта, возможно что с файлом лицензии можно будет расшифровать, но автор этого модуля настолько жадный, что купил полую версию енкодера (300$) и легко там не будет. Он когда-то хвалился, что никто его модуль не смог взломать, как не пытались, даже за деньги.
 
@pomansur написать владельцу известного сайта, возможно что с файлом лицензии можно будет расшифровать, но автор этого модуля настолько жадный, что купил полую версию енкодера (300$) и легко там не будет. Он когда-то хвалился, что никто его модуль не смог взломать, как не пытались, даже за деньги.
Подтверждаю, аффтар говнист. Хотя модули его ничем существенным не выделяются
 
Назад
Верх