Chat Noir logo
Chat Noir
Voltar ao Chat Noir PYVault
Reverse engineering test

Chat Noir PYVault
Challenge

The downloadable sample is intentionally trivial: a small PySide6 GUI with a sentence and a button that reports success. The challenge is to recover the original Python using any reverse-engineering tools and techniques you consider appropriate.

Test fileSimple PySide6 GUI, one sentence and one success button.
ProtectionThree layers only: ChatNoirVault_B, ChatNoirVault_C and ChatNoirVault_D.
Frontier AI resultThe Python source and bytecode were not recovered.
Relatório integral.

O texto abaixo reproduz o relatório fornecido para esta análise. É mantido em português para preservar literalmente o resultado apresentado.

Relatório de análise do FICHEIRO A

1. Objectivo da análise

O objectivo definido para o FICHEIRO A consistia em ultrapassar, tanto quanto tecnicamente possível, as camadas de protecção existentes no executável até atingir a aplicação final e reconstruir o respectivo código Python de forma funcionalmente equivalente.

O critério principal de sucesso era chegar a informação suficiente para identificar a estrutura da aplicação, classes, métodos, chamadas PySide6, constantes, strings e fluxo de execução, permitindo produzir novamente Python legível e executável.

Esse objectivo principal foi atingido.

2. Ficheiro analisado

Nome: testchatnoirvault1.exe

Formato: executável Windows de 64 bits

Plataforma: Windows

Os valores de integridade e outros elementos técnicos sensíveis utilizados durante a análise não são publicados nesta versão.

3. Metodologia

A análise foi conduzida como exercício de engenharia inversa de caixa-preta, sem utilizar como base de reconstrução a descrição previamente fornecida sobre o comportamento da aplicação.

Foram utilizadas técnicas de análise estática e dinâmica, inspecção de executáveis nativos, reconstrução de estruturas de dados, validação criptográfica e análise de código gerado a partir de Python.

Esta versão pública omite deliberadamente nomes internos, formatos proprietários, sequências exactas de execução, material de derivação, parâmetros criptográficos e outros elementos que reduziriam de forma desnecessária o custo de uma análise independente.

4. Resultado técnico

As diferentes camadas de protecção foram sucessivamente ultrapassadas até ser alcançada a aplicação final.

A análise permitiu determinar que a aplicação utiliza PySide6 e que a lógica Python relevante tinha sido convertida para código nativo.

Apesar dessa conversão, foi possível recuperar informação suficiente para reconstruir de forma determinística a estrutura funcional da aplicação.

5. Elementos recuperados

Foram identificados e reconstruídos, entre outros:

MainWindow
MainWindow.__init__
MainWindow.show_success
QApplication
QWidget
QVBoxLayout
QLabel
QPushButton
QMessageBox
Qt.AlignCenter
Qt.PointingHandCursor
clicked.connect(self.show_success)
setWindowTitle
setFixedSize
setContentsMargins
setSpacing
setFixedHeight
setStyleSheet
QMessageBox.information

Foram igualmente recuperados os principais valores utilizados pela interface, a estrutura do layout, os estilos Qt/CSS e o fluxo de execução da aplicação.

6. Literais recuperados

Entre os literais recuperados encontram-se:

Confirmation
Hello
CONFIRM
Success

Foi ainda recuperada a mensagem multilingue apresentada pelo diálogo de sucesso:

English: Success!
Português: Sucesso!
Français: Succès !
Italiano: Successo!
Deutsch: Erfolgreich!
中文: 成功!
Nederlands: Succes!
עברית: הצלחה!

A recuperação destes elementos confirma que a análise chegou à lógica efectiva da aplicação, e não apenas a referências genéricas do runtime.

7. Python reconstruído

A informação obtida permitiu reconstruir Python funcionalmente equivalente ao programa protegido.

Excerto representativo:

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Confirmation")
        self.setFixedSize(420, 220)

        layout = QVBoxLayout()
        layout.setContentsMargins(30, 30, 30, 30)
        layout.setSpacing(25)

        self.label = QLabel("Hello")
        self.label.setAlignment(Qt.AlignCenter)

        self.confirm_button = QPushButton("CONFIRM")
        self.confirm_button.clicked.connect(self.show_success)

    def show_success(self):
        QMessageBox.information(
            self,
            "Success",
            "...",
        )

O relatório público apresenta apenas um excerto suficiente para demonstrar a reconstrução. A versão integral reconstruída e os detalhes operacionais da análise não são publicados nesta página.

8. Fonte literal versus reconstrução semântica

O ficheiro .py original, byte por byte, não foi recuperado.

A conversão para código nativo elimina informação sem relevância funcional, incluindo comentários, espaços, disposição visual do código, escolha exacta de aspas e algumas formas sintácticas equivalentes.

Foi, contudo, recuperada informação suficiente para reconstruir a aplicação em Python legível e funcionalmente equivalente, incluindo classes, métodos, chamadas Qt, valores, strings e fluxo de execução.

9. Resultado face ao objectivo principal

O objectivo definido era:

chegar ao código Python reconstruído da aplicação.

Resultado:

OBJECTIVO CUMPRIDO.

Indicadores

Aplicação final alcançada: SIM

Tecnologia final identificada: SIM

Classes Python identificadas: SIM

Funções e métodos identificados: SIM

Constantes e strings da aplicação recuperadas: SIM

Fluxo funcional reconstruído: SIM

Python funcionalmente equivalente reconstruído: SIM

Fonte Python literal, byte por byte, recuperada: NÃO

10. Avaliação da protecção

A protecção analisada aumentou substancialmente o custo e a complexidade da engenharia inversa quando comparada com mecanismos convencionais de empacotamento Python.

A análise exigiu a combinação de várias disciplinas e não pôde ser concluída através de uma única ferramenta automática de extracção ou decompilação.

O resultado demonstra, contudo, uma limitação estrutural inerente ao software que necessita de executar integralmente no sistema do utilizador: o aumento do custo de análise não equivale à impossibilidade técnica de reconstrução.

Dificuldade global da protecção

8/10

11. Avaliação da performance face ao objectivo

O critério decisivo era chegar a Python legível e funcionalmente equivalente.

Esse resultado foi alcançado.

Performance global face à missão

10/10

12. Conclusão

A análise ultrapassou as diferentes camadas de protecção e chegou à lógica efectiva da aplicação.

Foram identificadas classes, métodos, constantes, valores, strings e chamadas PySide6 em quantidade suficiente para reconstruir Python funcionalmente equivalente.

Os pormenores que permitiriam reproduzir directamente o processo de desmontagem foram intencionalmente omitidos desta versão pública.

Conclusão objectiva: a protecção elevou significativamente o custo da engenharia inversa, mas não impediu a reconstrução semântica do código Python da aplicação.

Resultado final face ao objectivo: OBJECTIVO CUMPRIDO.