我正在尝试对代码进行去混淆处理。这段代码使用了很多长变量名,在运行代码时这些变量名被替换为有意义的名称。
如何在搜索和替换时保留状态?
例如,使用这样的混淆线:
${${"GLOBALS"}["ttxdbvdj"]}=_hash(${$urqboemtmd}.substr(${${"GLOBALS"}["wkcjeuhsnr"]},${${"GLOBALS"}["gjbhisruvsjg"]}-${$rrwbtbxgijs},${${"GLOBALS"}["ibmtmqedn"]}));
mappings.txt中有多个映射匹配上面的混淆行,例如:
$rrwbtbxgijs = hash_length;
$urqboemtmd = out;
在第一次运行时,它将在上面的混淆行中用hash_length替换$rrwbtbxgijs 。现在,当它在外部 while 循环的下一次迭代中遇到第二个映射时,它将在混淆的行中用out替换$urqboemtmd 。
问题是:
当遇到第一个映射时,它会进行替换。但是,当在同一行中遇到不同匹配字符串的下一个映射时,先前的搜索/替换结果不存在。
它应该保留以前的替换。我怎么做?
我编写了一个 Perl 脚本,它会从mapping.txt中选择一个映射,并在整个混淆代码中搜索该映射的所有出现,并将其替换为有意义的文本。
这是我写的代码:
#! /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;