- PR -

逆コンパイル対策について

投票結果総投票数:131
必ずするようにしている 2 1.53%
高価なものだけしている 1 0.76%
全くしていない 128 97.71%
  • 投票は恣意的に行われます。統計的な調査と異なり、投票データの正確性や標本の代表性は保証されません。
  • 投票結果の正当性や公平性について、@ITは一切保証も関与もいたしません。
投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-05-14 21:58
 まず、blue200102さんが何を主張したいのか、わかりません。当初の私の理解は、「自分の思い通りではないことついてマイクロソフトに文句を言っている」です。
 これは誤解だと思ったので、最初は関わりませんでした。が、2ページ目の投稿内容から、あながち誤解ではないのかもしれないと思い、3ページ目の投稿をしました。ここで私は、マイクロソフトに“要望”を送るコツを書いており、また、内容によっては私が代わって要望を送りますよと書いているのですが、それに添った投稿は、今のところ(5/13まで)無いと判断しています。

 さて、この会議室の<strike>投稿</strike>投票機能を利用されているわけですが、今のところ、
* 必ずするようにしている・・・ 1
* 高価なものだけしている・・・ 0
* 全くしていない・・・・・・・94

となっています。もしこの選択肢が、
* 必ず行いたい
* 場合によっては行いたい
* 行う必要を感じない

であれば、どこに票が集まったでしょう?
上2つに集まったことによって、「これだけの要望がある。だから難読化できるようにして欲しい。」とすることはできるのです。
 あるいは、新たにスレッドを起こして、「これだけの潜在的要求があるにもかかわらず、ツールが高価なためにできていない。だから追加してくれ。」とも言えます。

 せっかく MSDN フォーラムでスレッドを作られているのですから、そこで続ければ良かったのではないかと思います。向こうであれば、どう理解されるかはともかく、マイクロソフト社内の人や、開発チームの人の目にもとまるでしょうから。しかし、こちらに投稿されている頻度から見ても、向こうは“放置している”ように思われます。

 これらのことから、ただの文句であると判断します。ただの文句であれば、こういうところで行わず、自分のブログなど、プライベートなところでやって欲しいと思います。


 難読化という行為について。
 難読化という行為には、興味はあります。しかし、行うかどうかは、また別の話です。
 単に変数名を a や b など、単純化するだけなら、Refactor とかでもできるので、まぁ、間違いはないでしょう。しかし、MSDN フォーラム<microsoft.com> で返答されているように、
引用:
コード:

public void a(int a, short a, string a)
{
long a; double a; float a; object a;

a = a(a + 3, a);
}



こうなると、ちょっと別ですね。このように変更されたコードが、元のコードと同一の動作をすることの検証をしなければなりません。また、何らかの不具合があったときに、どうやって元のコードの場所を割り出すか、検討しなければなりません。
 そういった検証の結果、変更されたロジックに元のロジックと同一性がないとわかったときに、どのような対応を行うか、事前に検討が必要でしょう。コーディングパターンを分類できるなら、検証しなければならない項目を減らせるでしょうが、そうでないなら、元のコードを変更する都度、同一性の検証が必要ではないでしょうか。
 元の投稿は、そのような難読化することのデメリットについて、考慮されていないように思います。


 『Writing Secure Code』<microsoft.com> という本に書いてあることですが、どんなアタッカーから守らなければならないかを明らかにすることが必要ではないでしょうか。この本の中では、確か、「スクリプト キディ」「興味本位のクラッカー」「プロのクラッカー」「スパイ」と分けていたと思います。スクリプト キディや興味本位のクラッカー相手であれば、Dotfuscator Community Edition で十分ではないでしょうか。しかし、スパイ相手であれば、最上位エディションでも難しいでしょう(アセンブリから解読をかけられれば)。
 では、プロのクラッカーを想定しなければならない場合がどれくらいあるか。あるいは、本当にプロのクラッカーを相手にしなければならないのか。「本当に危惧しなければならない状況って、ほとんど無いんじゃない?」というのが、私の意見です。
