DLLを特定のアプリでしか使用出来ないようする方法は?


junjun  2012-07-25 13:36:23  No: 73487  IP: 192.*.*.*

いつもお世話になります。

早速質問ですが、、、、
作成したDLLを特定のアプリでしか使用出来ないようにする方法は、
どういったものがあるのでしょうか?

出来れば、引数で渡すのではなく、DLL側から呼び出し元の情報が
取得出来るような方法があるといいのですが、、、、、
(しかも呼び出し元から取得出来る情報が固有/固定だとなお良いのですが、、、)

前提としては、
  ・呼び出し元は、EXEやDLL
  ・呼び出し元の更新は、度々発生する可能性がある。
  ・使用するDLLの更新は、基本無い(完成すれば)。
  ・呼び出し元が更新されても、使用するDLLの変更は不要としたい。

わがままですかね?
なにかよい方法があれば、教えていただきたいと思います。


申し訳有りませんが、宜しくお願いします。

編集 削除
tetrapod  2012-07-25 19:06:58  No: 73488  IP: 192.*.*.*

使用する、とはどういうことを想定しているのかな?
資料の無いコンパイル済み DLL など使い道が無いと思うが・・・
それによって対策とか全部異なると思われる。

manage DLL と native DLL でもいろいろ違いそうだし。

どうなる(どう使われる)ことに対して
どういう対策を採りたいと思っているのか聞かせてほしい。

編集 削除
junjun  2012-07-26 11:07:27  No: 73489  IP: 192.*.*.*

確かに資料がなければ、関数の引数等は把握出来ないので使い道が
無いと思うのですが、、、、

仮に資料があったとしても使えないようにしたいのです。
(そのトフフ自体を、把握しているアプリ以外では使用出来ないようにしたい)

認証関数を用意して、決められた「鍵」で実行しないとトフフが動作しないようにして、資料にはそれを明記しない方法もあると思うのですが、、、
わがままですが、鍵管理自体も極力避けたいのです。

トフフ側から、使用されたアプリの情報取得(固有の)が出来るのであれば、手がありそうなんですが、、、、、

スタティックライブラリにして埋め込むって手もあると思うけど、、、
更新に対し、ビルドし直すのも、、、、、、
迷いどこです><
スススススススススススススススススススススススススススススススススススススススス
ニコ メ
トコ イーアイッーキッイカィ木ゥ アイコエエコウア  書込者ノト:ロ 「。ヲ「。  ン

資料をもとにつくった新しいアプリは、
資料をもとに「そのトフフ自体を、把握しているアプリ」になりますね

ヲサ使用されたアプリの情報取得(固有の)
トフフ側で呼び出せるかどうかの前に、
まず、呼び出し側のアプリに、
どのような「固有」の情報を持たせるつもりなのでしょうか?

ぶっちゃけると、トフフどうこうに関係なく
「特定のアプリ」の「特定」です。
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアイッーキッイカィ木ゥ アオコイクコウウ シ  スュアセシ初心者セ シッニセシノヘヌ ス「コッッョョョッッアョ「 ス「ー「セ 書込者ノト:ロ 」 ァマム「」「ネ ]

>ぶっちゃけると、DLLどうこうに関係なく
>「特定のアプリ」の「特定」です。

どう答えるといいのかな?
僕の思っている「特定」は、資料を元に作成されたアプリというよりも
自分が把握している使用者が作成したアプリみたいな感じかな。

僕が知らない人が作成したものでは、DLLが動作しないように
したいです。

持たせたい「固有」についても、何が取得出来るのかが
よくわかっていないので、どのようなと言われると
なんとも言えませんが、、、、、

たとえば、DLL自体が、呼び出し元アプリのGUIDを取得できるとか
でも、限定できるのかなと思ったりしますが、、、

具体的な質問が出来なくて申し訳ないです。
セキュリティの高いDLL作成された場合の対応をどうしたらいいのか
考えている感じです。

やっぱり、漏れないようにするしかないんですかね??

編集 削除
tetrapod  2012-07-26 18:18:39  No: 73490  IP: 192.*.*.*

うん、具体的に何を心配していて何がどうなってほしいのかがつかめない。
そういう保護機構を設けたとしても、リバースエンジニアリングして解除することは簡単だし。

まあとりあえず
> DLL自体が、呼び出し元アプリのGUIDを取得できるとか
であれば、たとえば
DLL 中でも GetModuleFileName() で EXE のファイル名を拾うことはできる。
GetVersionFileInfo() + VerQueryValue() で [バージョン情報] 一式を拾える。
EXE の CompanyName や LegalTrademarks が特定のものでないと受け付けないとか
EXE の FileVersion とか SpecialBuild が特定の形式でないと受け付けないとか
そういうチェックはできるかもしれない(やりたいのはこういうこと?)

認定 EXE → 未認定 DLL → 保護したい DLL とか
未認定 EXE → 認定 DLL → 保護したい DLL とか
そういう場合にどうしたい(どうなってほしい)とか、
仕様つーか案件つーか、整理が必要かもしれないけど。

編集 削除
junjun  2012-07-26 19:03:20  No: 73491  IP: 192.*.*.*

そうですね、やりたいことは、EXE情報を取得して、
その情報を元にDLLが動作すべきかを判別したいと思っています。

>認定 EXE → 未認定 DLL → 保護したい DLL とか
>未認定 EXE → 認定 DLL → 保護したい DLL とか

確かに、、、、切りがないかもですが、、、、

ちなみに、GUIDを取得することって可能なのでしょうか?
ネットで調べる程度では、うまく見つけられなくて、、、、

無いのであれば、上記のEXE情報でコントロールできそうなものを
利用出来ないが検討してみます!


ありがとございます!!

編集 削除
junjun  2012-07-26 19:06:25  No: 73492  IP: 192.*.*.*

ちなみに、、、、、
.NETは使っていないです。
DllをBorand C++で使うらしく、.NETは使わないようにしてほしいと
言われていますので、、、、
(Borand C++でも.NET扱う方法はあると思うけど、古いSystemを使っているので、避けたいと、、、、)

.NETならGUID取得方法もあったんですけどね・・・・・orz

編集 削除
オショウ  2012-07-26 21:12:45  No: 73493  IP: 192.*.*.*

GUID は、.NETだけのものではありません。
COMの時代からあります。(表現おかしいかナ〜)

よって、Win32 APIで生成も取得もできます。

※  リバースエンジニアリングの話は別としても、C言語だけで
    要求されるものは作れますヨ!
    簡単にクラッキングされず、難しく時間のかかる方法を導入
    してやるだけです。
    要は費用対効果。そのDLLをクラッキングするに膨大な時間
    を要しても利益を得たいという代物なら、何を施してもダメ
    でしょう。

※  アイデア次第で、いくらでもプロテクトは施せます。

以上。参考まで

編集 削除
tetrapod  2012-07-26 21:37:09  No: 73494  IP: 192.*.*.*

> ちなみに、GUIDを取得することって可能なのでしょうか?
質問の意味が良くわからない・・・

GUID って要するに「他とかぶる可能性が低いユニーク値」ってだけのことで
これを生成する手段はいくつもあって、たとえば
http://99blues.dyndns.org/blog/2010/07/uuid_generate/
他にも CoCreateGUID とか。

> DLL自体が、呼び出し元アプリのGUIDを取得できるとか
任意の EXE が、それぞれ唯一の GUID を必ず持っていると考えているなら、違う。
仮に持っていたとしても、それを「認証」に使うことは不可能だ。
どうやって事前に知ることができる?

編集 削除
επιστημη  URL  2012-07-26 22:11:48  No: 73495  IP: 192.*.*.*

「合言葉」は使えないかな。
DLLから返ってくる「山」に対し「川」と答えないと以降反応しなくなるとか。
# 「山」んとこはコロコロ変わる、と。

編集 削除
質問がブレ始めてる  2012-07-27 01:14:34  No: 73496  IP: 192.*.*.*

DLL呼び出すときに引数渡さずに、呼び出し元のEXEを特定したいって
事だと思うんだけど、それだとtetrapodさんの
2012/07/26(木) 18:18:39
の提示した1番目で出来そうな気がするんだけど違うのかな?
出来るかはしらん。

編集 削除
junjun  2012-07-27 10:53:36  No: 73497  IP: 192.*.*.*

皆様、いろいろと意見ありがとうございます!

>オショウさん
  そのアイデアが難しいんですよね。。。。。orz
  もっと経験があればいいんですけどね><

>tetrapodさん
  使用すべきアプリが増えれば、その都度DLLをUpdateすればいいかと
  思っていました。(10個あれば起動時10パターン比較する感じですね。)
  作成されたアプリ自体に固有のGUIDがあると思っているのですが、
  僕の勘違いなのでしょうか???

>επιστημηさん
  最初にそれを思ったんです。
  ただ、その方法を仕様書に残す必要があると思って、、、、
  そうなると、最初の「仕様書が手元にある」を前提だと
  対応出来ると思って、、、(質問がブレ始めてるさんの通りです。。)

>質問がブレ始めてるさん
  そのアプリが持っているGUIDであれば、目に見えないから安心なのかと
  思いました。確かに、tetrapodさんの対応でも効果があるのかと
  思っています。

確かに、オショウさんの言うとおり、費用対効果なのかと思います。
セキュリティの話は、ケースをあげれば切りが無いですからね。
(出来る人は、結局なんでもできてしまうだろうし・・・・)

人によっては、決められたNetwork内でしか使用出来ないように
すればという人もいます。セキュリティを取るか利便性を取るか
ですね。。。。難しいです><


再度、どこまで必要なのか、関係者と相談してみようと思います。

編集 削除
ホウジョウウサギ  2012-07-27 12:58:17  No: 73498  IP: 192.*.*.*

>DLL 中でも GetModuleFileName() で EXE のファイル名を拾うことはできる。
→DLL側でExeファイルをバイナリリードで開いて適当な個所の値をチェックするとかできないかな?
exeビルドしなおす毎にかわってしまいそうだけど,
都度DLL作成者にexeを送ってDLLを更新してもらうという…!?

編集 削除
junjun  2012-07-27 14:42:30  No: 73499  IP: 192.*.*.*

>ホウジョウウサギさん

  新しいパターンですが、、、、、、
  なるほどって感じですね。
  Hashって手もありそうですし、、、、、、、
  そのAppがBuild時(起動時?)に自分自身のHash値(+Salt)を
  吐き出して(テキストとかバイナリとか)、その情報との一致確認
  という手もあるか、、、う〜ん・・・・・
  ちょっと、参考にして考えてみます!

  ありがとうございます!

編集 削除
junjun  2012-08-07 15:13:42  No: 73500  IP: 192.*.*.*

解決にチェックしていなかったので、チェック入れました。

ヌユノトの取得方法はわかりませんでしたが、、、、、
実行ファイルのネ化確認が、結構容易にできそうなので、
その方向で検討を進めたいと思います。


意見をくださった方々、ありがとうございました!!

編集 削除