プロが教えるわが家の防犯対策術!

ホームページや、普通のフリーソフトのソースは簡単に難読化や暗号化、コンパイルができて、簡単に見ることができなくなりますが、perlのソースを暗号化?難読化させたいのですが、何か、良い方法は無いでしょうか?
ご存知の方、教えてください。
宜しくお願い致します。

A 回答 (10件)

私はもうJavaScriptかじり始めてから5年は経つし、こうゆうこともかなり前からやってるので、どれくらいでできるようになるかと聞かれてもアドバイスはちょっと難しいです。



ただ、JavaScriptの勉強やデバッグをするのに、変数とかの値をalertやdocument.writeで表示するってのは必須ですよね。これはその延長なので、今回のコード復号化程度のものなら何ヶ月もはかからないんじゃないかと思います。(復号したコードが理解できるかどうかは別ですよ。)
    • good
    • 1
この回答へのお礼

回答いただきありがとうございました。
私が思っていたよりも、相当早く習得してとくことができるレベルの難読化だとは全く思っていませんでしたので、とても驚いています。
たくさんの、発見に満ちた回答をいただきありがとうございました!!

お礼日時:2006/01/16 21:22

私は専門家ではないです(No.4では「どんな人」の選択ミスりました)が、あちこちのサイトで調べたり自分でテストしたりして、ある程度の知識はあると思います。


でもこれは暗号を解いた訳じゃなく、そのコードが処理される様子を追ってるだけなので、コツさえ知ってれば簡単にできます。

例えばオークションテンプレートのスクリプトにはevalがあるので、それが実行しようとしている内容を表示してみます。
ただ、evalを単にdocument.writeに置き換えると、内容に < や > が入っていた時にそれがタグとして認識されて表示されないので、それらを&lt;などに置換して表示する関数(escape_print)を作って、それと置き換えます。
function escape_print(text) {
text = text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/\n/g, "<br>");
document.write(text);
}

そのHTMLを開いたところ、下のように表示されました。
Chart="";et="";et2="";codID=80;for(i=35;i<127;i++){Chart+=String.fromCharCode(i);}Chart+=" !ABCDEFG";for(i=0;i<g.length;i++){ts=(Chart.indexOf(g.charAt(i))-codID%100+100)%100;codID++;if(ts<10){et+="0"+ts;}else{et+=ts;}}for(i=0;i<et.length/6;i++){et2+=String.fromCharCode(parseFloat(et.substr(i*6,6)));}if(location.href.match(et2.substr(et2.length-13,13))){document.write(et2.substr(0,et2.length-13));et2=null;et=null;}else{et2=null;et=null;document.write("M");}

これが実行されるはずのコードだったので、これをさっきのコードの下にコピペします。
この中にはdocument.writeが2つあり、そのうち1つ目の方は重要そうなので、document.writeをescape_printに置き換えて表示してみます。
ただ、その部分はif文(URLを見て盗用をチェックしているようです)の中なので、条件に || 1 などと付け加えて強制的に実行させます。
それで表示されたのがNo.8のコードな訳です。

このコードはフォームに入力された文章をコピーライト付きでプレビューさせるもののようですね:-)
    • good
    • 0
この回答へのお礼

回答いただきありがとうございます。
きっと、分かりやすく説明していただいているのでしょうが、javascriptのスキルが、コピペ+テキトーなので、ちょっと、まだまだ、理解できませんでした。
まだ、javaやperlなど他のプログラムを、ほんの少しだけ触ったことがある程度です。

ところで、こういったことを思いつくようになるには、どの程度、どのくらいの期間javascriptを勉強されたのでしょうか?参考までに、教えていただけると幸いです。

お礼日時:2006/01/16 19:07

>例えば、例に挙げた、HTML暗号化・難読化についても、javascriptに精通している人や余程の時間と暇が無い限りあえて解読しようとは思わないと思います。



プレーンテキストで処理されるものをいくら暗号化しても処理の際に復号される訳で、その復号手順を追えば元のソースなんて10分はかからず取り出せます。ですから、

>それだけの力があれば、自分でコードを作成したほうが早い?

そんなことは全然ないですよ。

>ですので、ネットを利用している人の大半にとっては、殆ど完璧な暗号化技術となるのではないでしょうか?

確かにそうかもしれませんが、コードを覗き見しようとする人にとって復号できないようになってなければ、何の意味もないと思います。

