ページ内ジャンプ:

アレゲなニュースと雑談サイト

Acanthopanaxによる 2005年03月21日 18時55分の掲載
書いた証部門より

tamo 曰く、 "ZDNet Australia の記事によると、gpl-violations.org は GPL 違反を見付けるために、バイナリ中のメッセージを検索したりしているそうです。たとえばその創立者 Harald Welte が書いた Netfilter は'Rusty needs more caffeine.' というメッセージを出すので、無断で使用しているのがすぐ分かるそうです。皆さんは自分の書いたコードに、あとから見分けられるような特徴を付けておられますか? また、そうするための良い方法などがあればお聞かせください。"

この議論は賞味期限が過ぎたので、保存されている。 新たにコメントを書くことはできない。
表示オプション しきい値:
  • 特になにも・・・ (スコア:3, おもしろおかしい)

    wadatch (6649) : 2005年03月21日 19時01分 (#711772) 日記
    縦読みしたら自分の名前とか出たら・・・と妄想してしまいました。

    これだけだと中身がないので、オフトピ気味ですが・・・。
    中学校のプログラミングの授業で、みんなにプログラムをコピーされるのにぶち切れてプロテクトもどきを作ったことならあります。
    コピー方法が「F-BASIC386エディタで自分のソースを読み込んで別名保存する。OSを使ってのコピーはなぜかみんな出来ない」というものでした。
    なので、適当なテキストファイルを読みに行って、自分のFDにはそのテキストファイルを予め用意しておくようにする。それが存在しなければ警告を出すコードを仕込みました。
    数日後、学級会が開催されました(笑)
    ソースくらい読もうよ、と思ったものです。
    • Anonymous Coward : 2005年03月21日 19時22分 (#711779)
      学級会が開かれた理由は?
      「wadatchさんがいじわるしてコピーさせてくれません.
      そういうのはいけないとおもいます.」
      とか?

      #オフトピ故にAC
      • Re:特になにも・・・ (スコア:5, おもしろおかしい)

        Anonymous Coward : 2005年03月21日 19時34分 (#711783)
        良子「wadatch君は悪くないとおもいます。みんなが課題をちゃんとしないから・・・」
        悪男「良子、なんでwadatchをかばうんだよ~」
        良子「え?そんなんじゃ・・・」
        全員「あ~~」
        悪男「wadatchと良子はアッチッチ~」
        全員「アッチッチ~」

        泣きながら教室を出て行く良子。
        廊下に正座させられ給食抜きになる悪男。

        という一連の流れが頭に浮かびました。
    • Anonymous Coward : 2005年03月21日 20時47分 (#711805)
      ソース読まないどころか、実行さえしていないって事ですよね。

      さらにオフトピですが、TAとして大学生の物理のレポート採点していたとき、
      元レポートから手書きコピーしてゆく間に、数式の"・"(掛け算の意味)
      が"-"(マイナス)に段々劣化コピーされてゆく様がなかなか笑えました。
      曖昧に書いてた奴もすぱっと間違いにしてやりました。
      次元を考えれば一発でわかる間違いなのに、その努力すら惜しむなんて。
    • oku (4610) : 2005年03月21日 19時26分 (#711781) 日記
      F-BASIC386 って時点で FM-TOWNS だということが想像されます (確証とまではいかない) から... まあ十五年くらい前かなあ、と。

      その時期だと学習指導要領は多分平成元年版ですね。 プログラミングの授業ってありましたっけ?

      # まあ私学だと何でもありなんだけど。

    • 補足します (スコア:2, 興味深い)

      wadatch (6649) : 2005年03月21日 22時51分 (#711858) 日記
      わかりにくかったですね。すみません。

      開発環境は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個のコメント が現在のしきい値以下です。
  • あるけど教えない (スコア:3, すばらしい洞察)

    Anonymous Coward : 2005年03月21日 20時12分 (#711794)
    水戸黄門は,越後のちりめん問屋のご隠居一行だと思っているからこそ油断して情報の隠蔽に緩みが出るわけでしょ.初めから印籠を出して水戸黄門であるぞ~とかいって歩いていたら,悪代官は絶対尻尾を出さないと思いますよ.印籠は最後の切り札.秘密のコードも同じようなものだと思いますが.
    • Re:あるけど教えない (スコア:2, すばらしい洞察)

      Anonymous Coward : 2005年03月21日 20時32分 (#711801)
      いや、「ある、ある」と言っておけば、
      ホントはそんなもの無いとしても、悪さしようとする人
      への抑止効果になると思います。
      「監視カメラ作動中」とおなじかな。
      • Sakura Avalon (12557) : 2005年03月21日 23時25分 (#711874)
        「監視カメラ作動中」とあって、いちばん目立っているカメラに注意を向けておいて実は隠しカメラで撮影しているのがかなり有効。最近、銀行やらコンビニやら街頭カメラやらで使われてますね。機種にもよりますがATMに内蔵されたカメラなんてこれでもかというほどクリアに写ってますし。それに比べるとATMコーナー天井付近にあるカメラ映像は見劣りします。服とか人の動きとかを見るのにはよいけど。
        という事で、ソースコードも目立つところにあからさまな印を付けておき、本当のサインは全体の中にこっそり混ぜておくのです。

        #私の場合コーディング規約が特に限定されてないときは、独自のスタイルで書くのでだいたい分かるんですけどね。並び方にしてもネーミングにしても。
    • 水戸黄門の印籠のような、見たらひれ伏しちゃうコードかぁ…

      唐突に特権モードに移って「ええい!頭が高い!」とか言いながら他のプロセスを手当たり次第サスペンドしちゃうとか。
      いや殺しはしないですよ。峰打ちぐらいで止めといて、一通りサスペンドして満足したら、元に戻しますよ。

      # そんな手の込んだもん入れたら最初にバレてそこだけ削られるわな…
      --
      「避けるまでもない」
  • Anonymous Coward : 2005年03月21日 20時23分 (#711798)
    あとで見て恥ずかしくないものにしましょう。

    参考 [archive.org]
  • whitt (21325) : 2005年03月21日 20時37分 (#711803)
    10年ぐらい前に読んだ本なのですが、
    "Pascal"という文字列が機械語では特定の演算に対応していて、文字列を実行し、レジスタの内容を確認すると、その文字列が書き換えられたかどうかが判定できる、というものがありました。
    x86のシェア(特に商用ソフト)を考えると、x86+特定のコンパイラで文字列にもなる機械語列を用意する、というのはアリかもしれません。
    • oku (4610) : 2005年03月21日 21時25分 (#711825) 日記

      厳密には文字列と違いますが、IOCCC [ioccc.org] でソース中にマシン語を直接埋め込む コード [ioccc.org] が 受賞した [ioccc.org] ことがあります。

      それから、奈良女の新出先生の UNIX like tools の中にもそういうコードがあったような記憶があります (com2txt とか sos だったかも知れない)。 あれは確か static char [] な文字列だったと思います。 LSI C-86 限定でインラインアセンブラが必要なら、素直に asm を使えばいいのですが、DOS コンパイラ汎用で人間最適化するためのテクニックではなかったかと勝手に想像しています。

      で、何が言いたいかというと、上記の受賞作品の hint にある通り、

      NOTE: If your machine is not a Vax-11 or pdp-11, this program will
      not execute correctly. In later years, machine dependent
      code was discouraged.

      なのではないかと。 ソース配布の長所の一つに「アーキテクチャに依存しない (ようにすることもできる)」点もあるわけですから。

      タレコミのように GPL を前提にするのではなく、 商用ソフトのバイナリを売ることが目的なのであれば 「文字列として、かつマシン語としても有効」である必要はないはずです。 それこそ魔法のデータ列をバイナリ中に埋め込んで 「このソフトに同梱されている fuga.dll 中には、当社が仕込んでおいた hoge という文字列が散見される。 従って、このソフトは盗品である」と主張すればすむわけですから。

    • 1個のコメント が現在のしきい値以下です。
  • 俗人化 (スコア:2, 興味深い)

    kicchy (4711) : 2005年03月21日 19時51分 (#711787)
    仕事でプログラムを書く場合は、
    俗人化しないよう心がけています。

    自分では自分が書いたという証を残さないようにしています。
    だけどきっとそれでもどこかに癖が残ってるはず。

    だから自分のコードの証は、私の書いたコードを見て
    困ってる人に聞いてください。(;´д`)ゞ
  • 参照先URL [nekosuke.net]をコメントに貼り付けてます。
  • Readme.txtに「このコードには再利用されたことがバイナリからでも
    確実にわかるしかけが作り込まれております」とでも書いておけば、
    内容も理解せずに盗用しようという輩は減るのではないですかね?
    実際には何もしていなくても、です。

    それはそれとして、盗用されたことを知るための手段をちょっと
    検討してみましょうか。

    (a) ファイル名、関数名、外部変数名などの一致
    実世界で盗用が明るみに出るのはこのケースが多いようですね。
    ただ、統一的に変更されていたら証明はかなり手間がかかりそう。

    裁判の場など第三者に直接アピールするのはやはりメッセージだと
    思います。ではどうするか、ですが...。

    (b) 開発者名などのメッセージを入れておく
    特定位置の文字値をコード中でループ制御やらフラグ値などに使い、
    メッセージを変更したらちゃんと動かなくなるようにするわけです。
    C言語ならそうそう簡単にはそのメッセージを無効にできないように
    することも可能ですが、プログラムは汚くなりそう。

    (c) 実行時にメッセージを作る
    適当なテーブルに実行時にこっそりメッセージを組み立てておき、
    特定の場面でメモリのスナップショットをとれば開発者が誰だか
    わかるようにする。組み込み環境だと発見できないかな?
    • __hage (7886) : 2005年03月22日 0時48分 (#711904)
      バグが決め手になったという例もあったかと思います。
      わざわざバグを入れるやつはまずいないんで、
      同じ状況で同じバグが発現すればデッドコピーだと判断できると。

      あと、非常に有名な例ではゼビウスのやつがあります。
      ゲーム開始時に一定の操作をするとメッセージがでてくるという。
      コピーして改変したやつだと「盗品だ」みたいなメッセージが出ました。

      地図なんかでは、わざとミスを仕込んでおくそうですね。

      話は変わりますが、昔、バイナリに仕掛けを入れたことがあります。
      別に自分が作ったことを主張したいとか、コピーの検出とか、
      わざとバグを仕込んだとかいうんじゃないんですが。

      点取り占いってありますよね。
      作った物自体は単純に起動したらメッセージを出して終わるだけの物です。
      メッセージはバイナリにxor程度の簡単な暗号化を施して入れてあります。
      んで、バイナリエディタなんかで覗いたときに、
      「おまえは出歯亀だ ●一点」
      というメッセージだけはそのまま見えるようにしておいたのでした。

      引掛った人からメイルが来たりして面白かったな。
  • 実は (スコア:1, おもしろおかしい)

    Anonymous Coward : 2005年03月21日 21時16分 (#711819)
    特殊なバグが仕込んであります。
    2035年にトラブルが発生するシステムは私のプログラムのコピーです。
  • cloudy (1160) : 2005年03月21日 23時02分 (#711863)
    あまり詳しくないのですが、ステガノグラフィーに似たWatermarkingという技術があるそうです。

    これは、プログラム構造そのものにメッセージをエンコードして埋めこんでおき、 多少手を加えられたとしても、デコードすればそのメッセージを読み出せるようにするものです。バイナリにコンパイルされたコードでは逆アセンブルする必要がありますが。

    Google で検索すると こんな論文 [arizona.edu]が見つかりました。 多少の最適化、プログラム変換等を施してもメッセージは消えないよう考えられているそうです。

  • Anonymous Coward : 2005年03月21日 23時04分 (#711864)
    私のコードは我流で無形なのでだれにも読めません
  • すぐわかるけど (スコア:1, おもしろおかしい)

    Anonymous Coward : 2005年03月22日 0時41分 (#711898)
    「だれだよっ!こんなヘボなコード書くやつは!」
    「ぼくですけど。。。」
    「またお前か。。。」
  • Anonymous Coward : 2005年03月22日 1時40分 (#711924)
    sourceレベルならばC言語の場合のforとwhileのような互換性のある命令を使ってwartermarkを入れられそうですが、バイナリレベルだとどうするんでしょうかね?
    プログラムと本質的に不可分にするのが難しそうです。gccでコンパイルするのとicc/icpcでコンパイルするのでは異ったバイナリになるし。やはり、
    ・staticで文字列を入れる (不可分ではないですね....)
        →これは海賊版のファイルを実行せずとも判定可能であるという利点があります
    ・命令を用いて動的に文字列を作る(これも不可分ではないですね....
          これは、昔のコピープロテクト屋と解析屋の戦いのような物になりそうですね。
          ソースが見える分解析屋に有利ですね)。
    ・プログラムのロジックと文字列生成をからませる。
          (多少不可分でなくはなりましたが、解析屋としては上記と差がないですね)。

    C/C++の場合になりますが、適当にmacroとかtemplateでobfuscateしつつ暗号化したstatic文字列を入れるというのが妥当な解になりますかね。暗号学的なwatermarkやsteganographにはなりませんが。

    # 昔のコピープロテクト外し件数が4桁行ってるのでAC
  • Re:しないよ (スコア:3, 参考になる)

    sparklegate (14682) : 2005年03月21日 21時29分 (#711827) ホームページ
    >なんで、そんなことしなけりゃいけないんだ。

    それはGPLで公開したからでしょう。

    GPLはパクられることに歯止めをかけようとしているのではなく、その後も中身をいじれる自由をくれと言っているのです。
    この自由がなくなってしまっては、我々にも恩恵が無い。
    GPL違反を見つける活動は、ちゃんとそう言う自由が得られているか確かめる活動だと思う。
    --
    - Sparklegate, Yam.
  • Re:しないよ (スコア:3, 興味深い)

    Artane. (1042) : 2005年03月21日 21時36分 (#711831) ホームページ 日記
    単なるフリーソフトの間ならばそれでいいと思うのですが、
    フリーソフトを使用していることを周知しないであたかも自社で1から開発したプロプライエタリなソフトであるかのように使う会社が増えたからだと思いますけど?
    そういうフリーソフトと言う「みんなのもの」を「自分の物」として独占して利益を上げるのは流石にまずいのではないかと(;´Д`)

    --
    --暮らしの中に修行あり。
    blogはじめました。 [hatena.ne.jp]
  • oku (4610) : 2005年03月21日 21時41分 (#711838) 日記
    パクられてもいいから、区別できるようにはしない。
    なんで、そんなことしなけりゃいけないんだ。コードくらい好きに使わせてやれよ。

    大変ご立派なお考えだと思います。 そういう方はご自分のコードを「Public Domain [gnu.org]」にしていただければ幸いです。

    # GPL 違反 [gpl-violations.org]がこのストーリーの元ネタなもので、申し訳ない。

    • 1個のコメント が現在のしきい値以下です。
  • dorifer (514) : 2005年03月21日 22時53分 (#711859) 日記
    > パクられてもいいから、区別できるようにはしない。
    そして、「人のプログラムを盗用して提出した」と停学になったりするわけです。
    --
    IN EARTH AND SKIE AND SEA STRANGE THYNGES THER BE.
  • etsav (7596) : 2005年03月22日 1時47分 (#711927) ホームページ 日記

    『参考に』してもらうのは難しいかもしれませんが、 パクられるのは結構簡単だったりします。 あたしみたいな三流プログラマでも経験しましたし。

    とある企業 A に派遣されてた頃の事。 A の関連企業 A' に外注されたコードを弄ってたのですね。 これの DB へのアクセスが異常に重たいのです。 ソースを見る権限は頂いてましたので、 ちょっと調べてみると――当時のあたしは RDB に関しては、 初めて実物に触れてひと月ちょっとのど素人状態でしたが―― DB エンジンの FAQ を見れば直ぐに見つかる、 「こういうアクセス方法は重たいからやっちゃだめだよ~」って方法だったのです。 だもので、 FAQ の説明読みながらちょろちょろっと検証用のコードを書いて試してみて、 「こっちの方法なら推定十倍のパフォーマンス出ますよ、 FAQ にも書いてありますし」って A の担当者さん経由で A' へ送りました。

    しばらくして A' から修正版がやってきました。 劇的に速くなってます。 どう直したのかなとソースを覗くと……  一目見てその部分だけ他のところと印象が違うのですね。 書いた人が違うのかな、 でもどっかで見たようなコーディングの癖だなぁ――と思ったら、 ご丁寧にも注釈だけ消された、 あたしの書いたコードそのまんまでした。 『客側』の『素人』が書いた検証用コードを売りつけるなんて……〔苦笑〕

    それはそれとして。 コーディング規約がきっちり定められているとどうなるか判りませんが(そういう職場に行った事が無いもので)、 一緒にお仕事してその人の書いたコードをある程度の量見る事が出来ると、 複数人が編集したソースファイルでも、 ぱっと見でその部分を誰が書いたのか判別できるようになりますね。

    # ここはもともと a さんが書いたんだろうけど b さんが部分修正してる。
    # でも b さん遠慮して a さんの流儀に合わせようとしてるな~、とかって。
    # なんでそこまで判るのか自分でもよく解りませんが。

    --
    『おちゃらけは最強の感情武装である』
    • wd-nara (25864) : 2005年03月22日 13時53分 (#712057) 日記
      プログラミングの演習でプログラムを提出させると、参考プログラムに手を入れたものを提出する学生が多数います。先人の模倣から始めるのは一つの学習法ですから、それ自体は、特に悪いことではありません。ところが、そのうち何人かは、「こういうことをするとこんな害がありますから、良い子は真似してはいけません」と注意書きがあるほうを、わざわざ選んで真似します。教員はそれを見て頭をかかえます。

      ガッコのセンセをしている方々、悪い例の例示は慎重に。

    • 2個のコメント が現在のしきい値以下です。
  • 3個のコメント が現在のしきい値以下です。