2016-10-25 5 views
1

J'essaie d'apprendre à désobfuser du code qui est compliqué. Par exemple, je voudrais être en mesure de réécrire cette ligne de code:Deobfuscation: Simplifier les expressions Python3

return ('d' + chr(101) + chr(97) + chr(200 - 100)) # returns 'dead' 

à:

return 'dead' 

Donc, fondamentalement, je dois évaluer tous les littéraux dans le fichier py, y compris les expressions compliquées évaluer à des entiers simples. Comment puis-je écrire ce lecteur/existe-t-il quelque chose qui existe qui puisse le faire? Merci!

+2

https://docs.python.org/2/library/ast.html – Natecat

Répondre

1

Ce que vous voulez est un système de transformation de programme (PTS).

Cet outil permet d'analyser le code source d'un AST, de le transformer, puis de régénérer le code source valide à partir de l'arborescence. Voir ma réponse SO sur rewriting Python text pour quelque arrière-plan. Avec un outil de réorganisation de logiciel DMS (comme ma société) DMS (de mon entreprise), vous pouvez écrire des règles pour faire constante pliage, ce qui signifie essentiellement l'arithmétique de compilation.

Pour l'exemple que vous présentez, les règles suivantes peuvent accomplir l'exemple OP:

 rule fold_subtract_naturals(n:NATURAL,m:NATURAL): sum->sum = 
     " \n + \m " -> " \subtract_naturals\(\n\,\m\) "; 

    rule convert_chr_to_string(c:NATURAL): term->term = 
     " chr(\c) " -> make_string_from_natural(c) ; 

    rule convert_character_literal_to_string(c:CHARACTER): term->term = 
     " \c " -> make_string_from_character(c) ; 

    rule fold_concatenate_strings(s1:STRING, s2:STRING): sum->sum = 
     " \s1 + \s2 " -> " \concatenate_strings\(\s1\,\s2\) "; 

    ruleset fold_strings = { 
      fold_subtract_naturals, 
      convert_chr_to_string, 
      convert_characater_to_string, 
      fold_concatenate_strings }; 

Chacune des règles individuelles correspond correspondantes syntaxe/arbres. Ils sont écrits de telle sorte qu'ils ne s'appliquent qu'aux constantes littérales.

fold_add_naturals trouve paires de constantes naturelles reliées par une opération d'ajout, et remplace celle de la somme en utilisant une fonction intégrée qui additionne deux valeurs et produit un noeud de valeur littérale contenant la somme.

convert_chr_to_string convertit chr (c) en littéral de chaîne correspondant.

convert_character_to_string convertit 'C' en la chaîne "C" correspondante.

fold_concatenate_strings combine deux chaînes littérales séparées par un opérateur add. Cela fonctionne de la même manière que fold_add_naturals.

subtract_naturals et concatenate_strings sont intégrés dans DMS. convert_chr_to_string et convert_character_to_string besoin d'être personnalisé dans le langage de métaprogrammation de DMS, PARLANSE, mais ces routines sont assez simples (peut-être 10 lignes).

L'ensemble de règles conditionne l'ensemble des règles afin qu'elles puissent toutes être appliquées. Non affiché est le code de base pour ouvrir un fichier, appeler l'analyseur, appeler le transformateur d'ensemble de règles (qui applique les règles jusqu'à ce qu'aucune règle ne s'applique). La dernière étape consiste à appeler la jolie imprimante pour réimprimer l'AST modifié.

De nombreux autres PTS offrent des fonctionnalités similaires.