• 締切済み

DLLは解読可能ですか

C言語初心者です。 目標としてVisualC++でDLLを作ろうと思っています。 DLLはコンパイルするとできると思うのですが、コンパイル前に記述しているソースは簡単にわかってしまうものでしょうか。それとも解読することは可能だけど素人ではかなり苦労するものでしょうか。 よろしくお願いします。

みんなの回答

  • ttkai00
  • ベストアンサー率58% (18/31)
回答No.3

Win32 の DLL は解読が難しいですが、.NET のマネージドDLLとなると話がまた変わってきます。 2002 以降のバージョンの Visual C++ では従来の Win32 の DLL に加えて、.NET Framework 上で動作するマネージドDLLというものを作ることができます。この場合は dll ファイルは(マシン語レベルまでコンパイルされたものではなく) MSIL という中間言語で書かれたものになります。 MSIL 自体がマシン語よりもはるかに解読しやすい上、Reflector のようなツールを使って、ソースをかなり忠実に再現することができます。コンパイラにより最適化された部分やコメントはもちろん見えませんが、それでもロジックは丸見えになると思った方がよいです。 http://www.atmarkit.co.jp/fdotnet/tools/dotfuscator/dotfuscator_02.html 上記ページで紹介されている難読化ツールのようなものを使って対処することになると思います。 もちろん、2002以降のバージョンでも、Win32 の DLL を作ることは可能なので、どうしても解読されたくない場合は、そちらを使うという選択肢もあるかと思います。

noname#82346
noname#82346
回答No.2

リバースエンジニアリングの分野(別にプロテクト外しとかそういうアンダーグラウンドな意味ではなく)では、実行コードを C 風な擬似コードに戻すことが出来るソフトなども学術的には開発されています。しかし、最新のコンパイラによって最適化された複雑なコードを満足のいくように元に戻せるものはまだないようです。 ソースレベルではなくアセンブリ言語レベルへの復元ならば、C/C++ ランタイムライブラリや Windows API コールなどを認識して可読性の高い逆アセンブルリストを生成できる IDA という製品があります。 ちなみに、DLL 全体を解読するのは大変ですが、apricot111 さんが保護したいと考えているコードがごく一部であるなら、その内容によっては、アセンブリ言語を知っているそこそこの技術者なら該当部分をわりと簡単に解読できる可能性はあります。 いずれにしても、「素人」というのがプログラミングの素人を意味するのであれば、実行コードの解読は事実上無理と言っても良いでしょう。

apricot111
質問者

お礼

初心者の私にとってはとても難易度が高いお話でした^^; ご回答ありがとうございます。

  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.1

変数名などの情報は残らないので、ソースそのものはわかりませんが、解読は可能なので、ロジックはわかります。ただ、復元はかなり大変で、しかもそこから意味をくみ取るのも大変です。その手間を掛けるだけの内容でない限り、誰も読もうとはしないでしょう。 1MBのDLLがあるとして、100万円くれると言われてもしません。1億ならします。

apricot111
質問者

お礼

そのくらい手間がかかるものなのですね^^; あるCベースの言語があり、それは解読用のソフトがあって解読可能なんです。 ただしDLLも使えるのでコアロジックをDLLで書けば問題ないかなと考えました。 的確な回答ありがとうございます。

