C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: DLLの公開メソッドを確認する方法


(過去ログ 53 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■28928 / inTopicNo.1)  DLLの公開メソッドを確認する方法
  
□投稿者/ 困った人 (1回)-(2008/12/02(Tue) 19:25:34)

分類:[その他の言語] 

お世話になります。

タイトル通り、DLLで公開されてるメソッドを確認したいのですが、
そういうことはできるのでしょうか?

ちなみに、言語は何で作成されているのか分かりません。

既存システムの調査をしているのですが、
何の言語で作られているのか、そのDLLがどのような機能をもってるか、
ドキュメントもなければ、当時の方たちもいません。

どなたか存じ上げる方いらっしゃいますでしょうか?
引用返信 編集キー/
■28934 / inTopicNo.2)  Re[1]: DLLの公開メソッドを確認する方法
□投稿者/ 774RR (247回)-(2008/12/02(Tue) 19:49:05)
確認とは何を意図しているわけ?
たとえば hoge.dll 中にある EXPORT 関数名を調べるくらいなら dumpbin /exports hoge.dll

これで存在が確認できた関数 _hoge@8 があったとして、
それがどんな引数を持ちどんな機能を持ち、なんてのは調べようが無いよ。
逆アセンブルでもして追いかける?そんな暇あったら作り直したほうがいいな、きっと
引用返信 編集キー/
■28935 / inTopicNo.3)  Re[1]: DLLの公開メソッドを確認する方法
□投稿者/ aetos (22回)-(2008/12/02(Tue) 20:01:49)
No28928 (困った人 さん) に返信
> お世話になります。
>
> タイトル通り、DLLで公開されてるメソッドを確認したいのですが、
> そういうことはできるのでしょうか?
>
> ちなみに、言語は何で作成されているのか分かりません。
>
> 既存システムの調査をしているのですが、
> 何の言語で作られているのか、そのDLLがどのような機能をもってるか、
> ドキュメントもなければ、当時の方たちもいません。
>
> どなたか存じ上げる方いらっしゃいますでしょうか?

DLL にもいくつか種類がありまして。

C++ で作られた一般的な DLL なら、774RR さんのおっしゃる DumpBin とか、Dependency Walker といったツールで確認できます。

C++ で作られたものでも COM とかだと、関数は 4 つくらいしかないんですが、COM インターフェイスをいくつも公開している場合があります。
この場合だと、DLL だけから、どんなインターフェイスのどんなメソッドがあるのかを突き止めることは困難です。

また、.NET のアセンブリというケースもあって、この場合ならばリフレクションで調査することができるでしょう。

どのパターンなのか突き止めるためには、まず最初の DumpBin なり Dependency Walker なりで開いてみることです。
・DllGetClassObject とか DllCanUnloadNow といった関数があれば COM のパターン。DLL だけではどんな機能があるか突き止めるのは困難です。
・mscoree.dll にリンクしていれば、十中八九 .NET のアセンブリ。この場合はリフレクションで。
・そのいずれでもなければ、一般的な DLL のパターン。この場合は、Dumpbin 等でそのまま関数名を見ることができます。

ただ、わかるのはせいぜい関数名か引数情報程度で、それがどんな機能なのかは、ドキュメントがないのならば推測するしかありません。
引用返信 編集キー/
■28941 / inTopicNo.4)  Re[2]: DLLの公開メソッドを確認する方法
□投稿者/ 渋木宏明(ひどり) (970回)-(2008/12/02(Tue) 21:04:09)
渋木宏明(ひどり) さんの Web サイト
> C++ で作られたものでも COM とかだと、関数は 4 つくらいしかないんですが、COM インターフェイスをいくつも公開している場合があります。
> この場合だと、DLL だけから、どんなインターフェイスのどんなメソッドがあるのかを突き止めることは困難です。

タイプライブラリがリソースに含められている場合もあります。

引用返信 編集キー/
■28942 / inTopicNo.5)  Re[3]: DLLの公開メソッドを確認する方法
□投稿者/ 魔界の仮面弁士 (923回)-(2008/12/02(Tue) 21:11:41)
No28941 (渋木宏明(ひどり) さん) に返信
>>C++ で作られたものでも COM とかだと、関数は 4 つくらいしかないんですが、COM インターフェイスをいくつも公開している場合があります。
>>この場合だと、DLL だけから、どんなインターフェイスのどんなメソッドがあるのかを突き止めることは困難です。
> タイプライブラリがリソースに含められている場合もあります。