# 少なくとも、「高価だからする」ではないはず。


 つまり、私は2投稿目以降「ただの文句じゃもったいない。要望にまで昇華しましょう」というスタンスで書いています。したがって、「保護対象のソースや技術に市場価値があるか問うてはいない」ではなく、問うて欲しいのです。要望を出すには、そうしなければならない、あるいはそうしたいコードがどれくらいあるのかということが重要ですから。「保護対象のソースや技術に市場価値があるか問」わず、単に「難読化させたいか?」であれば、こと @IT の場合、「場合による」という回答が多数を占めるのではないでしょうか。

 なぜ「要望まで昇華」かというと、この辺り。(あるいは、ただの文句と判断したか)
引用:

blue200102さんの書き込み (2007-05-07 10:32) より:
しかし、考えてみたら、マイクロソフトのフォーラムなので、逆コンパイルという微妙な事柄なので、マイクロソフトに対して遠慮がある人もいるのかもしれないと思いこちらでも立ててみた次第です。
というのは、そもそも、マイクロソフトは、Visual Studioには、Dotfuscator Community Editionなどとケチな事を言わないで、もっと本格的な難読化ができるProfessional Editionを付けるべきだったと考えます。
ソフト開発で飯を食っている者にとって、自分の苦労して考えたロジックをちょっと変えただけで、別のところに売られてしまうような事は、悔しくてたまりませんし、同時に死活問題であります。
そもそも、マイクロソフトは、旗を振って、.Netを推し進めたのだから、我々プログラマーの権益を守る義務があると思います。事実上の独占企業であるマイクロソフトは、もう少し、やさしさを持ってほしいと思っています。

blue200102さんの書き込み (2007-05-08 09:01) より:
それに、MSもソースコードは、公開してないじゃないですか。それが、MSの利益と独占の源ではないですか。
# 別に、MSと、張り合う気はないですが。

blue200102さんの書き込み (2007-05-09 03:18) より:
もし、私が、100%正しい尤もな不満だと確信していたら、直接MSに言っています。



 繰り返しますが、100% 正しくて尤もだとしても、本人だけが考える不満は、受け取られた後、考慮されることは少ないです。強調したように、本人だけがそう思っているというところが肝心です。なので、そう思っているのが本人だけではないということ、製品のユーザに対して多くの割合の人がそう思っていることを示すことが重要です。
 たとえば、ユーザが50人しかいなくても、50人のユーザ全員が同じことを思っているなら、それは要望として強い力を持っています。しかし、たとえ1万人が要望したとしても、全ユーザが100万人いて、その他99万人のユーザが必要と感じないなら、要望としては強い力を持ちません。

 この事例を要望とするには、
* プロダクトにおけるどれくらいの割合で、どの程度のレベルの難読化が必要か
* 実現されたときに、全ユーザに対するどれくらいの割合のユーザが恩恵を受けるか
位は、要望する側が調べなければ(推測しなければ)なりません。

 要望が通った例としては、Unit Test が挙げられるでしょう。VS2005 では、TS エディション以上のみ、Unit Test が付属していましたが、Orcas ではProfessional エディション以上に追加される予定です。この場合、要望を出した時点で統計的情報はありませんが、適切な場所に適切な形で、理由とともに要望を出したため、統計情報も集まり、実現につながったと言えるでしょう。
→ もと http://blogs.wankuma.com/naka/archive/2004/11/29/6351.aspx
→ 結果 http://blogs.wankuma.com/naka/archive/2007/03/28/69285.aspx

 逆に言うと、マイクロソフトも難読化は必要だと感じているが、おおかたの事例は Dotfuscator Comunity Edition で十分にまかなえると考えている、とも言えます。
 守りたいものに対する利権と、$4,950 (¥595,039) という値段(dotfuscator)の天秤ということになるかと思います。難読化したソフトウェアが何本売れると見込んでおり、1本あたりの利益がいくらで、それらから得られる予定の利益に対して $4,950 という値段がどうかという見方をすれば、あるいは「安い」と感じるかもしれません。