>ちなみみ、Hasty様の場合、数分とのことですが、実際に解読化をした場合、実際何分で解読できますか?

No.4でも書いたんですが、オークションテンプレートで暗号化されているコードは解析済みです。で、解析したコードの中にそれを暗号化したツールのURLが入ってたので参考URLに書いといたんですが・・・
ちなみにその解読も10分はかかってません。
暗号化されていたコードは↓です。
<SCRIPT language="JavaScript"><!--
//copyrightの部分を作成
name = "pia-style";
copyright = "<font size=-1>このフォームは「<b><a href=" + location.href + " target=new>" + name + "</a></b>」で作成されています</font>";
line = "\r\n";
header = '<BR><CENTER><TABLE width=600 cellpadding=0 cellspacing=0><TBODY><TR><TD bgcolor=#a06fd8 width=116>  <B><FONT color=#ffffff size=-1>商品説明 </FONT></B></TD><TD width=478><IMG src=' + 'http://' + location.hostname + '/tr-purple.gif></TD></TR><TR><TD colspan=2 bgcolor=#a06fd8><TABLE width=100%><TBODY><TR><TD bgcolor=#f1f1fd><TABLE border=0><TBODY><TR><TD><FONT color=#f1f1fd size=1>....</FONT></TD><TD width=100%></TD></TR><TR><TD></TD><TD>';
//TITLEが入る
footer1 = '';
//商品説明が入る
footer2 = '<BR><BR></TD></TR><TR><TD></TD><TD></TD></TR><TR><TD colspan=2 bgcolor=#a06fd8></TD></TR><TR><TD colspan=2 align=center>';
//コピーライトが入る
footer3 = '</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></CENTER><BR><BR><BR><BR>';
function changerbr() {
text = form.intext.value;
if(text.match(/\r\n/)){
hantei = "\r\n"; //IEなど
} else {
hantei = "\n"; //Firefoxなど
}
text = text.split(hantei);
len = text.length-1;
for(i=0;i<len;i++) {
switch(i) {
case 0:
text[i] = header + text[i] + footer1 + "<BR>";
break;
case 1:
text[i] = text[i] + "<BR>";
break;
default:
text[i] = text[i] + "<BR>";
break;
}
}
text = text.join("");
document.form.outtext.value = line + text + footer2 + copyright + footer3 + line + line;
document.getElementById("out").innerHTML = text + footer2 + copyright + footer3;
}

function changer() {
text = form.intext.value;
if(text.match(/\r\n/)){
hantei = "\r\n"; //IEなど
} else {
hantei = "\n"; //Firefoxなど
}
text = text.split(hantei);
len = text.length-1;
for(i=0;i<len;i++) {
switch(i) {
case 0:
text[i] = header + text[i] + footer1;
break;
case 1:
text[i] = text[i];
break;
default:
text[i] = text[i];
break;
}
}
text = text.join("");
document.form.outtext.value = line + text + footer2 + copyright + footer3 + line + line;
document.getElementById("out").innerHTML = text + footer2 + copyright + footer3;
}

//--></SCRIPT>
<!--CODHTML-Ver.0.5.6 http://www.geocities.jp/hiro00312/source/program/ -->
    • good
    • 0
この回答へのお礼

回答いただきありがとうございます!!
正直、ここまで鮮やかに複合化できるということに、驚いております。
難読化に意味が無いとは聞いたことがありましたが、私の知る限りかなり難しそうなものでも、ここまで鮮やに複合化してしまえるとは・・・
また、こんなことは、誰にでも、できるものなのでしょうか?職業でプログラマーの方でしょうか?ちょっと、本を読んで勉強した程度の人に複合化できるとは思えないのですが・・・
私には、かなり、ちんぷんかんぷんな文章だったのですが・・・
複合化に関する、意識をかえる必要があると痛感いたしました。

お礼日時:2006/01/16 17:08

蛇足と思いつつ。


google で perl obfuscator を検索すると他にもいくつか見つかりますね。難読化ツール。
処理内容はどれも似たようなもの。
    • good
    • 0
この回答へのお礼

回答いただきありがとうございます。

私にとっては、蛇足ではありません。貴重な情報源です!!
英語がちんぷんかんぷんですので、ゆっくり、見ることにいたします。
また、もし、こういった類のソフトで、日本語のものや、フリーウェアをご存知でしたら(なるべく、直リンクで)教えてください。ダウンロードの画面にたどりつけないことが多々汗(^_^;)
宜しくお願い致します。