タイプライブラリがあるなら、OLEVIEW.EXE あたりで確認できるかも。
引用返信 編集キー/
■28954 / inTopicNo.6)  Re[4]: DLLの公開メソッドを確認する方法
□投稿者/ Azulean (236回)-(2008/12/02(Tue) 23:28:52)
いずれにせよ、ドキュメントがなく、作った人も居ないのであれば再利用はなるべく避けた方が良いと思います。
無闇に流用すると、開発後半や世に出てから予期しないバグとか出てくるかもしれません。

例えば、当時の人しか知らない引数の特殊な意味づけとか、あるパターンでは別の関数を使用しなければならないとか。

リスクが高くても、それを容認して実装しなければならない事情があるのであれば、仕方ないかもしれませんが。。。
引用返信 編集キー/
■29023 / inTopicNo.7)  Re[5]: DLLの公開メソッドを確認する方法
□投稿者/ 困った人 (2回)-(2008/12/03(Wed) 13:18:18)
遅くなって申し訳ございません。
皆様ご返事ありがとうございます。

> どのパターンなのか突き止めるためには、まず最初の DumpBin なり Dependency Walker なりで開いてみることです。
なるほど、このような方法があったのですね。勉強になります。

ということで、早速DumpBinを実行すると、

ordinal hint RVA name

1 0 0000663A DllCanUnloadNow
2 1 0000660E DllGetClassObject
3 2 00006624 DllRegisterServer
4 3 000065F8 DllUnregisterServer

と表示され、
Dependency Walkerで内部を閲覧すると、system32のDLLしかぶら下がってませんでした。
となると、DLLの仕様を導き出すというのは不可能なことだという事実も
立証できたように思えます。

内部が不明なDLLを使わない方がよいと我々も考えておりますが、
¥の関係もあり、顧客を説得できなかったので、困惑しておりました。

しかし、これで説得できる材料が揃ったと思いますので、
不明なDLLの仕様から再設計するように持っていきたいと思います。

貴重な時間をありがとうございました。

解決済み
引用返信 編集キー/
■29028 / inTopicNo.8)  Re[6]: DLLの公開メソッドを確認する方法
□投稿者/ 魔界の仮面弁士 (931回)-(2008/12/03(Wed) 13:47:04)
No29023 (困った人 さん) に返信
> 1 0 0000663A DllCanUnloadNow
> 2 1 0000660E DllGetClassObject
> 3 2 00006624 DllRegisterServer
> 4 3 000065F8 DllUnregisterServer

どうやら、ActiveX の DLL みたいですね。
OLEVIEW.EXE から、タイプライブラリとして開く事はできますか?

運が良ければ、VB や Microsoft Office 等から「参照設定」して、
オブジェクト ブラウザにて、内容を一覧できるかも知れません。


> しかし、これで説得できる材料が揃ったと思いますので、
> 不明なDLLの仕様から再設計するように持っていきたいと思います。

その方が無難でしょうね。
解決済み
引用返信 編集キー/
■29359 / inTopicNo.9)  Re[7]: DLLの公開メソッドを確認する方法
□投稿者/ 困った人 (3回)-(2008/12/08(Mon) 19:20:35)
No29028 (魔界の仮面弁士 さん) に返信

非常にご返信が遅くなって申し訳ございません。

> どうやら、ActiveX の DLL みたいですね。
> OLEVIEW.EXE から、タイプライブラリとして開く事はできますか?
おぉ!オブジェクトブラウザにて、メンバが閲覧できました。

ある程度想定できる名前のメンバはよいとして、
その中の引数で「s0」「s1」「s2」「s3」・・・
意味が分からない引数名がズラズラズラ・・・

しかし、顧客への説得もできましたので、
再設計からという話に持って行けたのでほっとしています。

貴重な知識をありがとうございました。
解決済み
引用返信 編集キー/
■29362 / inTopicNo.10)  Re[8]: DLLの公開メソッドを確認する方法
□投稿者/ Jitta on the way (240回)-(2008/12/08(Mon) 20:45:50)
No29359 (困った人 さん) に返信

> しかし、顧客への説得もできましたので、
> 再設計からという話に持って行けたのでほっとしています。
>

「こういう時のための、ドキュメント作成」を別枠で貰ってしまえばいいと思います。
(いや、冗談だけど。)
(賢い客なら、含めろと言ってくる。言ってこなければ、提案してみてもいいと思う。)
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -