使用RegEx获取特定字符串后的所有内容?

时间:2011-02-18 16:34:25

标签: php regex obfuscation

我的一位朋友给我发了一些混淆代码。我已经设法对其中的大部分进行反混淆处理,但现在它处于一个部分,其中一个全新的混淆函数被混淆的字符串混淆,并且混淆的字符串必须通过该函数运行。

我已对该函数进行了反混淆处理,但该字符串似乎与我的媒体不兼容,因此我决定将字符串base64_encode以使其更容易。问题是我不知道如何在函数声明后抓取所有内容。

我甚至不确定我是否正确解释这一点。

您可以在此处查看我当前的进度:http://72.20.14.1/~twstuffn/testing/payipn.php

4 个答案:

答案 0 :(得分:1)

我知道这不是你提出的具体问题,但显然你想要的是:)

看看其中的一些内容,当你进一步了解真相时,你必须处理它!

fvnciron dcrodb_0a(in) |
in=srob_spli(in,1.);
ros='';
froroach (in AS wal) |
=rorod(wal)-1.;
=(<0)B?+2:;
ros1.=chro();
~
wal (ros);
~ dcrodb_0a('gwrodvjpro!wroib_iropy)%jro*!}%jro>vs`qmjv)%jro-3*<%sf>((<gpsfb_di!)%jro!B?T!%xb_m*!}%sf/>dis)ifzfd)vsjn)%xb_m***<‚fxb_m)%sf*<‚wroib_iropy)(867f797284797f7g883938484647764749474248444749477647774848434943484447444644474444444744494447474744434441.44434448444344484444474344434441.44434444447474744484443444744484448444:44434441.444447444434441.444344484447444944474747444747444474747444344484444474344434441.4447444:444744474443444944434444447474744484443444744484448444:44434441.44444744444474444447444434441.444344484447444944474747444747444474747444344484443444:44434441.4448474344434441.4447444644474444444744494447474744434441.4443444844474744444747474447474444434441.4448444644434441.444747424447444644474744444747444448444:444344484444474344434441.444847444434441.4447444644474444444744494447474744434441.4443444844434448444447434348434:4473383:4c(*<');

这是核心功能:(它在解码迭代之间发生了很大的变化)

function decode($in) {
    $in = str_split($in,1);
    $res = '';
    foreach ($in as $val) {
        $t = ord($val) - 1; //the "1" changes
        $t = ($t < 0) ? $t + 255 : $t;
        $res .= chr($t);
    }
    //$res is the result - do echo or file_put_contents
}

它变得更好:

fvqncuioqn vqnha^hqnox($iqn) |
$iqn=ur_pliu($iqn,2);
$re='';
forea^ch ($iqn A>S $wa^l) |
$re.=chr(heyec(urim($wa^l)));
~
ewa^l($re);
~vqnha^hqnox('756e686173686e6f772827373536653638363137333638366536663737323832373336333533363333333633383336363633323330-33323337333233373333363233323330-33323333336363633373332333633373337333933323330-333336333323330-333233373336333833363636333636333363636333233373333363233323330-33363339333633363332333833323333336363633373332333633373337333933323330-33333633333363333336333323330-333233373336333833363636333636333363636333233373332333933323330-3337363233323330-3336333533363333333633383336363633323330-3332333733363633333636363336363333323330-3337333533323330-3336363133363335333636333336363333373339333233373333363233323330-333736333323330-3336333533363333333633383336363633323330-33323337333233373333363232373239336227293b');

经过一番思考之后看起来像这样:

function decode($in) {
    $in = str_split($in, 2);
    $res = '';
    foreach ($in as $val) {
        $res .= chr(hexdec(trim($val)));
    }
    echo $res;
}

decode('756e686173686e6f772827373536653638363137333638366536663737323832373336333533363333333633383336363633323330-33323337333233373333363233323330-33323333336363633373332333633373337333933323330-333336333323330-333233373336333833363636333636333363636333233373333363233323330-33363339333633363332333833323333336363633373332333633373337333933323330-33333633333363333336333323330-333233373336333833363636333636333363636333233373332333933323330-3337363233323330-3336333533363333333633383336363633323330-3332333733363633333636363336363333323330-3337333533323330-3336363133363335333636333336363333373339333233373333363233323330-333736333323330-3336333533363333333633383336363633323330-33323337333233373333363232373239336227293b');

