0

我正在尝试对代码进行去混淆处理。这段代码使用了很多长变量名,在运行代码时这些变量名被替换为有意义的名称。

如何在搜索和替换时保留状态?

例如,使用这样的混淆线:

${${"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;
4

3 回答 3

3

要匹配字符串中的文字元字符,您可以使用quotemeta或:

s/\Q$key\E/$replace/
于 2012-09-30T11:05:48.277 回答
1

告诉 Perl 不要解释 $key 中的字符:

s/\Q$key/$value/g
于 2012-09-30T11:00:49.620 回答
1

考虑使用B::Deobfuscate并逐渐将变量名称输入到其配置文件中,因为您弄清楚它们的作用。

我对您保存状态的请求有点困惑。你到底在做什么/你打算对输出做什么?这是一次完成所有替换的(未经测试的)示例,如果有帮助吗?

my %map;
while ( my $line = <MAPPING> ) {
    chomp $line;
    my ($key, $value) = split("=", $line);
    $map{$key} = $value;
}
close MAPPING;

my $search = qr/(@{[ join '|', map quotemeta, sort { length $b <=> length $a } keys %map ]})/;
while ( my $line = <INPUT> ) {
    $line =~ s/$search/$map{$1}/g;
    print OUTPUT $line;
}
于 2012-09-30T12:33:03.423 回答