Zaciemnianie kodu

Wysłany przez kuba dnia 07-01-02 w perl, programowanie

Zaciemnianie kodu (code obfuscation) to proces czyni±cy go trudnym do przeczytania i zrozumienia, jednak pozostawiaj±cy nadal wykonywalnym. Perl ze swoimi zwariowanymi mo¿liwo¶ciami sk³adniowymi idealnie nadaje siê do takich zabaw.

Yet Another Obfuscation Engine (yaoe.pl) jest jednym z zaciemniaczy tworz±cym nawet z prostego skryptu pozornie bezsensowny ci±g znaków. Spotka³em siê z tym po raz pierwszy trochê ponad rok temu, kiedy to firma Strange Logic szuka³a nowych programistów. Otrzyma³em link do strony www.hackpoland.com, gdzie znajdowa³ siê skrypt zaciemniony t± metod± (aby siê tego dowiedzieæ wystarczy³o zapytaæ google - powsta³y kod jest dosyæ charakterystyczny). Uruchamiaj±c go mo¿na by³o poczytaæ wiêcej na temat firmy oraz wyzwania jakie stawia osobom, które chcia³yby dla niej pracowaæ. Wyda³ mi siê to bardzo dobry sposób na poszukiwanie nowych pracowników :) W wyzwaniu chodzi³o o to, aby odnale¼æ zaszyty w kodzie komentarz z odno¶nikiem do strony internetowej z dalszymi intstrukcjami ;) Jeden wieczór zajê³o mi jego odczytanie. Wys³a³em firmie swoje CV, ale nie dosta³em ¿adnej odpowiedzi i zapomnia³em o sprawie :) Niedawno mi siê to przypomnia³o i rekreacyjnie napisa³em 'odciemniacz' kodu zaciemnionego przez skrypt yaoe.pl (to co napisa³em rok wcze¶niej dzia³a³o tylko na kod ze strony hackpoland). Nie okaza³o siê to trudnym zadaniem i zajê³o mi jeden poranek ;) Skrypt powinien odwróciæ proces zaciemniania przynajmniej tak, aby mo¿na by³o odczytaæ pierwotny kod (prawdopodobnie nie zawsze da siê potem uruchomiæ).

 

#!/usr/bin/perl
#Deobfuscates perl code (obfuscaded by Yet Another Obfuscation Engine)
#author: Jakub Zalas
#version: 20061230
#first version: 2005
#licence: GPL
use strict;
use warnings;

die "Usage:\n\t$0 file_name_to_deobfuscate.pl\n" if !defined($ARGV[0]);
my $fileName = $ARGV[0];

my %code = (
"\t" => "chr oct ord w",
"\n" => "chr hex a",
' ' => "chr oct hex ffa",
'!' => "chr hex hex hex f",
'"' => "chr oct oct hex ceaa",
'#' => "chr oct hex abaa",
'$' => "chr oct hex afaa",
'%' => "chr oct oct hex daaa",
'&' => "chr hex oct hex cda",
"'" => "chr oct hex baba",
'(' => "chr hex oct hex daa",
')' => "chr oct hex caaa",
'*' => "chr oct hex ceaa",
'+' => "chr oct sqrt hex afa",
',' => "chr oct sqrt hex baa",
'-' => "chr oct hex daaa",
'.' => "chr oct hex ddea",
'/' => "chr oct sqrt hex cba",
0 => "oct a",
1 => "m mm",
2 => "int log hex a",
3 => "int sqrt hex a",
4 => "int log ord a",
5 => "int log hex aa",
6 => "chr sqrt hex baa",
7 => "int log hex aaa",
8 => "int oct ord l",
9 => "int oct ord w",
':' => "chr oct oct ord n",
';' => "chr sqrt hex daa",
'<' => "chr oct oct ord p",
'=' => "chr sqrt hex eaa",
'>' => "chr oct oct ord r",
'?' => "chr sqrt hex faa",
'@' => "chr oct ord d",
'[' => "chr oct oct hex cd",
"\\" => "chr oct oct hex ce",
']' => "chr oct oct hex cf",
'^' => "chr oct hex hex dfa",
_ => "chr log sqrt exp hex be",
'`' => "chr hex oct oct ord p",
'{' => "chr oct hex ad",
'|' => "chr oct hex ae",
'}' => "chr oct hex af",
'~' => "chr oct oct hex ord h",
);
my %decode = ();
foreach my $key ( keys( %code ) ) {
$decode{$code{$key}} = $key;
}

undef $/;
open FILE, "<$fileName";
my $file = ;
close FILE;

$file =~ s/\s+/ /g;

my @tmp = split("eval if ", $file);
my @part1 = split(" x ", $tmp[0]);
my @part2 = split(" x ", $tmp[1]);
undef @tmp;

my $count=0;
while($count<2) {
my $repeat=1;
my @part;
@part = @part1 if $count==0;
@part = @part2 if $count==1;

for(my $i=$#part; $i>=0; $i--) {
my $row = $part[$i];

#in obfuscator repeating characters are being replaced
#by the sequence from the following regexp
if($row =~ /^s zzchr ordze(\s+|$)/) {
$repeat++;
next;
}

#decode
if($row =~ /s zz(.*?)ze/ && defined($decode{$1})) {
my $entity = $1;
$row =~ s/s zz${entity}ze/$decode{$entity}/
}

$row =~ s/s zzucfirst (.*?)ze/\u$1/ or
$row =~ s/s zzuc q y(.*?)yze/\U$1\L/ or
$row =~ s/s zzuc (.*?)ze/\U$1\L/ or
$row =~ s/s aaucfirst (.*?)ae/\u$1/ or
$row =~ s/s aauc (.*?)ae/\U$1\L/ or
$row =~ s/s zz(.*?)z/$1/ or
$row =~ s/s aa(.*?)a/$1/;

$row =~ s/q (y|b)(.*?)\1/$2/gi;

print $row for 1 .. $repeat;

$repeat = 1;
}

$count++;
}

1;


Napisz komentarz