• 締切済み

関数の引数を知るには?

実行ファイルからあるDLLが呼び出されているのですが、 そのDLLの関数を呼び出す際にどんな引数を使っているか 知りたいのですが、どうすればよろしいでしょうか? (ちなみにDLLはWindowsのものではありません)

みんなの回答

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>私はできない理由をお聞きしているのではなく、やる方法 >(手段とそれに必要な知識・時間など)をお聞きしたいのです。 >それと、私がもし使うことによる責任を負っているのだとすれば、 >同時に使わないことによる責任も負うことにもなりますので、 >その点はご勘案頂いた上でご回答頂けると嬉しいです。 かなり無茶を言っていますね。 私があなたの立場であれば、間違いなく使わせません。 同機能の別のモジュールを探す、もしくは新規で開発させます。 使えるかどうかも分からないようなシロモノで動かせ!と部下に命令しているようなものですから。 また、関数の引数を調べるのに固執しているようですが、 ライブラリを使うのに関数の引数だけ分かっても無理ですよ。 引数の意味、関数の呼び出し順序、関数の呼び出し方(呼び出し規約)、フラグ等に使用される定数値、戻り値の意味など、引数のほかにも必要な情報はたくさんあります。 >私はプログラムにはそれほど詳しくはないので恐縮ですが、 ライブラリを使用するにあたって最低限必要なものくらい知っていないと問題があります。 DLL、LIB、ヘッダー、仕様書。 これらは必須です。 あとは、動作保証。これがないライブラリなんて怖くて使えません。 それほどまでに利用したいのであれば、なぜライブラリの提供者に確認を取らないのですか? >例えば逆アセンブルやメッセージの取得など、 >いくつか実現するための手段はあるはずです。 逆アセンブルなら分かるんじゃないでしょうかね? やったことないんで分かりません。というか、私はアセンブラわかりません。 関数呼び出し時に引数をスタックに積むところや、関数側での引数の取り出しのところを見れば出来そうな気はしますけど。 ただし、逆アセンブルすることをライブラリの作成者によって許されていないとだめですけどね。 メッセージの取得というのは私にはわかりません。 >いくら引数の型の見分けがつかないといっても、 >ある程度統一されたフォーマットで作成しているはずですから、 >他の関数からの類推は可能だと思っております。 すごい自身をお持ちですね。 構造体が使われていないことを祈りましょう。 あと、特別な意味を持った定数も。 一応参考になるかと思われるページです。 引数の調べ方ではなく、関数のコールの仕方です。 Googleのキャッシュですが。 http://216.239.39.100/search?q=cache:aFX38tbwXnMC:www.geocities.co.jp/SiliconValley-Cupertino/5873/special/2001_10_11/page10.html+%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF+%E9%96%A2%E6%95%B0+%E5%BC%95%E6%95%B0+%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%A9+dll&hl=ja&lr=lang_ja&ie=UTF-8

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>件のEXEファイル・DLLは仕様書もソースファイルもなく、 >半ばブラックボックス化しております。 >関数名とそれがどのような機能を持っているかに >ついては大体分かっているのですが、 >それ以上の細かい仕様については見当がつきません。 それは”使えない”と言っているようなものですが・・・ 引数は、DLL内の関数を使うにあたって最低限必要な情報です。 ヘッダファイルすら存在しないものは論外だと思います。 それに、そんな使い方をして誰が動作の保証をするのでしょう?使ってしまったあなたということになりません? >また、もし直接DLLをいじる等してわかったとしても、引数の個数、それぞれのデータサイズくらいまでしかわからないでしょう。 これの意味を誤解されているようで。 データサイズまでしかわからない(分かったとしても)というところに大きな問題があります。 たとえば、32bitのDLLでは、LONG型は32bit、LONG * も32ビット、ハンドル値も32bit、構造体のアドレスも32bitです。つまり、区別がつかないということです。 仮に調べられたとしても、32bitのデータサイズの引数が3つということがわかってもどうしようもないですよね。

take_777
質問者

補足

私はできない理由をお聞きしているのではなく、やる方法 (手段とそれに必要な知識・時間など)をお聞きしたいのです。 それと、私がもし使うことによる責任を負っているのだとすれば、 同時に使わないことによる責任も負うことにもなりますので、 その点はご勘案頂いた上でご回答頂けると嬉しいです。 私はプログラムにはそれほど詳しくはないので恐縮ですが、 例えば逆アセンブルやメッセージの取得など、 いくつか実現するための手段はあるはずです。 また、「全く見当がつかない」というのは少々語弊がありまして、 引数が分かっている関数もある程度あります。 いくら引数の型の見分けがつかないといっても、 ある程度統一されたフォーマットで作成しているはずですから、 他の関数からの類推は可能だと思っております。 説明不足の点もあり大変申し訳ございませんでしたが、 ご教示のほどどうぞよろしくお願いします。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

ヘッダーファイルやドキュメントはないのですか? VC++付属のDUMPBIN.EXEや、Dependency WalkerでEXPORTSされている関数名の一覧は簡単にわかりますが。 引数の内容は、ちょっとやそっとではわかりません。 また、もし直接DLLをいじる等してわかったとしても、引数の個数、それぞれのデータサイズくらいまでしかわからないでしょう。

take_777
質問者

補足

ご回答ありがとうございます。 件のEXEファイル・DLLは仕様書もソースファイルもなく、 半ばブラックボックス化しております。 関数名とそれがどのような機能を持っているかに ついては大体分かっているのですが、 それ以上の細かい仕様については見当がつきません。 DLLをいじるには、どうすればよろしいのでしょうか?