Я ищу дешифровщик l2.ini

Статус
В этой теме нельзя размещать новые ответы.

Symmetry

Путник
Участник
Сообщения
39
Розыгрыши
0
Решения
1
Репутация
0
Реакции
10
Баллы
56
Я ищу дешифровщик l2.ini для хроник Prelude of War и более поздних, где его найти?
 
Решение
Ды я говорю,серв запустил другой человек, мб проблема там, а не в том что я не могу дешифровать л2ини. Никого не хочу клеветать. Вывод надо все самому делать просто.
Разберусь как самому тогда серв запускать - вернусь) всем спасибо) извините если что) я только начал свой путь хакера
Сообщение объединено:
Для таких как я, нужен не датник а ексешник как у Мико программка где все новые хроники будут тоже отображены)
L2 encoder/decoder version 2.10.1 by M.Soltys (aka DStuff).
Supported headers: 111, 120, 121, 211, 212, 41x legacy, 41x patched.

USAGE: l2encdec.exe <command> <source file> [destination file]

Mandatory commands:

-l/g : decrypt original L2 files
-s/d : decrypt
-h/e : <met> encrypt using specific method
<met> can be: 111, 120, 121, 211, 212, 411, 412, 413, 414)
-t : ignore tail (i.e. Exteel files have no tail)

Optional commands:

-r : <rsa> choose the proper key pair. <rsa> can be:
0 - l2encdec's default
1 - L2J-VN (only decrytping at this moment)
 

Вложения

z0n4r1e, почему мне страшно прожимать ехе?)
Сообщение объединено:
Shakaho, да такой у меня есть, а какие там хроники тогда выбирать? Хроник Prelude of War там нет
 
Последнее редактирование:

Вложения

Последнее редактирование:
z0n4r1e, почему мне страшно прожимать ехе?)
как минимум можно закинуть в вирус тотал или нейронку типо клодыча, что б протестили на наличие вредоносного кода

и да, ты не уточнил какой именно прелюд оф вар
который 2003-2004 год с 377 протоколом или же 2019-2020 года который 228, 235 и 245?

когда ковырял С1 то использовал старый раскодировщик
который тебе скинул z0n4r1e

сейчас вообще можно скинуть этот кодировщик нейронке и попросить написать под него полноценный интерфейс что б не корячится с смд командами.
 
ну вот скачиваю например с акуму тот л2ини

открывается обычным от вездевлаза редактором без проблем

1786968188564.webp

редактор от мико открывает ласт корею тоже без проблем
1786968398449.webp
 
Что то все равно не получается зайти на сервер. Нужно адрес вставить в строку? ServerAddr=
 
Посмотреть вложение 97247
1786968780031.webp
1786968882534.webp
Сообщение объединено:
Что то все равно не получается зайти на сервер. Нужно адрес вставить в строку? ServerAddr=
да, если ты запустил локальный то 127.0.0.1
 
и что там вирусы были?)) чет не могу теперь с гита скачать у Мико)
Серв челик другой запустил, я скачал клиент стараюсь подключиться к нему)
Крч ладно, сам запущу серв, тогда буду подключаться
 
наверно рано серв запускать еще :ROFLMAO:
 
Необоснованные (без доказательств) обвинения
z0n4r1e, походу))
Сообщение объединено:
збс форум, екзешники с вирусами
 
да запусти L2ClientDat мобиуса, он на Java 24 и без экзешника
 
z0n4r1e, походу))
Сообщение объединено:
збс форум, екзешники с вирусами
да хоспади даже если ты напишешь екзешник на 2 строки кода и там будет какая то шифровка\кодировка\дешифровка то 100% выдаст ложно положительный резульбтат любой более менее антивирусник

тем более что добрая аудитория форума сами лепят для себя такие тузлы и просто делятся с другими.
 
збс форум, екзешники с вирусами
Где ты там вирус то увидел?)

Можешь вот питон код взять этот. Там Lineage2Ver413 это обычный RSA с известными ключами.


Python:
"""Переключает l2.ini между открытым видом и Lineage2Ver413."""

