2016-05-24 2 views
-1

Некоторые обфусцированный код JQuery (или по другим причинам программирования намеренно закодированных в шестнадцатеричном) содержит кучу произвольных строк, которые выглядят какпотребность SED или AWK сценария, который декодирует несколько шестнадцатеричных строк

"\x2e\x68\x65\x2d\x76\x69\x65\x77" 

Это декодирует например в строку ".he-view".

Я хотел бы передать этот код через скрипт, который преобразует все символы «\ xhh» в читаемые символы ASCII.

Пока я жду ответа, я приступаю к написанию фильтра lex.

Чтобы быть более точным: код содержит указанные выше шестнадцатеричные кодированные строки среди JS-кода. Фильтр должен отражать окружающий код и просто преобразовывать шестнадцатеричные строки на место, чтобы результат оставался читаемым и синтаксически правильным.

Здесь снова задача:

AAA,BBB,CCC "\x2e\x68\x65\x2d\x76\x69\x65\x77" DDD EEE 

должен давать

AAA,BBB,CCC ".he-view" DDD EEE 

Практически, это не играет никакой роли, будь то окружающий код JS, JQuery или что-то другое. Вопрос заключался в поиске фильтра, который преобразует все эти шестнадцатеричные строки в «» в читаемый ASCII. То, что остальная часть кода должна пройти, настоящим выразительно заявлена ​​снова.

Кроме того, я обнаружил, что шестнадцатеричные строки также указаны в парах одиночных кавычек (\ ').

И, конечно, инструмент/скрипт следует использовать в качестве фильтра, то есть предоставить ему входной файл, и он выплескивает преобразованный файл таким образом, чтобы все его вызовы «шестнадцатеричные строки» были преобразованы в читаемые ASCII.

FWIW, вот выдержка из документа, который должен быть преобразован:

switchImg: function (b, c) { 
     var d = b.data("\x61\x6e\x69\x6d\x61\x74\x65"); 
     d = d ? animation : "\x72\x61\x6e\x64\x6f\x6d"; 
     if (d == "\x72\x61\x6e\x64\x6f\x6d") { 
      var f = ["\x66\x61\x64\x65\x49\x6e", "\x66\x6c\x69\x70\x49\x6e\x48"]; 
      d = f[Math.floor(Math.random() * f.length)] 
     }; 
     var e = b.find("\x69\x6d\x67"); 
+0

Можете ли вы дать простой полный документ, который вы хотите перевести? Я могу уточнить свой ответ, если он не сработает с этим. Но это должно быть. – hek2mgl

+0

Я не вижу, чтобы в моем исходном посте не было достаточно информации, и почему я получил -1 для этого. – Krischu

+0

Используйте «echo -e AAA, BBB, CCC» \ x2e \ x68 \ x65 \ x2d \ x76 \ x69 \ x65 \ x77 «DDD EEE' - как я уже сказал – hek2mgl

ответ

1

По крайней мере, в Баш, вы можете просто использовать echo встроенную команду:

echo -e "\x2e\x68\x65\x2d\x76\x69\x65\x77" 

Выход:

.he-view 

Проверьте руководство пользователя help echo.

+0

Только для строки может работать, но я просто хочу отфильтровать строки «\ x ...» и отказаться от остальных. – Krischu

+0

Вы писали: 'Я хотел бы передать этот код через скрипт, который преобразует все символы« \ xhh »в читаемые символы ASCII». – hek2mgl

+0

Конечно, 'echo -e 'foo \ x2e \ x68 \ x65 \ x2d \ x76 \ x69 \ x65 \ x77 bar" 'будет работать. – hek2mgl

1

Мое решение проблемы в настоящее время является закон (гибкий) скрипт, который я составляю в фильтр:

%option noyywrap 
%{ 
#include <stdio.h> 
#include <string.h> 

#define A yytext[i] 
#define B yytext[i+1] 
#define F yytext[0] 
#define L yytext[strlen(yytext)-1] 
main() 
{ 
    while (yylex()); 
} 

%} 

%% 

\"([\\]x[0-9a-f][0-9a-f])*\"|\'([\\]x[0-9a-f][0-9a-f])*\' { int i=1; 
     printf("%c",F); 
     while(yytext[i]!=F) { 
      i++;i++;/* skip 2, backslash and x*/ 
      printf("%c",16*(A <'a'? (A-'0'): (A-'a'+10))|\ 
         (B <'a'? (B-'0'): (B-'a'+10))); 
      i++;i++; /* skip the two hex digits */ 
     } 
     printf("%c",L); /* append \" or \' */ 
} 

. { ECHO ; } 
%% 
Смежные вопросы