38

私はポリモーフィックコードとメタモルフィックコードの概念を理解していますが、最近両方のウィキペディアのページを読みました (理由は何であれ、以前にこれを行ったことはありませんでした!)。今、私は自分自身のためにいくつかのメタモルフィック コードを書いてみたいと思っています。

私は言語のマスターではなく、多くのことに手を出しています。PHP、MySQL、c/c++、Java、Bash スクリプト、Visual Basic 6、VBScripting、Perl、JavaScript について知っています。

これらの言語のいずれかでメタモルフィック コードの例を提供できる人はいますか。プログラムの出力が単に「Hello World」であっても、例を通してこれがどのように起こっているかを理解するために、実際の例を見たいと思います (私はこれらの手法が精神的な思考だけでどのように達成できるかを理論化するのに苦労しています)。実際にはどの言語でも構いませんが、それらは単に優先される言語です。

さらに、インターネットを検索しても、c/c++ の限られた数の例しか返されませんでした (完全な動作例、コードの部分的なスニペットでさえありません)。 /メタモルフィック コードを作成するには柔軟性が必要ですか?

4

4 に答える 4

26

公開されているメタモルフィック コード サンプルは、いくつかの要因によって制限されています。

  • 1) 専門知識:メタモルフィック コーディングは、コンピューター プログラミングにおける非常に高度な技術です。サンプリングに適した一貫性のあるクリーンなメタモルフィック コードをコーディングできるプログラマーの数は非常に少ないです。

  • 2) 金銭的インセンティブ:メタモルフィック コーディングは、商用アプリケーションでの使用が制限されています。このため、メタモルフィック コードを作成するのに十分なスキルを持っているプログラマーの多くは、メタモルフィック コーディング技術を作成/学習するための専門的な露出/インセンティブを持っていません。

  • 3) 正当性:メタモルフィック コーディングには、強力なウイルスの作成に大きな用途があります。したがって、変成コードを作成した責任ある専門家は、サンプルを自由に配布する倫理的な問題を抱えることになります。逆に、メタモーフィック コードを作成するのに十分な能力を持つハッカーは、能力に基づいて容疑者の非常に短いリストに含まれるため、攻撃の 1 つが明らかになったとしても、彼のスキルを宣伝するインセンティブはありません。

  • 4) 機密性:最後に、おそらく最も現実的な理由として、メタモルフィック コードを見つけるのが非常に難しいのは、メタモルフィック プログラミングの能力を示し、サイバー犯罪で当局に逮捕されていないプログラマは、政府のセキュリティ機関に採用される可能性が高いためです。 、民間のセキュリティ会社、またはウイルス対策会社であり、プログラマーのその後の研究/知識は、競争力を維持するための秘密保持契約の対象となります。

なぜC/C++例だけ?

ポリ/メタモルフィック プログラミングのコード例のみを見つけることに言及C/C++し、ハードウェアに近い言語のみがポリ/メタモルフィックになる可能性があると推測しました。これは、ポリ/メタモルフィック コードの最も厳密な定義に当てはまります。解釈された言語は、ポリ/メタモーフィックな動作を持つことができますが、実行するために静的にコンパイルされたインタープリターに依存しているため、「実行時の署名」の大部分は変更できません。コンパイルされた低レベル言語だけが、高度に変更可能な「ランタイム シグネチャ」を持つための計算上の柔軟性を提供します。

これは、私が書いた「ポリモーフィック」な PHP コードです。PHP はインタープリター言語であり、コンパイル済み言語ではないため、真のポリモーフィズムは不可能です。

PHP コード:

<?php
// Programs functional Execution Section
system("echo Hello World!!\\n");
// mutable malicious payload goes here (if you were devious)

// Programs Polymorphic Engine Section
recombinate();
?>
<?php

function recombinate() {
  $file      = __FILE__;                    //assigns file path to $file using magic constant
  $contents  = file_get_contents($file);    //gets file contents as string
  $fileLines = explode("\n", $contents);    //splits into file lines as string array
  $varLine   = $fileLines[2];               //extracts third file line as string
  $charArr   = str_split($varLine);         //splits third line into char array
  $augStr    = augmentStr($charArr);        //recursively augments char array
  $newLine   = implode("",$augStr);         //rebuilds char array into string
  $fileLines[2] = $newLine;                 //inserts string back into array
  $newContents  = implode("\n",$fileLines); //rebuilds array into single string
  file_put_contents($file,$newContents);    //writes out augmented file
  sleep(1);                                 //let the CPU rest
  $pid = pcntl_fork();                      //forks process
  if($pid) {                                //if in parent:
    exit(0);                                //exit parent process
  }                                         //WARNING: creates 'Zombie' child process
  else {                                    //else in child process
    system("nohup php -f " .$file . " 2> /dev/null"); //executes augmented file
    exit(0);                                //exits exit child process
  }
}

function augmentStr($inArr) {
  if (mt_rand(0,6) < 5) {               //determines mutability
    /*$startIndex & $endIndex define mutable parts of file line as Xs
     * system("echo XXXXX ... XXXXX\\n");
     * 01234567890123            -7654321
     */
    $startIndex  = 13;
    $endIndex    = count($inArr)-7;
    $targetIndex = mt_rand($startIndex,$endIndex);     //choose mutable index
    $inArr[$targetIndex] = getSafeChar(mt_rand(0,62)); //mutate index
    $inArr = augmentStr($inArr);               //recurse
  }
  return $inArr;
}