import os
import shutil
import sys
import tempfile
import zlib
from pathlib import Path
from typing import Optional, Sequence


HEADER_TEXT = "Lineage2Ver413"
HEADER = HEADER_TEXT.encode("utf-16le")
HEADER_PREFIX = "Lineage2Ver".encode("utf-16le")
HEADER_SIZE = 28
RSA_BLOCK_SIZE = 128
RSA_BODY_SIZE = 124

LEGACY_MODULUS = int(
    "97df398472ddf737ef0a0cd17e8d172f"
    "0fef1661a38a8ae1d6e829bc1c6e4c3c"
    "fc19292dda9ef90175e46e7394a18850"
    "b6417d03be6eea274d3ed1dde5b5d7bd"
    "e72cc0a0b71d03608655633881793a02"
    "c9a67d9ef2b45eb7c08d4be329083ce4"
    "50e68f7867b6749314d40511d09bc574"
    "4551baa86a89dc38123dc1668fd72d83",
    16,
)
LEGACY_PRIVATE_EXPONENT = 0x35

MODERN_MODULUS = int(
    "75b4d6de5c016544068a1acf125869f4"
    "3d2e09fc55b8b1e289556daf9b875763"
    "5593446288b3653da1ce91c87bb1a5c1"
    "8f16323495c55d7d72c0890a83f69bfd"
    "1fd9434eb1c02f3e4679edfa43309319"
    "070129c267c85604d87bb65bae205de3"
    "707af1d2108881abb567c3b3d069ae67"
    "c3a4c6a3aa93d26413d4c66094ae2039",
    16,
)
MODERN_PUBLIC_EXPONENT = int(
    "30b4c2d798d47086145c75063c8e841e"
    "719776e400291d7838d3e6c4405b504c"
    "6a07f8fca27f32b86643d2649d1d5f12"
    "4cdd0bf272f0909dd7352fe10a77b34d"
    "831043d9ae541f8263c6fe3d1c14c2f0"
    "4e43a7253a6dda9a8c1562cbd493c1b6"
    "31a1957618ad5dfe5ca28553f746e2fc"
    "6f2db816c7db223ec91e955081c1de65",
    16,
)
MODERN_PRIVATE_EXPONENT = 0x1D

DECRYPTION_KEYS = (
    (LEGACY_MODULUS, LEGACY_PRIVATE_EXPONENT),
    (MODERN_MODULUS, MODERN_PRIVATE_EXPONENT),
)


class L2IniError(Exception):
    """Ошибка проверки или преобразования l2.ini."""


def decode_rsa_blocks(data: bytes, modulus: int, exponent: int) -> bytes:
    payload = data[HEADER_SIZE:]
    if len(payload) % RSA_BLOCK_SIZE == 20:
        payload = payload[:-20]
    if not payload or len(payload) % RSA_BLOCK_SIZE:
        raise L2IniError("Некорректная длина RSA-данных")

    packed = bytearray()
    for offset in range(0, len(payload), RSA_BLOCK_SIZE):
        encrypted_block = payload[offset : offset + RSA_BLOCK_SIZE]
        encrypted_number = int.from_bytes(encrypted_block, "big")
        plain_number = pow(encrypted_number, exponent, modulus)
        plain_block = plain_number.to_bytes(RSA_BLOCK_SIZE, "big")

        if plain_block[:3] != b"\0\0\0":
            raise L2IniError("Некорректный заголовок RSA-блока")
        body_length = plain_block[3]
        if not 1 <= body_length <= RSA_BODY_SIZE:
            raise L2IniError("Некорректный размер данных RSA-блока")

        aligned_length = (body_length + 3) & ~3
        body_offset = RSA_BLOCK_SIZE - aligned_length
        packed.extend(plain_block[body_offset : body_offset + body_length])

    if len(packed) < 10:
        raise L2IniError("Сжатый поток слишком короткий")
    expected_size = int.from_bytes(packed[:4], "little")
    try:
        plain = zlib.decompress(packed[4:])
    except zlib.error as error:
        raise L2IniError(f"Не удалось распаковать zlib: {error}") from error
    if len(plain) != expected_size:
        raise L2IniError(
            "Размер после распаковки не совпал: "
            f"ожидалось {expected_size}, получено {len(plain)}"
        )
    return plain


