2011/12/08

PHPerが一瞬でC言語をマスターする方法

CUI環境でPHPを選ぶ時というのはどういう時でしょうか。
  • PHPしかできないし俺。(あるある)
  • bashって微妙だよね・・・(どこがだよ!)
  • PHP CLIがインストールされてるから気軽に使えるじゃん(ごもっとも)
みたいな理由だと思うんですが、強烈な事してる人を見つけてしまったのでちょっとネタにさせてもらおう・・・。




そのファイルはa.outというファイルでした。
a.outという名前のファイルを作るために特別なことはいりません。
ソースを書いてみましょう。ファイル名はhello.cとしておきます。

#include <stdio.h>
void main(){
    printf("Hello world!");
}

このソースを
gcc hello.c

こうしてやると、a.outというファイルが生成されます。a.outは、gccでコンパイルした時のデフォルトのファイル名という事です。

と言うことは、元のa.outを書いた人はC言語がバリバリ書ける人という事でしょう。しかも、暗号の復号化処理という結構ややこしいことをなさっている・・・。暗号化ロジックの仕様書はものすごく退屈で、こんな実装できる訳ないよ!と本気で思っている私ですからね。

ところが、この暗号を解読する復号化キーの不具合があり(要は向こうの人がどの復号化キーを設定したか忘れちゃった)、すったもんだの結果なぜか復号化プログラムのソースが私の手元に・・・。この事実を、私は「好きな文字列を復号化キーに設定して暗号の強度を上げてください」という意図で受け取ったのですが。

復号化キーを設定すべく、ソースコードを開いた私は驚愕しました。

fprintf(fp, "#!/usr/bin/php -q\n<?php ここからPHPのソースが続く・・・");

最初、なんでこんなところにPHPのシェバングがあるのか意味がわからなかったんですが、単にPHPファイルに渡す引数だけをCでごにょごにょやってファイルに書き出し。実行権限付けてsystem関数で実行するというすげぇ高度なコーディングスタイルを行なっていたんですね・・・。なるほど、これならPHPでできることならC言語に移植(だいぶ違うけど)できるな・・・。
しかし、突っ込みどころは多くて、シェバングは/usr/bin/php 一択という豪快で男気感じる一本気なところ(which phpとか女々しい)や、fchmodでしれっと実行権限をつけるあたりは、トライ&エラーの跡が見られます。

こういう手法を用いれば、メリットもあります。たとえば
  • プロプラの時、ソースコードを隠蔽できる(Cのソースが単純なのですぐ突破されそうですが)
  • 何をしているかあまり見られたくない時(何かのキーを内包する場合)
  • 誤ってソースを改変される事を防ぐ
くらいでしょうか。
C言語のくせに、PHPのライブラリを要求したりする時点で怪しまれますけれどね。

PHPならもう完璧。でもC言語はからっきし。
世の中にそんな偏ったスキルセットを持つ人はそういないと思いますが、もしそんな人がいれば、PHPでできることならC言語でもできる最強のソースを公開します。

#include 

void main(void){
    system("php -r \"echo \\\"hello world\\\";\"");
}

こうすれば、PHP CLIでできる事はだいたい出来るのではないでしょうか。クォートのエスケープに少々気を取られがちになりますが、PHPのソースコードをコンパイルする事ができます(してねーし)。

こういう回りくどい事をわざとやるということは、意外とちゃんとわかってないとできないものもあるので、技術を磨くという意味ではやってみてもいいんじゃないでしょうか。正月、テレビに飽きたらどうでしょう?


see also:
php-mcryptがyumでインストールできないときに幸せになる方法
そろそろ真面目に自動テストしよう
PHPのmysql系関数のまとめ
さくらインターネットの .mailfilter にハマる


0 件のコメント:

コメントを投稿