• ベストアンサー

めメモリアドレスについて

こんにちは メモリアドレスが指す内容を調べるにはどんな方法がありますか 追跡はできます そうではなくて例えば、特定のメモリアドレスが特定の API を指すといったような情報はどうやって調べるのでしょうか よろしくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.5

成り行き上の固定だと思うのでマイクロソフトが公式に認めるとも思えません。 アマチュアレベルならともかくプロがやるのはダメですよ。 「APIを自分で呼びだそう! - 桜花な日々」 http://d.hatena.ne.jp/rofi/20101229/1293657061 「リバースエンジニアリング入門(4):Undocumentedなデータ構造体を知る (2/3) - @IT」 http://www.atmarkit.co.jp/ait/articles/1111/18/news146_2.html 下の方法を使ったほうが良いと思います。

noname#180000
質問者

お礼

何度もありがとうございました 成り行きで固定だとわかったのですね・・・ 勉強になります さっそく調べてみます

その他の回答 (6)

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.7

DLLが実際にプロセス空間にロードされる際には、DLLファイルに設定されているベースアドレスの位置にロードされる保証はありません。 が、WindowsOSの根幹に関わるDLLについてはベースアドレスが重複しないように設定されているようなので、DLLが更新されなければ概ね同じ位置にロードされるでしょう。 # 重複していて再配置する場合にそこそこコストがあるので…。 んで…… WindowsUpdateなどでDLLが更新されたら、そのアドレスは別のものになったりしますがそこら辺は問題ないんですか? そういった問題にハマらない為にGetProcAddress()等で取得できる手段が用意されているのですが……。 何故にそんな情報が必要なのか? とか掲示されれば、もう少し安全な別の方法とかが出てくるかも知れませんけど……。 ドライバ作成やデバッグでもするんですか? # それならDDKですかねぇ。

noname#180000
質問者

お礼

回答ありがとうございました DLL を詳しく知らないので、今勉強している真っ最中です 目的はデバッグで、情報が固定しているメモリアドレスがわかれば、だいぶ楽になるというものでした たくさん情報いただいたので、勉強してみます

  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.6

とにかく情報が欲しいようですが、 APIのアドレスのリストを作って公開しているようなサイト・ドキュメントは残念ながら無いと思います。 #1や#5で述べられているように、 ツールを探すか自作するかして、自分で動かして調べるしか方法はないのでは? 解析っぽいことがしたいのであれば自分でできるようになりましょう。

noname#180000
質問者

お礼

ありがとうございました やっぱり自分で動かして調べるしかないみたいですね・・・ たいへん勉強になりました

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.4

前のリンク先にも示した通り、CreateFileがあるkernel32.dllなどは環境を限定すればアドレスが固定されているとは思います。Windows2000で日本語だけに限定等。 ただ、その条件から外れるとアドレスが変わってしまう程度の危ういものです。 なので、想定する条件を絞り込めるのかが問題となります。 と言うことで、Windows2000で日本語だけってことなら出来るものもありますと言えると思いますが、それで良いのでしょうか?

noname#180000
質問者

お礼

何度もありがとうございます それでよいです 想定する条件は絞り込めるようです その場合、そういった保証されている部分の情報はどこから入手するのでしょうか

  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.3

何がしたいかがよく見えてこないので概要だけ。 具体的なツール名は挙げませんが、プロセスメモリエディタやデバッガを使うと どこに何があるかを簡単に調べることができます。 (内部でGetProcAddressを呼んでいるだけですが) が、DLLのベースアドレスは実行環境・実行タイミングによって変わるため、 基本的に「このアドレスには必ずこのAPIがある」ということは保証できません。 (コンパイル時のオプションでベースアドレスが固定されている場合もあります)

noname#180000
質問者

お礼

回答ありがとうございます わかりにくくなって失礼致しました >「このアドレスには必ずこの API がある」ということは保証できません 保証されている部分というのがあると思います その部分の情報を手に入れたいということです よろしくお願いします

回答No.2

小生の場合は全てのドライブをデスクトップに表示させています。 マイコンピーターも,コントロールパネルもデスクトップにアイコンを置いています。 マイコンピューターを開いて,全てのドライブについて順次右クリックして「アイコンを作成」を選択します。 アイコンをダブルクリックすれば,記憶装置内のフォルダーが一覧できます。

noname#180000
質問者

お礼

回答ありがとうございます フォルダを一覧させる方法でしょうか・・・ ちょっとよくわかりませんが、さっそく調べてみます

  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.1

XPまでならuser32.dll/kernel32.dll/ntdll.dllに限り、アドレス値をハードコーティングでも大丈夫かなと。 (妥当かは別にして) GetModuleHandle/GetProcAddressで、自力で調べるしかないのでは。 # 調査はC/C++の方が楽そうだけど

noname#180000
質問者

お礼

回答ありがとうございます 追跡やコーディングの方法ではなくて、例えば Windows2000 で 0x77e62b8d は CreateFile という API を指します(CreateFile は DLL なので、アドレスは固定ではないと指摘をいただきましたが) このような情報はどこから入手するのでしょうか

関連するQ&A