def decrypt_l2_ini(data: bytes) -> bytes:
    last_error: Optional[Exception] = None
    for modulus, exponent in DECRYPTION_KEYS:
        try:
            return decode_rsa_blocks(data, modulus, exponent)
        except (L2IniError, OverflowError, ValueError) as error:
            last_error = error
    raise L2IniError("RSA-ключ не подошёл или данные повреждены") from last_error


def encrypt_l2_ini(plain: bytes) -> bytes:
    packed = len(plain).to_bytes(4, "little") + zlib.compress(plain, level=9)
    encrypted = bytearray(HEADER)

    for offset in range(0, len(packed), RSA_BODY_SIZE):
        body = packed[offset : offset + RSA_BODY_SIZE]
        plain_block = bytearray(RSA_BLOCK_SIZE)
        plain_block[3] = len(body)
        aligned_length = (len(body) + 3) & ~3
        body_offset = RSA_BLOCK_SIZE - aligned_length
        plain_block[body_offset : body_offset + len(body)] = body

        plain_number = int.from_bytes(plain_block, "big")
        encrypted_number = pow(
            plain_number, MODERN_PUBLIC_EXPONENT, MODERN_MODULUS
        )
        encrypted.extend(encrypted_number.to_bytes(RSA_BLOCK_SIZE, "big"))

    tail = bytearray(20)
    tail[12:16] = (zlib.crc32(encrypted) & 0xFFFFFFFF).to_bytes(4, "little")
    encrypted.extend(tail)
    return bytes(encrypted)


def replace_with_backup(path: Path, data: bytes) -> None:
    backup = path.with_name(path.name + ".bak")
    descriptor, temporary_name = tempfile.mkstemp(
        prefix=f".{path.name}.", suffix=".tmp", dir=path.parent
    )
    temporary = Path(temporary_name)
    try:
        with os.fdopen(descriptor, "wb") as output:
            output.write(data)
            output.flush()
            os.fsync(output.fileno())
        os.chmod(temporary, path.stat().st_mode)
        if not backup.exists():
            shutil.copy2(path, backup)
        os.replace(temporary, path)
    finally:
        if temporary.exists():
            temporary.unlink()


def switch_l2_ini(input_path: str) -> None:
    path = Path(input_path).expanduser().absolute()
    if not path.is_file():
        raise L2IniError(f"Файл не найден: {path}")
    if path.is_symlink():
        raise L2IniError(f"Символические ссылки не поддерживаются: {path}")

    file_data = path.read_bytes()
    if file_data.startswith(HEADER_PREFIX):
        if len(file_data) < HEADER_SIZE:
            raise L2IniError("Повреждён заголовок Lineage2Ver")
        try:
            header = file_data[:HEADER_SIZE].decode("utf-16le")
        except UnicodeDecodeError as error:
            raise L2IniError("Повреждён заголовок Lineage2Ver") from error
        if header != HEADER_TEXT:
            raise L2IniError(
                f"Поддерживается только {HEADER_TEXT}, получен: {header}"
            )
        result = decrypt_l2_ini(file_data)
        action = "Расшифрован"
    else:
        result = encrypt_l2_ini(file_data)
        action = "Зашифрован"

    replace_with_backup(path, result)
    print(f"{action}: {path}")
    print(f"Резервная копия: {path}.bak")


def main(arguments: Sequence[str]) -> int:
    if not arguments:
        print("Перетащите l2.ini на этот Python-скрипт или передайте путь аргументом.")
        return 2

    failed = False
    for input_path in arguments:
        try:
            switch_l2_ini(input_path)
        except (L2IniError, OSError) as error:
            failed = True
            print(f"Ошибка для '{input_path}': {error}", file=sys.stderr)
    return 1 if failed else 0


if __name__ == "__main__":
    raise SystemExit(main(sys.argv[1:]))
 
но все же мне хочеца найти ответ как расшифровать нужные мне хроники, гранд крусейд ничего не сделал и это не те хроники.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху Снизу