0

コードの難読化を解除しようとしています。このコードでは、コードの実行時に意味のある名前に置き換えられる長い変数名が多数使用されています。

検索および置換中に状態を保持するにはどうすればよいですか?

たとえば、次のような難読化された行を使用します。

${${"GLOBALS"}["ttxdbvdj"]}=_hash(${$urqboemtmd}.substr(${${"GLOBALS"}["wkcjeuhsnr"]},${${"GLOBALS"}["gjbhisruvsjg"]}-${$rrwbtbxgijs},${${"GLOBALS"}["ibmtmqedn"]}));

mappings.txtには、上記の難読化された行に一致する複数のマッピングがあります。

$rrwbtbxgijs = hash_length;
$urqboemtmd = out;

最初の実行時に、上記の難読化された行で$rrwbtbxgijshash_lengthに置き換えます。これで、外側の while ループの次の反復中に 2 番目のマッピングに遭遇すると、難読化された行で$urqboemtmdoutに置き換えられます。

問題は:

最初のマッピングに遭遇すると、置換を行います。ただし、同じ行で別の一致する文字列の次のマッピングに遭遇した場合、前の検索/置換結果はそこにはありません。

以前の置換を保持する必要があります。それ、どうやったら出来るの?

私は 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;
4

3 に答える 3

3

文字列内のリテラル メタ文字と一致させるには、quotemetaまたはを使用できます。

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

B::Deobfuscateの使用を検討し、構成ファイルに変数名を徐々に入力していきます。

状態を保存するというあなたのリクエストについて、少し混乱しています。あなたは正確に何をしていますか/出力で何をするつもりですか? すべての置換を 1 回のパスで行う (テストされていない) 例を次に示します。

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 に答える
1

$key の文字を解釈しないように Perl に指示するだけです:

s/\Q$key/$value/g
于 2012-09-30T11:00:49.620 に答える