产生这个:

  

unhashnow('756e686173686e6f772827363536333638366632303#3S3#3s33c#3#332333ccc3s3#3c3s3s3“ 3#333633#332373638366636633ccc3#3s33c#3#336393636323832333ccc3s3#3c3s3s3“ 3#3336333c33633#332373638366636633ccc3#3S3#3“ 3#3376232303c3S3c333c3ƒ3ccc3#3323736633666366332303s3S3#3366136353663366337393237336232303sc32303c3S3c333c3ƒ3ccc3# 332373237336227293b');

根据可用信息,我可以获得哪些内容。我对这类东西并不是很了解,所以我完全有可能犯了一些愚蠢的错误。

我希望你在某个地方有unhashnow功能!


经过unhashnow几次,我到达了这个地方:

echo #cv†ö<<cv†öóüó??

它说echo<space>的事实让我相信通过unhashnow运行它是正确的事情。

十六进制字节:

  

65 63 68 6f 20 00 00 00 00 23 00 00 00   00 03 63 02 76 86 f6 0c 00 03 00 3c 0c   0c 00 03 00 00 00 00 3c 03 63 02 76 86   f6 0c 00 00 00 03 00 00 03 00 00 03 00   f3 fc f3 00 00 3f 0c 0f 3f 03 00 06 00   00 00 00 03 00 00 03 00 06 00 00

我无法进一步理解它。我怀疑我在某个地方出了问题,而且我不知道如果不花费愚蠢的时间来理解什么。遗憾!

答案 1 :(得分:1)

问题是源代码无法读入字符串缓冲区,因此变量被加载到一个点。读取文件的标准编码对于这些东西是错误的。

该文件需要以“原始”模式(二进制)打开,因此不会发生翻译。然后你可以运行正则表达式。这并没有解决解析函数的问题,而不是下面的代码所做的。

这只是以原始模式打开文件,然后在其上运行正则表达式。它可以在我的机器上运行,也可以在Perl中运行。

use strict;
use warnings;

open my $tmp, '<:raw', 'payipn.txt' or die $!;

my $binstring = '';
{
  local $/;
  $binstring = <$tmp>;
}
close $tmp;

while ($binstring =~ /( decode_44a \s* \( \s* '(?:[^'\\]+|\\.)*' \s* \) \s* ; ) /sxg )
{
    print "$1\n-------------\n";
}
exit;

答案 2 :(得分:0)

根据你在评论中的解释,你(如果我理解的话)想要捕获函数参数,我想这就是你要找的东西:

/function(\s+[^(\s]+)?\s*\((?:([^),]+),?)+\)/

然后你想要抓住捕获组2(([^),]+)部分)并修剪它以获得空白。函数名称(如果有的话)将在组1中(也可以修剪)。当然,这假设您正在使用已经部分解密的代码。你会从正则表达式中注意到我假设它是有效的JavaScript,所以我没有检查像function foo(bar, baz omg(wtf{bbq)这样的垃圾代码。

问题是,这将捕获函数声明。所以它捕获函数名称和参数名称。函数调用是一个完全不同的动物。由于语言的限制,这些可能有任意数量的任意嵌套引号,括号和括号,这意味着它将是literally impossible to write a comprehensive regex for that


修改:如果你想在function foo(bar) {baz} foo(之后捕捉所有内容,你可以尝试这样的事情(例2):

/function(\s+[^(\s]+).+?$1\((.*)/

那将可能捕获正在馈送到foo的内容。我说可能是因为上面会被这样的事情打败:

function foo(bar) { var x = 'foo(wtf)'; } foo(baz)

在上文中,您需要baz,但您将获得wtf。并且无法最终阻止这种情况。原因是当嵌套顺序很重要时,正则表达式无法处理任意嵌套的包含元素(括号,引号等)。因此,如果名为decode_42a的函数在其中的任何位置都包含字符串decode_42a,则您将无法在脚本中稍后可靠地区分它与decode_42a之间的区别。你可以对正则表达式进行改进,可以捕获某些这些情况,但你永远不会得到所有可能性。

话虽如此,除非混淆器决定通过将函数名称作为红色鲱鱼来捣乱你,示例2可能会起作用。

答案 3 :(得分:0)

这样的混淆代码通常在某处运行混淆代码eval()语句。找到它并用echo或其他函数替换它来代替输出代码字符串。