Acanthopanaxによる
2005年03月21日 18時55分の掲載
書いた証部門より
書いた証部門より
tamo 曰く、 "ZDNet Australia の記事によると、gpl-violations.org は GPL 違反を見付けるために、バイナリ中のメッセージを検索したりしているそうです。たとえばその創立者 Harald Welte が書いた Netfilter は'Rusty needs more caffeine.' というメッセージを出すので、無断で使用しているのがすぐ分かるそうです。皆さんは自分の書いたコードに、あとから見分けられるような特徴を付けておられますか? また、そうするための良い方法などがあればお聞かせください。"
この議論は賞味期限が過ぎたので、保存されている。
新たにコメントを書くことはできない。
特になにも・・・ (スコア:3, おもしろおかしい)
これだけだと中身がないので、オフトピ気味ですが・・・。
中学校のプログラミングの授業で、みんなにプログラムをコピーされるのにぶち切れてプロテクトもどきを作ったことならあります。
コピー方法が「F-BASIC386エディタで自分のソースを読み込んで別名保存する。OSを使ってのコピーはなぜかみんな出来ない」というものでした。
なので、適当なテキストファイルを読みに行って、自分のFDにはそのテキストファイルを予め用意しておくようにする。それが存在しなければ警告を出すコードを仕込みました。
数日後、学級会が開催されました(笑)
ソースくらい読もうよ、と思ったものです。
Re:特になにも・・・ (スコア:2, 興味深い)
「wadatchさんがいじわるしてコピーさせてくれません.
そういうのはいけないとおもいます.」
とか?
#オフトピ故にAC
親コメント
Re:特になにも・・・ (スコア:5, おもしろおかしい)
悪男「良子、なんでwadatchをかばうんだよ~」
良子「え?そんなんじゃ・・・」
全員「あ~~」
悪男「wadatchと良子はアッチッチ~」
全員「アッチッチ~」
泣きながら教室を出て行く良子。
廊下に正座させられ給食抜きになる悪男。
という一連の流れが頭に浮かびました。
親コメント
Re:特になにも・・・ (スコア:2, 興味深い)
さらにオフトピですが、TAとして大学生の物理のレポート採点していたとき、
元レポートから手書きコピーしてゆく間に、数式の"・"(掛け算の意味)
が"-"(マイナス)に段々劣化コピーされてゆく様がなかなか笑えました。
曖昧に書いてた奴もすぱっと間違いにしてやりました。
次元を考えれば一発でわかる間違いなのに、その努力すら惜しむなんて。
親コメント
Re:特になにも・・・ (スコア:3, 興味深い)
最初は盗用なんて見抜けないのですが、慣れるにつれて変数名や 改行位置を変えた程度の盗用であれば、簡単に見抜けるようになりました。
もっとも、自分も盗用こそしなかったものの、「いざとなれば デキる奴のをコピーして、変数名や改行位置を変えれば問題ない」と 思ってたので、「考えが甘すぎだったなぁ」と添削しながら思いましたわ。
親コメント
Re:特になにも・・・ (スコア:2, 興味深い)
納得いかない部分もその場で質問する。
わかりにくいところはみんな似てることが多いですし。
LAN内LAN稼働中
親コメント
Re:特になにも・・・ (スコア:2, 興味深い)
その時期だと学習指導要領は多分平成元年版ですね。 プログラミングの授業ってありましたっけ?
# まあ私学だと何でもありなんだけど。
親コメント
Re:特になにも・・・ (スコア:3, 興味深い)
本人達がソース覗くかテストランして見つけると思っていて、
先生が見るとまでは想定していなかったんです。
若かったです。はい。
私もそうなることを恐れて黙ってたのですが、
正常に動いたのは私のだけだったのでバレました。
まぁ、学級会の内容も著作権てのがあるから気をつけましょう、
という位で、吊し上げがあったわけでもなく、幸い後に遺恨は
残りませんでした。「一本取られたわ~」くらいで。
親コメント
Re:特になにも・・・ (スコア:2, すばらしい洞察)
> という位で、
それ以前に、宿題は自分でやりましょう、って結論になるのが普通ではないだろうか?
親コメント
補足します (スコア:2, 興味深い)
開発環境はF-BASIC386 on FM-TOWNSです。
技術家庭科の時間ですね。
F-BASIC386をお持ちだった方はおわかりになると思いますが、
BASICエディタ上では、BASICソースコードしか開けない仕様でした。
テキストファイルは開けない、と。
で、授業では、BASICしか習わなかったので、TOWNS-MENUを使った
一般的なファイルコピーの方法を習わなかったのです(今思えばそれはそれでどうよ、なのですが)。
で、私のBASICプログラムをAさんがコピーしようとすると、
(1)BASICエディタで私のプログラムを読み込む(loadコマンドでもいい)。
(2)提出用FDをAさんのものに差し替える。
(2)読み込んだプログラムをAさんのFDに保存する(saveコマンドでもいい)。
というものでした。
みんな、この方法しか知らないので、テキストファイルはコピーできない。
そこに目をつけて、前述のプロテクトもどきを入れました。
まさか、動作確認くらいするだろう、と思って。
というお話しです。
親コメント
あるけど教えない (スコア:3, すばらしい洞察)
Re:あるけど教えない (スコア:2, すばらしい洞察)
ホントはそんなもの無いとしても、悪さしようとする人
への抑止効果になると思います。
「監視カメラ作動中」とおなじかな。
親コメント
Re:あるけど教えない (スコア:3, 参考になる)
という事で、ソースコードも目立つところにあからさまな印を付けておき、本当のサインは全体の中にこっそり混ぜておくのです。
#私の場合コーディング規約が特に限定されてないときは、独自のスタイルで書くのでだいたい分かるんですけどね。並び方にしてもネーミングにしても。
親コメント
教えないならストレートに想像してみる (スコア:2, おもしろおかしい)
唐突に特権モードに移って「ええい!頭が高い!」とか言いながら他のプロセスを手当たり次第サスペンドしちゃうとか。
いや殺しはしないですよ。峰打ちぐらいで止めといて、一通りサスペンドして満足したら、元に戻しますよ。
# そんな手の込んだもん入れたら最初にバレてそこだけ削られるわな…
「避けるまでもない」
親コメント
Re:あるけど教えない (スコア:2, すばらしい洞察)
#出口で「これこれ君ここからは入れないよ」っていうのは道交法違反の予防にちゃんとなってますから…。
-- ちどりの「ち」きっての「き」…
親コメント
証を入れるのは構わないのですが… (スコア:3, おもしろおかしい)
参考 [archive.org]
Re:証を入れるのは構わないのですが… (スコア:2, 参考になる)
http://www.ca.sakura.ne.jp/~sakura/babobi/msx/yami/kakushi.html
http://ww5.tiki.ne.jp/~metoron/2ch_erika.txt
--
Ath'r'onならfloatあたりに自信が持てます
親コメント
タレコミと類似の手法? (スコア:3, 興味深い)
"Pascal"という文字列が機械語では特定の演算に対応していて、文字列を実行し、レジスタの内容を確認すると、その文字列が書き換えられたかどうかが判定できる、というものがありました。
x86のシェア(特に商用ソフト)を考えると、x86+特定のコンパイラで文字列にもなる機械語列を用意する、というのはアリかもしれません。
Re:タレコミと類似の手法? (スコア:3, 興味深い)
厳密には文字列と違いますが、IOCCC [ioccc.org] でソース中にマシン語を直接埋め込む コード [ioccc.org] が 受賞した [ioccc.org] ことがあります。
それから、奈良女の新出先生の UNIX like tools の中にもそういうコードがあったような記憶があります (com2txt とか sos だったかも知れない)。 あれは確か static char [] な文字列だったと思います。 LSI C-86 限定でインラインアセンブラが必要なら、素直に asm を使えばいいのですが、DOS コンパイラ汎用で人間最適化するためのテクニックではなかったかと勝手に想像しています。
で、何が言いたいかというと、上記の受賞作品の hint にある通り、
なのではないかと。 ソース配布の長所の一つに「アーキテクチャに依存しない (ようにすることもできる)」点もあるわけですから。
タレコミのように GPL を前提にするのではなく、 商用ソフトのバイナリを売ることが目的なのであれば 「文字列として、かつマシン語としても有効」である必要はないはずです。 それこそ魔法のデータ列をバイナリ中に埋め込んで 「このソフトに同梱されている fuga.dll 中には、当社が仕込んでおいた hoge という文字列が散見される。 従って、このソフトは盗品である」と主張すればすむわけですから。
親コメント
俗人化 (スコア:2, 興味深い)
俗人化しないよう心がけています。
自分では自分が書いたという証を残さないようにしています。
だけどきっとそれでもどこかに癖が残ってるはず。
だから自分のコードの証は、私の書いたコードを見て
困ってる人に聞いてください。(;´д`)ゞ
Re:俗人化 (スコア:2)
元(見本)のコーディング・ルールが、よほど胸糞悪くなる ようなモノでない限り、擬態化するようになりました。
でも、コメント行の質で、ある程度のスキルと作成者が特定できたりするなぁ。
親コメント
えっと (スコア:2, すばらしい洞察)
属人化でしょうか?
# 民俗プログラミングなんてあるのかも
親コメント
プログラムを趣味で楽しんでいます (スコア:1)
未然に防止するのがいちばん (スコア:1)
確実にわかるしかけが作り込まれております」とでも書いておけば、
内容も理解せずに盗用しようという輩は減るのではないですかね?
実際には何もしていなくても、です。
それはそれとして、盗用されたことを知るための手段をちょっと
検討してみましょうか。
(a) ファイル名、関数名、外部変数名などの一致
実世界で盗用が明るみに出るのはこのケースが多いようですね。
ただ、統一的に変更されていたら証明はかなり手間がかかりそう。
裁判の場など第三者に直接アピールするのはやはりメッセージだと
思います。ではどうするか、ですが...。
(b) 開発者名などのメッセージを入れておく
特定位置の文字値をコード中でループ制御やらフラグ値などに使い、
メッセージを変更したらちゃんと動かなくなるようにするわけです。
C言語ならそうそう簡単にはそのメッセージを無効にできないように
することも可能ですが、プログラムは汚くなりそう。
(c) 実行時にメッセージを作る
適当なテーブルに実行時にこっそりメッセージを組み立てておき、
特定の場面でメモリのスナップショットをとれば開発者が誰だか
わかるようにする。組み込み環境だと発見できないかな?
Re:未然に防止するのがいちばん (スコア:3, おもしろおかしい)
わざわざバグを入れるやつはまずいないんで、
同じ状況で同じバグが発現すればデッドコピーだと判断できると。
あと、非常に有名な例ではゼビウスのやつがあります。
ゲーム開始時に一定の操作をするとメッセージがでてくるという。
コピーして改変したやつだと「盗品だ」みたいなメッセージが出ました。
地図なんかでは、わざとミスを仕込んでおくそうですね。
話は変わりますが、昔、バイナリに仕掛けを入れたことがあります。
別に自分が作ったことを主張したいとか、コピーの検出とか、
わざとバグを仕込んだとかいうんじゃないんですが。
点取り占いってありますよね。
作った物自体は単純に起動したらメッセージを出して終わるだけの物です。
メッセージはバイナリにxor程度の簡単な暗号化を施して入れてあります。
んで、バイナリエディタなんかで覗いたときに、
「おまえは出歯亀だ ●一点」
というメッセージだけはそのまま見えるようにしておいたのでした。
引掛った人からメイルが来たりして面白かったな。
親コメント
Re:未然に防止するのがいちばん (スコア:2)
-------- tear straight across --------
親コメント
Re:未然に防止するのがいちばん (スコア:2, 参考になる)
訴訟になってから間違いを探した可能性もあるけど、それだと他社から地図が出るたびに自社の地図の著作権侵害をしていないかどうか、広大な地図3種(自社、他社、国土地理院)を照らし合わせる、という途方もない作業が生じるので、あまり現実的ではないかなぁ、と思います。
やっぱり著作権侵害に備えて、故意に間違いを含ませているんじゃないでしょうか。それだったら、その箇所だけ照らし合わせればよいわけですしね。
親コメント
実は (スコア:1, おもしろおかしい)
2035年にトラブルが発生するシステムは私のプログラムのコピーです。
Watermarking (スコア:1)
これは、プログラム構造そのものにメッセージをエンコードして埋めこんでおき、 多少手を加えられたとしても、デコードすればそのメッセージを読み出せるようにするものです。バイナリにコンパイルされたコードでは逆アセンブルする必要がありますが。
Google で検索すると こんな論文 [arizona.edu]が見つかりました。 多少の最適化、プログラム変換等を施してもメッセージは消えないよう考えられているそうです。
Re:Watermarking (スコア:3, 参考になる)
これによるとソースコードに直接うめこむ方法は static watermarking と呼ばれ、攻撃者によって改変されやすいのに対し、 実行時のデータ構造やプログラムの挙動の中にメッセージを埋めこむ dynamic watermarking という方法があるそうです。
親コメント
Re:Watermarking (スコア:5, 興味深い)
ソフトウェアウォーターマークなどの研究をやってます。
ソフトウェアに対するウォーターマーク [aist-nara.ac.jp]
Javaアプリケーションのためのウォーターマークツールなんかもあります [aist-nara.ac.jp](静的ウォーターマーク)。
また、ウォーターマークとは別にバースマークというのもやってます。
バースマークは、ウォーターマークと比較すると、
情報をあらかじめ埋め込むのではなくて、
いまあるソフトウェアからユニークな情報を収集することでソフトウェアを識別しようとするやつです。
バースマークのページ [aist-nara.ac.jp]
Javaに対するバースマークのツールも公開しています [aist-nara.ac.jp](静的バースマーク)。
以上ご興味があればどうぞ。
親コメント
Re:Watermarking (スコア:2, おもしろおかしい)
聖書とかに使われてるやつですね(違
親コメント
そのレベルに達していない (スコア:1, おもしろおかしい)
すぐわかるけど (スコア:1, おもしろおかしい)
「ぼくですけど。。。」
「またお前か。。。」
これはプログラムに対する有効なdigital watermarking (スコア:1, 興味深い)
プログラムと本質的に不可分にするのが難しそうです。gccでコンパイルするのとicc/icpcでコンパイルするのでは異ったバイナリになるし。やはり、
・staticで文字列を入れる (不可分ではないですね....)
→これは海賊版のファイルを実行せずとも判定可能であるという利点があります
・命令を用いて動的に文字列を作る(これも不可分ではないですね....
これは、昔のコピープロテクト屋と解析屋の戦いのような物になりそうですね。
ソースが見える分解析屋に有利ですね)。
・プログラムのロジックと文字列生成をからませる。
(多少不可分でなくはなりましたが、解析屋としては上記と差がないですね)。
C/C++の場合になりますが、適当にmacroとかtemplateでobfuscateしつつ暗号化したstatic文字列を入れるというのが妥当な解になりますかね。暗号学的なwatermarkやsteganographにはなりませんが。
# 昔のコピープロテクト外し件数が4桁行ってるのでAC
Re:これはプログラムに対する有効なdigital watermark (スコア:2, 興味深い)
それが、そうでもないんですよ。とくに私のようにコピープロテクト解析で
プログラミングスキルを上げた人間にとっては。私は動作原理が分っていない
既存プログラムの出力部分や条件部分を書換えて、そのプログラムの性能を(私の
解きたい問題に対して)向上させて利用することは良くあります。
> 必要な文字列と識別用の文字列を分離させるためには
> 全体を理解する必要が出てくるので、
上記でも分るように、(たとえばstatic変数の名称でgrepしてその周囲のコードだけを読むなどの方法で)分離できるんです。このあたり機械的にはできないですが
> 他人の書いた物を理解するくらいなら1から自分で書いた方が早い。
これも違いますね。他人のコードを理解するにしても1から書くにしても他人の
書いた物があれば設計が不要なのでずいぶん楽ですよ。
# IOCCCのコードがhintなしに理解できる人なのでAC
親コメント
Re:しないよ (スコア:3, 参考になる)
それはGPLで公開したからでしょう。
GPLはパクられることに歯止めをかけようとしているのではなく、その後も中身をいじれる自由をくれと言っているのです。
この自由がなくなってしまっては、我々にも恩恵が無い。
GPL違反を見つける活動は、ちゃんとそう言う自由が得られているか確かめる活動だと思う。
- Sparklegate, Yam.
親コメント
Re:しないよ (スコア:3, 興味深い)
フリーソフトを使用していることを周知しないであたかも自社で1から開発したプロプライエタリなソフトであるかのように使う会社が増えたからだと思いますけど?
そういうフリーソフトと言う「みんなのもの」を「自分の物」として独占して利益を上げるのは流石にまずいのではないかと(;´Д`)
--暮らしの中に修行あり。
blogはじめました。 [hatena.ne.jp]
親コメント
Re:しないよ (スコア:1)
大変ご立派なお考えだと思います。 そういう方はご自分のコードを「Public Domain [gnu.org]」にしていただければ幸いです。
# GPL 違反 [gpl-violations.org]がこのストーリーの元ネタなもので、申し訳ない。
親コメント
Re:しないよ (スコア:1)
そして、「人のプログラムを盗用して提出した」と停学になったりするわけです。
IN EARTH AND SKIE AND SEA STRANGE THYNGES THER BE.
親コメント
Re:羨望(オフトピック) (スコア:2, 参考になる)
『参考に』してもらうのは難しいかもしれませんが、 パクられるのは結構簡単だったりします。 あたしみたいな三流プログラマでも経験しましたし。
とある企業 A に派遣されてた頃の事。 A の関連企業 A' に外注されたコードを弄ってたのですね。 これの DB へのアクセスが異常に重たいのです。 ソースを見る権限は頂いてましたので、 ちょっと調べてみると――当時のあたしは RDB に関しては、 初めて実物に触れてひと月ちょっとのど素人状態でしたが―― DB エンジンの FAQ を見れば直ぐに見つかる、 「こういうアクセス方法は重たいからやっちゃだめだよ~」って方法だったのです。 だもので、 FAQ の説明読みながらちょろちょろっと検証用のコードを書いて試してみて、 「こっちの方法なら推定十倍のパフォーマンス出ますよ、 FAQ にも書いてありますし」って A の担当者さん経由で A' へ送りました。
しばらくして A' から修正版がやってきました。 劇的に速くなってます。 どう直したのかなとソースを覗くと…… 一目見てその部分だけ他のところと印象が違うのですね。 書いた人が違うのかな、 でもどっかで見たようなコーディングの癖だなぁ――と思ったら、 ご丁寧にも注釈だけ消された、 あたしの書いたコードそのまんまでした。 『客側』の『素人』が書いた検証用コードを売りつけるなんて……〔苦笑〕
それはそれとして。 コーディング規約がきっちり定められているとどうなるか判りませんが(そういう職場に行った事が無いもので)、 一緒にお仕事してその人の書いたコードをある程度の量見る事が出来ると、 複数人が編集したソースファイルでも、 ぱっと見でその部分を誰が書いたのか判別できるようになりますね。
# ここはもともと a さんが書いたんだろうけど b さんが部分修正してる。
# でも b さん遠慮して a さんの流儀に合わせようとしてるな~、とかって。
# なんでそこまで判るのか自分でもよく解りませんが。
『おちゃらけは最強の感情武装である』
親コメント
Re:羨望(オフトピック) (スコア:2, 興味深い)
ガッコのセンセをしている方々、悪い例の例示は慎重に。
親コメント