コードの難読化を解除しようとしています。このコードでは、コードの実行時に意味のある名前に置き換えられる長い変数名が多数使用されています。
検索および置換中に状態を保持するにはどうすればよいですか?
たとえば、次のような難読化された行を使用します。
${${"GLOBALS"}["ttxdbvdj"]}=_hash(${$urqboemtmd}.substr(${${"GLOBALS"}["wkcjeuhsnr"]},${${"GLOBALS"}["gjbhisruvsjg"]}-${$rrwbtbxgijs},${${"GLOBALS"}["ibmtmqedn"]}));
mappings.txtには、上記の難読化された行に一致する複数のマッピングがあります。
$rrwbtbxgijs = hash_length;
$urqboemtmd = out;
最初の実行時に、上記の難読化された行で$rrwbtbxgijsをhash_lengthに置き換えます。これで、外側の while ループの次の反復中に 2 番目のマッピングに遭遇すると、難読化された行で$urqboemtmdがoutに置き換えられます。
問題は:
最初のマッピングに遭遇すると、置換を行います。ただし、同じ行で別の一致する文字列の次のマッピングに遭遇した場合、前の検索/置換結果はそこにはありません。
以前の置換を保持する必要があります。それ、どうやったら出来るの?
私は Perl スクリプトを作成しました。このスクリプトは、mapping.txtから 1 つのマッピングを選択し、難読化されたコード全体でこのマッピングの出現箇所をすべて検索し、それを意味のあるテキストに置き換えます。
ここに私が書いたコードがあります:
#! /usr/bin/perl
use warnings;
($mapping, $input) = @ARGV;
open MAPPING, '<', $mapping
or die "couldn't read from the file, $mapping with error: $!\n";
while (<MAPPING>) {
chomp;
$line = $_;
($key, $value) = split("=", $line);
open INPUT, '<', $input;
while (<INPUT>) {
chomp;
if (/$key/) {
$_=~s/\Q$key/$value/g;
print $_,"\n";
}
}
close INPUT;
}
close MAPPING;