[ メッセージ編集済み 編集者: Jitta 編集日時 2007-05-14 22:17 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-05-16 06:30
最初の質問の、根本的なところだけど。。。


.NET アセンブリ(JIT コンパイル や ngen 前のコード)から、VB.NET, VB2005 や C#、あるいは COBOL.NET でも J# でも Ruby.NET でもなんでもいいや。そういう「高級言語」(?)へ逆コンパイルすることって、できるのですか?


ildasm の結果は、少なくとも上に挙げた言語じゃないよね?Portable Executable と比較すると、どちらかというと link 前のアセンブリって気がする。
_________________
blue200102
会議室デビュー日: 2007/05/07
投稿数: 8
投稿日時: 2007-05-16 08:18
皆さん、ご投稿ありがとうございます。引き続き、活発なご投稿と議論を期待しております。

引用:

Jittaさんの書き込み (2007-05-14 21:58) より:
 せっかく MSDN フォーラムでスレッドを作られているのですから、そこで続ければ良かったのではないかと思います。向こうであれば、どう理解されるかはともかく、マイクロソフト社内の人や、開発チームの人の目にもとまるでしょうから。しかし、こちらに投稿されている頻度から見ても、向こうは“放置している”ように思われます。

 これらのことから、ただの文句であると判断します。ただの文句であれば、こういうところで行わず、自分のブログなど、プライベートなところでやって欲しいと思います。


放置しているわけではないのですが、こちらの方が反響が大きかったので、やり取りを繰り返す内にこの様になってしまいました。
別に文句を言っている訳ではなく、「Reflector for .NET」で自分のプログラム(Dotfuscator Comunity Editionで難読化した)を逆コンパイルした時、あまりに、詳細に元のコードが再現されたので、その時の第一感想を書いただけです。私は、数行程度の感想は、ここで書いても良いのではないかと思っていますし、皆さんの感想も、大歓迎します。

引用:

 単に変数名を a や b など、単純化するだけなら、Refactor とかでもできるので、まぁ、間違いはないでしょう。しかし、MSDN フォーラム<microsoft.com> で返答されているように、
引用:
コード:

public void a(int a, short a, string a)
{
long a; double a; float a; object a;

a = a(a + 3, a);
}



こうなると、ちょっと別ですね。このように変更されたコードが、元のコードと同一の動作をすることの検証をしなければなりません。また、何らかの不具合があったときに、どうやって元のコードの場所を割り出すか、検討しなければなりません。
 そういった検証の結果、変更されたロジックに元のロジックと同一性がないとわかったときに、どのような対応を行うか、事前に検討が必要でしょう。コーディングパターンを分類できるなら、検証しなければならない項目を減らせるでしょうが、そうでないなら、元のコードを変更する都度、同一性の検証が必要ではないでしょうか。
 元の投稿は、そのような難読化することのデメリットについて、考慮されていないように思います。


難読化の同一性についてですが、「暗号化と違い、難読化とは不可逆性のものである」ですから、同一性の保障は、重要と考えています。要するに、難読化したら、ロジックが変わってしまうような事が起こる事を大変懸念しています。難読化後、計算ロジックが、微妙(端数の処理とか?)に変わってしまって、間違った結果値がそれらしく出でしまう事があれば、本末転倒です。
皆さんは、この件については、どの様にお考えになっているのでしょうか?

引用:

 逆に言うと、マイクロソフトも難読化は必要だと感じているが、おおかたの事例は Dotfuscator Comunity Edition で十分にまかなえると考えている、とも言えます。
 守りたいものに対する利権と、$4,950 (¥595,039) という値段(dotfuscator)の天秤ということになるかと思います。難読化したソフトウェアが何本売れると見込んでおり、1本あたりの利益がいくらで、それらから得られる予定の利益に対して $4,950 という値段がどうかという見方をすれば、あるいは「安い」と感じるかもしれません。

[ メッセージ編集済み 編集者: Jitta 編集日時 2007-05-14 22:17 ]



当たり前だけど、リスク判断というのは、大変難しい事だし、一番重要な事だと思います。例えば、社内機構の風通しが悪く、社内に不満や怒りが鬱積したような所では、社内融和にまず取り組むべきですし、そちらに、そのお金を投資した方がいいかもしれません。鬱積した社員がリスク要因になるかもしれないからです。不正アクセスで、流出する事も考えられるので、そちらに、そのお金を投資した方が良い場合もあるでしょう。確か、Windows2000のソースコード流出は、不正アクセスが原因だった筈です。
従って、Dotfuscator Comunity Editionで、どこまでソースコードを保護(てこずらせられるか)できるか、という議論になってくるのではないでしょうか?

引用:

Jittaさんの書き込み (2007-05-16 06:30) より:
最初の質問の、根本的なところだけど。。。
.NET アセンブリ(JIT コンパイル や ngen 前のコード)から、VB.NET, VB2005 や C#、あるいは COBOL.NET でも J# でも Ruby.NET でもなんでもいいや。そういう「高級言語」(?)へ逆コンパイルすることって、できるのですか?


ここに、「Reflector for .NET」という逆コンパイラを使った実証例が出でいます。
http://www.atmarkit.co.jp/fdotnet/tools/dotfuscator/dotfuscator_02.html


[ メッセージ編集済み 編集者: blue200102 編集日時 2007-05-16 08:22 ]
ひら
ぬし
会議室デビュー日: 2005/03/04
投稿数: 260
投稿日時: 2007-05-16 09:41
引用:

Jittaさんの書き込み (2007-05-14 21:58) より:
>当初の私の理解は、「自分の思い通りではないことついてマイクロソフトに文句を言っている」です。
>「ただの文句じゃもったいない。要望にまで昇華しましょう」


文句や要望ではなく、ソースコード保護の重要性について、マイクロソフトの
方針を例示しているに過ぎないのでは?
blue200102
会議室デビュー日: 2007/05/07
投稿数: 8
投稿日時: 2007-05-17 13:34
皆さん、ご投稿ありがとうございます。

引用:

暁さんの書き込み (2007-05-10 00:07) より:
ソースコードを納入しない点について否定的な方もいらっしゃいますが、
専門性の高いアプリケーションについては、普通に行われているものと思われます。
例えば、パラメータや計算式が重要なアプリの場合が考えられますが、
これらが解析されると会社の強みが失われ、大きな損害を受ける可能性が考えられます。



引用:

はにまるさんの書き込み (2007-05-12 16:45) より:
引用:

そこにはユーザーの戦術レベルの業務改善ノウハウが存在し、それはユーザーにとっては当然守りたいものだと思います。


アイデアは著作権の保護対象ではありません、守秘義務や他の知的財産権で保護しなければならないでしょう。

引用:

その場合ソースを開発側のみ持つというのは一方的な権利の主張かも。


大抵の企業は契約時に著作権や納品物のチェックをします。パッケージ購入ならともかくオーダー開発で取引契約を法律的に判断しないのは愚かな行為です。市場の力関係からすれば一方的にベンダーが権利を押し切ることは考え難いのでは?



引用:

ラフィンさんの書き込み (2007-05-13 12:05) より:
確かに開発者の保護ばかり話が集中しユーザーの知的財産権に対する保護まで議論が及んでいませんでした。技術力を直接のサービスとして考えている技術者に対し、サービス指向の技術者からすれば知的財産権の根幹をなすソースの保護は重要課題であり、前者と価値観が合わない箇所かもしれませんね。



受託開発で、お客さんに、ソースコードを納品したり逆コンパイルされた場合、私が懸念しているの事は、結局、お客さんが、当方に難しい所だけをやらせて、後は、安い価格の会社に開発を引き継がせる事です。
この様な事を法律や契約内容で、防ぐ事は出来るのでしょうか?


[ メッセージ編集済み 編集者: blue200102 編集日時 2007-05-17 13:54 ]
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2007-05-17 15:52
お客様の業界/業種、開発会社の提供サービスにもよるところはあるかもしれませんが、
私自身の感覚としては以下のように思いました。

引用:

blue200102さんの書き込み (2007-05-17 13:34) より:

受託開発で、お客さんに、ソースコードを納品したり逆コンパイルされた場合、
私が懸念しているの事は、結局、お客さんが、当方に難しい所だけをやらせて、
後は、安い価格の会社に開発を引き継がせる事です。



私には杞憂に思えます。

○まずソースコードを納品している場合。
受託した開発会社をA社としましょう。
ソースコードを納品する意図は、A社にしか開発できないような状態に
しないためだと思います。これはお客様視点で見た場合、
品質が悪いなどの理由でA社への依頼を止めたければ止めることができます。
あるいはA社の不得手な分野に関しては他社に依頼することもできます。

これはA社にとって不利なことでしょうか?
お客様からすれば、A社に依頼してコストパフォーマンスが悪くなければ、
次もA社に依頼するでしょう。A社製ソースコードを改修したり、
機能追加したりするのは、間違いなくA社が一番低コストで行えるはずですから。
お客様とA社が良好な信頼関係を築くことができていれば、
そんなに簡単に別の会社には乗り換えたりしないと思います。

継続的に取引のあるA社に発注することのお客様のメリットとしては、
・新しい案件でも打合せもスムーズに行く
・(プログラム、ドキュメント、納期を守るなど総合的な)サービスの品質が
 発注前からある程度確保できる
などが挙げられると思います。

A社が一定の水準でお客様の期待に応えている限り、これらのアドバンテージのため、
他社に仕事を持っていかれることはないと思います。

理想論かもしれませんが、このアドバンテージは発注金額が高い安いという理由だけで
揺らぐものではないと思います。(最終的には金額だけでなくサービスの品質との
トータルで判断されるものだと思います。)

ソースコードが手に入ったことで、A社への発注を止める/減らすなどしたとしても、
それはソースコードが手に入ったことが主要因ではなく、
その前からA社に不満を持っていたということじゃないでしょうか。

○逆コンパイルまでする場合。
一般に、すべてのソースコードを見ることができる場合でも、
製作者以外がそれらを全体通して解析するのは非常にコストがかかりますよね。
まして難読化されたプログラムを逆コンパイルして
そのソースを解析するには途方もないのコストがかかると思います。
(簡易的な難読化でも)

それほどのコストをかけるとしたら理由は何でしょうか?
・A社の提供しているサービス品質に不満がある
(提供しているサービスに対して価格が高すぎるとか、プログラムの品質がよくないとか)、
・そうでなければ、サービスの価値など無視してとにかくコストを抑えたい
 アコギなお客様である
のどちらかじゃないでしょうか?

引用:

この様な事を法律や契約内容で、防ぐ事は出来るのでしょうか?



ソースコードを納品しないで、リバースエンジニアリングの禁止を契約条項
に入れるという既に挙がっている対策では不十分なのでしょうか?
#法律に詳しくないですが、他社に発注するなとかいうのはたぶん無効でしょう。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-05-17 21:54
引用:

ひらさんの書き込み (2007-05-16 09:41) より:
文句や要望ではなく、ソースコード保護の重要性について、マイクロソフトの
方針を例示しているに過ぎないのでは?


だったら、2007-05-14 21:58 の引用内で太字強調している部分は不要でしょ?そこがあるから「文句と判断した」と書いているでしょ?

 ところで、よくわからないのですが、blue200102さんの投稿のどこに、「マイクロソフトの方針(が)例示して(ある)」のでしょう?
ここ、3通りに意味が取れます。
1.「ソースコード保護は重要だ。マイクロソフトはそのことを理解し、方針を打ち出している。この辺がその例だ。」
2.「ソースコード保護は重要だ。しかし、現在のマイクロソフトの方針では、重要視されていない。だから、こうするべきだという例を示した。」
3.「ソースコード保護は重要だ。しかし、マイクロソフトはそのことを理解していない。理解していない例は、この通りだ。」
 1なら議題にする必要を感じません。2なら要望ではないでしょうか。3なら文句ではないでしょうか。


まとめてしまいます。
引用:

blue200102さんの書き込み (2007-05-16 08:18) より:
当たり前だけど、リスク判断というのは、大変難しい事だし、一番重要な事だと思います。


 dotfuscator のヘルプ ファイルに、こういう場合はダメ、という例があります。
 リスクつながりでいけば、やはり先行技術、類似技術がないか調べることも重要でしょう。私もつい最近、ある提案をしたら「特許登録する?」と言われました。調べてみると、すでに登録されていました。しかし、つぶせるだけの先行技術ネタはつかんでいるつもり。


 それと、難読化よりもネイティブ コンパイルしてしまった方が早いと思ったので、検索してみた。
(キーワードは「msil native compile」)

  • .NET Reactor<eziriz.com>
    3.0まで対応。1ライセンス$169。完全にネイティブ化するのではなく、ネイティブ コードを混ぜることでデコンパルを止める?
  • Remotesoft Salamander .NET Linker<remotesoft.com>
    必要なアセンブリまで含めてすべてリンクし、ネイティブ化する。実行環境に .NET Framework Runtime が不要。1ラインセンス$1,249 と、少しお高いが、dotfuscator に比べると1/4の値段。



もひとつまとめます。
引用:

受託開発で、お客さんに、ソースコードを納品したり逆コンパイルされた場合、私が懸念しているの事は、結局、お客さんが、当方に難しい所だけをやらせて、後は、安い価格の会社に開発を引き継がせる事です。
この様な事を法律や契約内容で、防ぐ事は出来るのでしょうか?


 契約で防ぎます。どちらも(委託者も受託者も)再利用できるが、他方の了解がなければならない、と。
そういう契約で納めたコードは、お客さん自身にコードを変更する能力があっても、契約上、できません。(そのため、「メーカーさんもオープンソースにしなさいよ」と、言われたことがある)
もちろん、「今話題になっている、国営遊園地でミッキーマウスを平気でパクっているような国」とかを持ち出されると、どうしようもありませんけど。
 受託者が勝手に使えないのは不便ですか?でも、依頼がなければ思いつかないはずですから、委託者によって縛られます。
(一人勝ちしようとするから、リスクも大きくなるのではないか、と)
_________________
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2007-05-18 00:30
引用:

blue200102さんの書き込み (2007-05-17 13:34) より:
受託開発で、お客さんに、ソースコードを納品したり逆コンパイルされた場合、私が懸念しているの事は、結局、お客さんが、当方に難しい所だけをやらせて、後は、安い価格の会社に開発を引き継がせる事です。
この様な事を法律や契約内容で、防ぐ事は出来るのでしょうか?


ソフトウェアの保護は、先行している音楽・映像業界からして見て、知的財産権の法整備と法律を具現化する技術の2本立てが必須でしょう。さらにソフトウェアシステムは、サービスの提供方法が多用しているため契約制度(取引方式)をあわせた3本柱で対応しなければ片手落の話になると僕は考えます。

つまりソフトウェアは、法律、契約(取引方式)、技術の3つで保護する必要があると考えます。

この話はシステム開発の視点ではなく、音楽・映像業界に見るソフトウェア保護の延長線上で考えた方が議論としては面白く実務的に即した有益な情報が得られると思います。

スキルアップ/キャリアアップ(JOB@IT)