お礼日時:2006/01/15 16:24

No.5 の補足拝見しました。



No.3 の補足で暗証番号云々の話が出てきたので,
「そんなの処理手順がばれても安全なアルゴリズムを使うのが基本。crypt 関数使えばいいじゃん。」
と思い,補足要求しました。

> 1.フリーソフトや有償のソフトを配布、納品したものを改竄されたくない。自分なりにかなり考えた箇所など、個別的に守りたい場合。
> 2.perlやプログラムの初心者。上級者については、どんな方法を使っても結局は無理だと思います。

ということなので,結局皆さんの回答と同じような方法になってしまいますが,
こんなの見つけました。

"iWeb Toolkit: Perl Source Code Obfuscator"
http://www.virtualpromote.com/tools/perl-encrypt/
↑ソースの整形を崩すのと,コメントの削除,変数名の付け替えをやってくれます。

↓こんな製品も出てるようです。詳細不明。
"Stunnix Perl-obfus" の "Sample output"
http://www.stunnix.com/prod/po/sample.shtml


ソースを読む立場からすると,コメントはもちろんですが,関数名や変数名が処理内容を推測する重要な手がかりになりますので,これが意味のないものだと結構苦労します。
他に,文字列リテラルも手がかりになりますね。
逆に,マジックナンバが書いてあるとムッとします。

# ソースの'再'整形はツールですぐ出来ちゃいそう。
# あとは意味のないコードをちりばめてソースの行数を増やしたうえ,読む人を撹乱する(笑)。
    • good
    • 0
この回答へのお礼

回答いただきありがとうございます。
そこまで、すごいコードを書くわけではないのですが、、、それでも、ちょと・・・
という感じです。
>ソースの再形成はあまりに簡単そうなのでちょっとあれですね・・・
>あとは意味のないコードをちりばめてソースの行数を増やしたうえ,読む人を撹乱する
確かに、、、(笑)
Stunnix Perl-obfusが、私が求めているものに近いかもしれません。
perl入門者の私が見る限り、読解できませんでした。

お礼日時:2006/01/15 16:21

どうも目的がよくつかめないです。



(1)何のために暗号化・難読化する必要があるのか。
(2)ソースを読ませたくない相手は誰なのか。

といったことを補足していただければ,解決方法が得られるかもしれません。

この回答への補足

1.フリーソフトや有償のソフトを配布、納品したものを改竄されたくない。自分なりにかなり考えた箇所など、個別的に守りたい場合。
2.perlやプログラムの初心者。上級者については、どんな方法を使っても結局は無理だと思います。

例えば、例に挙げた、HTML暗号化・難読化についても、javascriptに精通している人や余程の時間と暇が無い限りあえて解読しようとは思わないと思います。
実際、私が解読しようと試みましたが、かなり面倒で挫折しました。そのため、実際に解読できる人は殆ど居ないと思います。
また、解読する力があれば、自分でもっと良いものを作れるのではないかと・・・

補足日時:2006/01/15 12:09
    • good
    • 0

No.2のものですが・・・


>秀丸エディタの行番号で68行目の、長いjavascriptの部分です。
何の事はない、ただのJavaScriptコードです。
コピペしてちょっといじってやれば、ものの数分で解読できます。
解読したコード中のコメントに、暗号化ツールの提供元が載っていたので載せておきます。(参考URLの「HTML暗号化ツール-CODHTML-」)
ま、この通り簡単に解読されてしまうので、気休め程度にしかなりませんが。

参考URL:http://www.geocities.jp/hiro00312/source/program/
    • good
    • 0
この回答へのお礼

再三の回答いただきありがとうございます。

例えば、例に挙げた、HTML暗号化・難読化についても、javascriptに精通している人や余程の時間と暇が無い限りあえて解読しようとは思わないと思います。
それだけの力があれば、自分でコードを作成したほうが早い?
また、少なくとも、私のスキルでは、1時間あっても無理でした。ですので、ネットを利用している人の大半にとっては、殆ど完璧な暗号化技術となるのではないでしょうか?
ちなみみ、Hasty様の場合、数分とのことですが、実際に解読化をした場合、実際何分で解読できますか?
もし、お暇がありましたら、チャレンジしていただければと思います。
数分で解けてしまうとは、少なくとも、1時以上試行錯誤して無理だった、私には、にわかには信じがたいのですが・・・
また、実際に解読できてしまうならば、javascript初心者など、この技術を過信している人への警鐘になればと思います。