関連するQ&A

  • exeファイルはどのdllを参照すべきか、知っているのでしょうか。

    dllとは、プログラムが実行時に参照するものですよね。 よく使われる機能があらかじめ作られているものですよね。 私はC言語しか知らないので、C言語でプログラミングすることで話を進めさせてください。 (とは言っても、ごく初歩的なプログラムが組めるだけの素人です。) OSはWindowsということにします。 C言語は、関数の集まりでソースが書かれています。 dllも、中身に関数の実体が記述されている、そういうイメージでしょうか。 私がもっと勉強して、複雑なプログラムを組んだりすると、 「あ、これはdllに実体がある機能だから、いちいち実装を書かなくてもいいんだな」 と考えて、ソースファイル( ~.c )の中でその関数を使うだろうと思います。 私がよくわからないのはここからです。 dllにある関数をソースで使って、無事コンパイルして、さあリンクしてexeを作りましょう、 というときに、リンカ(リンクを行うプログラム)は、 「そんな関数、実体がないぞ」 って文句を言ってこないのでしょうか。 いや、リンカは、dllに実体がある関数だということを知っているはず。 でもそれって、いちいち 「この関数はどこどこにある ○○.dll というdllに書いてあります」 というふうに、リンカに教えてあげなくてはいけないのでしょうか。 (それってまさか、ソースに書くわけじゃないですよね? ) それから、 exeファイルっていうのは「この機能はdllに行わせる機能だ」ということを知っているのでしょうか。 dllに行わせる機能だということを知っているとしても、 どのディレクトリにある なんと言う名のdllに その機能が書かれていることまで知っているのでしょうか。 (でもそこまで知っていたら逆に、ディレクトリ構成の違うマシンでは実行できなくなってしまうし。) そういうような原理的なことを教えてください。

  • [c++]#using "user32.dll"でエラー

    VC++ 2008 Express Editionを使用しています。 ソースコード上に#using "user32.dll"を記述したところ 「 fatal error C1113: #using が 'c:\windows\servicepackfiles\i386\user32.dll' で失敗しました。」というエラーが出てしまいコンパイルできません。#using <mscorlib.dll>を記述した場合はコンパイルできます。 どうしたら#using "user32.dll"を使えるようになりますか?なおuser32.dllはちゃんと存在します。

  • DLLはどうやって動作するのか?

    DLLというのはライブラリですよね。 ということはDLL単体では何も動きませんよね? C言語とかでいうとコンパイルしてできた実行ファイルに利用されてはじめて動作するということですか? どうやって動作するのかがイマイチわかりません。

  • EXEを起動するとDLLが見つからないエラー

    VC超初心者です。 あるベンダ提供のdllとヘッダファイル、libファイルすべてそろっています。 DLLを使用するにあたって、宣言を記述せずにlibファイルをインポートしました。 どうにかこうにかコーディングをしました。VisualC++でソースを開いて実行(F5)すると正常に動きました。 しかし、いざEXEファイルを作ってそれを実行すると「DLLが見つかりません」というエラーが出ます。 これはどうすれば回避できますか?

  • DLLとプロジェクト

     過去に質問していたらすいません。 DLLは複数のアプリケーションをマルチタスクで活用するソースプログラムだと認識しているのですが、まちっがていたら指摘してください。  DLLのプログラムの書き方がわからないので、参考になるページを教えてもらえないでしょうか。言語はC言語です。DLLをC言語で書くのかもわからないので。。  プロジェクトの概念があまりわからないので、そちらの方も参考になるページまたは「かきこ」よろしくお願いします。  

  • C++のdllの作り方を教えてください。

    こんにちは。 先週、「UNIXのC++で共通クラスを作りたい。」って言う質問をした orange_pieと申します。 そのバージョンアップ質問として、作成した共通クラスをDLLにして みんなに提供したいのですが、コンパイルはアーカイブを作る時と どう違うのでしょうか? ちなみに、コンパイルした後でarコマンドを使ってアーカイブを作っていました。 % gcc -c aaa.cpp % ar -r libaaa.a aaa.o dllを作るには、ヘッダーファイルの記述に何か特別なものが必要ですか? また、できあがったdllを使う側では、ヘッダーファイルをインクルードして LIBパスの通ったところにdllを入れておけば良いのでしょうか? どなたか教えてください。

  • VBのBooleanはCではどんな方でしょうか? DLL

    元々、VB6のソースをCに書き直している最中ですが、 VBでintegerは Cではshortでよいのですが、VBでBooleanはCではどのように記述したらよいのでしょうか? 確かCは真が-1で偽が0だったと思いますが、それならば shortで定義して・・・ でうまくいくのでしょうか? VBから呼び出すCの関数のDLLを書いた事のある方、教えていただけますか? また、今の時代、DLLは古いでしょうか? だいぶ前のソースをいじくっております。

  • VisualBasic6.0からVisualC++で作成したDLLを呼

    VisualBasic6.0からVisualC++で作成したDLLを呼び出す、簡単なプログラムの仕方を教えてください。 初心者ですが、VisualBasic6.0からVisualC++で作成したDLLを呼び出す簡単なプログラムの仕方、または、サンプル等がありましたらどうぞ宜しくお願いいたします。初心者なので、可能な限り、簡単なプログラムのサンプルがあったら嬉しいです。

  • CのDLLをVC++でコンパイルしたいのですが、エラーになってしまいます。

    c言語の初心者なのですが、質問させて下さい。 javaからCのDLLを呼び出したく、 (下記のソースを書いたのですが、VC++でコンパイルすると LIBCD.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です Debug/HelloWorld.exe : fatal error LNK1120: 外部参照 1 が未解決です。 と出てしまいます。 過去ログ等を見て、作成しているプロジェクトが悪いのかなと思い、 MFC appWizark(dll) win32 Application win32 Console Application win32 Dynamic-Link Library 等を作ってみてコンパイルしてみたのですが、駄目でした。 ちなみにDOSプロンプトで cl -IC:\j2sdk1.4.2_10\include\win32 -LD HelloWorl d.c -o HelloWorld.dll と実行するときちんとコンパイルできて、正常に実行も出来ました。 VC++でどうやればコンパイルできるのでしょうか? #include "HelloWorld.h" JNIEXPORT void JNICALL Java_HelloWorld_printMessage (JNIEnv *env, jobject me) { printf("Helo World!!!\n"); return; }

  • AccessVBAからC言語のDLLの呼び出し方

    初心者です。はじめまして お世話になります。 概要:C言語で作成したDLLをVBAで呼び出す。 タイトルの通り、C言語で作成したDLLをVBAで呼び出したいのですが、うまく 呼び出すことができず、「エラー番号:49 DLLを正しく呼び出せません。」 というエラーが返ってきてしまいます。 DLLの作成手順もしくはDLLの呼び出し方でおかしな所があればご指摘頂けない でしょうか? C言語のDLL、作成手順は以下の通りです。 DLL作成環境:Visual C++ 6.0 DLL作成手順----------------------------------------- (1)プロジェクトをDLL用に作る  新規作成→プロジェクト→Win32 Dynamic-Link Library→空のDLLプロジェ クト (2)ファイル追加  ソースファイル+すべてのヘッダファイルを追加 (3)DLLを出力対象の関数に「_declspec(dllexport)」をつける 例)------------------------------------- _declspec(dllexport) short dlltest (char *str1, char *str2) --------------------------------------- (4)char を unsigned char へ変換する(/J コンパイルオプション) (5)プロジェクトをデバッグモードからリリースモードに切り替える (6)ビルド実行 (7)「Release」配下に.dllとlibができる。 -作成手順完----------------------------------------------------- 実際のVBAのDLLの呼び出しは以下の通り行っています。 -AccessVBAにてDLLの宣言及び、呼び出し------------------- '呼び出し宣言 Public Declare Function dlltest _ Lib "C:\Project\Dlltest\Release\dlltest.dll" _ (ByVal st1 As String, _ ByVal st2 As String) As Integer 'DLL呼び出し KEKKA = dlltest(string1, string2) -呼び出し完------------------------------------------------ これで実行するとエラーが返されていまいます。 なにぶん、初心者で今回初めてVBAでのプログラミングを行っているので観点 の抜けなどが多分にあると思われます。 どんな小さなことでもご指摘頂けないでしょうか? 宜しくお願い致します。

専門家に質問してみよう