function getSafeChar($inNum) {      //cannot use escaped characters
  $outChar;                 //must be a standard PHP char
       if ($inNum >=  0 && $inNum <= 9 ) { $outChar = chr($inNum + 48); }
  else if ($inNum >= 10 && $inNum <= 35) { $outChar = chr($inNum + 55); }
  else if ($inNum >= 36 && $inNum <= 61) { $outChar = chr($inNum + 61); }
  else if ($inNum == 62)                 { $outChar = " ";              }
  else                                   { $outChar = " ";              }
  return $outChar;
}

?>

警告:ゾンビ プロセスを作成します。コードを実行する前にゾンビ プロセスを強制終了する方法を知っています。

情報検索テクニック:

この記事には、ウィキペディアよりも具体的な情報が含まれています。ただし、この記事には実際のソース コードは含まれていません。サンプル ソース コードが見つかる可能性はほとんどありませんが、私のアドバイスが必要な場合は、独自の変成コードを作成するための十分な学術文書を見つけることができるかもしれません。これを開始することを検討してください(グーグル学者):

学術論文/論文を読むときは、ドキュメントの最後にあるソースを必ず確認してください。これらのソースにも貴重な情報が含まれている可能性があります。

知識の探求に幸運を!

于 2012-08-05T05:03:11.183 に答える
2

この回答は終了していません。この質問の回答が完了するまで、時間をかけて拡張し続けます

スクリプト化された例 - PHP

James Holderness が提供した PHP スクリプトの独自のコピーを作成したので、デモンストレーションを通じて、メタモルフィック スクリプトがどのように機能するかを自分で確認することができました。コードの完全な記述はここにあります。http://null.53bits.co.uk/index.php?page=php-goto-replicator

簡単に言えば、スクリプトを最初に実行した後、ランダムなファイル名の新しいファイルに自分自身をコピーし、コード行を新しいランダムな順序で作成し、スクリプト ファイルの新しいコピーと元のファイルを実行する新しいプロセスをフォークします。コピーが終了します。これで、スクリプトの新しいコピーが実行されます。これは元のファイルのコピーですが、ファイル名はランダムで、コード行の順序も異なります。これは永続的なプロセスです。並べ替えと複製を行い、新しいインスタンス (プロセス) を実行して前のインスタンスを強制終了します。

James Holderness の PHP の回答を少し拡張して、自己複製とモーフィングのコード例を作成することを目指しました。

これは私が思いついた未加工の PHP コードです。

<?php goto a01;
a01: $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';    goto a02;
a02: $randomString = __DIR__."/";                                                       goto a03;
a03: $i = 0;                                                                            goto a04;
a04: if ($i < 10)                                                                       goto a05; else goto a07;
a05:   $randomString .= $characters[rand(0, strlen($characters) - 1)];                  goto a06;
a06:   $i++;                                                                            goto a04;
a07: $randomString .= ".php";                                                           goto a08;
a08: $ARGS=Array("-f",$randomString);                                                   goto a09;
a09: $handle_out = fopen("$randomString", "w");  goto l01;
l01: $filename = __FILE__;                       goto l02;
l02: $contents = file_get_contents($filename);   goto l03;
l03: $lines = explode("\n",$contents);           goto l04;
l04: $collection = array();                      goto l05;
l05: $pattern = '%^[^:]+:.*goto [^;]+;$%';       goto l06;
l06: $i = 0;                                     goto l07;
l07: if ($i < count($lines)-1)                   goto l08; else goto l23;
l08:   $line = $lines[$i];                       goto l09;
l09:   $line = trim($line);                      goto l10;
l10:   if (substr($line,0,2) != '//')            goto l11; else goto l22;
l11:     if (preg_match($pattern, $line) === 1)  goto l12; else goto l13;
l12:       $collection[] = $line;                goto l22;
l13:       shuffle($collection);                 goto l14;
l14:       $j = 0;                               goto l15;
l15:       if ($j < count($collection))          goto l16; else goto l19;
l16:         echo $collection[$j]."\n";          goto l17;
l17:         fwrite($handle_out, $collection[$j]."\n");    goto l18;
l18:         $j++;                               goto l15;
l19:       $collection = array();                goto l20;
l20:       fwrite($handle_out, $line."\n");      goto l21;
l21:       echo $line."\n";                      goto l22;
l22:   $i++;                                     goto l07;
l23: fclose($handle_out);                        goto f01;
f01: $pid = pcntl_fork();                        goto f02;
f02: if ($pid == -1)                             goto f03; else goto f04;
f03:   die("Could not fork a new child\n");      goto f03;
f04: if ($pid)                                   goto f05; else goto f06;
f05:   exit(0);                                  goto f05;
f06: $sid = posix_setsid();                      goto f07;
f07: if ($sid < 0)                               goto f08; else goto f09;
f08:   die("Child posix_setsid error\n");        goto f08;
f09: sleep(10);                                  goto f10;
f10: pcntl_exec(PHP_BINARY, $ARGS);
l24: exit(0);                                    goto l24;
?>
于 2013-09-29T14:55:58.077 に答える