お礼日時:2006/01/15 12:27

Perlをコンパイルすることができたはず・・・


ただし、サーバもいじらないといけなかったと思います。

Perlで難読化させたいのでしたら、「改行を消す」と言うのが結構オススメ。
ソースを読む気なくしますよ。

あとは、URLエンコードしてしまうとか。

オークションテンプレート> http://pia-style.com/01-now-desing.html

この程度でいいのでしたら、単にutf8で保存すればいいだけです。
初心者程度なら読めないでしょう。
コンパイルしても逆コンパイルでソース(と似たもの)ができるわけですし、程度の問題でしょうね。
どの程度まで必要ですか?

http://www.google.com/search?hl=ja&lr=lang_ja&ie …

この回答への補足

回答いただきありがとうございます。
#2と同様の回答になりますが、
http://pia-style.com/01-now-desing.html
についてですが、Firefoxで保存して、それを、秀丸エディタでみているのですが、見ることができません。
秀丸エディタの行番号で68行目の、長いjavascriptの部分です。
<script>g="stMvwgyzZ|}l !fBCpEFw$%F')1*+)-/902535F6759;><>??@~BCfEF-HIGKM_NOMQRBTUUWYgZ\\a]_k`brcd#fgBijClm+op:rs=uvAxyE{|H~ AC*DF.#%:&(6)+0,.1/1524D6M5; 6=E;?WbCESFxJGHSJLVMNLPR[SUVVWxYZ4\\]~_`Cbdpeglhigkl6np qsCtv'wyAz|}}~=!AYCD+F##%'2(*6+-B.0>13846979=:<L=>_@A CDeFGjI以下続く

コンパイルではなく、(簡単にコンパイルできない)もっとと、複雑に複合化できないものでしょうか?
例えば、低レベルな、暗証番号の部分だけとか、ひとつのサブルーチンだけを複合化できればと思います。

補足日時:2006/01/14 20:33
    • good
    • 0

興味があって覗いてみたんですが・・・


回答1の補足のリンク先の情報はどれも小手先のもので、全て5分もかからずに解読できてしまいますよ。
オークションテンプレートとやらもソースがutf8なだけで、IEで見ればメモ帳で開くため化けてしまうでしょうが、開くエディタを替えたり、Firefoxなどを使えば普通に見れます。
結局のところ、プレーンテキストで処理されるものを解読させないようにするのは無理です。
    • good
    • 0
この回答へのお礼

回答いただきありがとうございます。
http://pia-style.com/01-now-desing.html
についてですが、Firefoxで保存して、それを、秀丸エディタでみているのですが、見ることができません。

秀丸エディタの行番号で68行目の、長いjavascriptの部分です。
<script>g="stMvwgyzZ|}l !fBCpEFw$%F')1*+)-/902535F6759;><>??@~BCfEF-HIGKM_NOMQRBTUUWYgZ\\a]_k`brcd#fgBijClm+op:rs=uvAxyE{|H~ AC*DF.#%:&(6)+0,.1/1524D6M5; 6=E;?WbCESFxJGHSJLVMNLPR[SUVVWxYZ4\\]~_`Cbdpeglhigkl6np qsCtv'wyAz|}}~=!AYCD+F##%'2(*6+-B.0>13846979=:<L=>_@A CDeFGjI以下続く

お礼日時:2006/01/14 20:30

>ホームページや・・・・簡単に難読化や暗号化、コンパイルができて、簡単に見ることができなくなりますが


えっ?
HTMLにいつからそんな機能つきましたか?

この回答への補足

回答いただきありがとうございます。
オークションテンプレート> http://pia-style.com/01-now-desing.html
のソースは難読化してあります。
もちろん、解除することはできるそうですが、これをソースに変換するのはかなり面倒だと思います。
難読化してあるところは、stMvwgyzZで検索してください。その行が全てです。
もし、簡単に解除できたら教えてください。

また、ご興味がありましたら、
難読化 html > http://www.google.co.jp/search?sourceid=navclien …
をご覧下さい。

補足日時:2006/01/14 01:41
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!