プロが教えるわが家の防犯対策術!

こんにちは

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

よろしくお願いします

A 回答 (7件)

成り行き上の固定だと思うのでマイクロソフトが公式に認めるとも思えません。


アマチュアレベルならともかくプロがやるのはダメですよ。

「APIを自分で呼びだそう! - 桜花な日々」
http://d.hatena.ne.jp/rofi/20101229/1293657061
「リバースエンジニアリング入門(4):Undocumentedなデータ構造体を知る (2/3) - @IT」
http://www.atmarkit.co.jp/ait/articles/1111/18/n …
下の方法を使ったほうが良いと思います。
    • good
    • 0
この回答へのお礼

何度もありがとうございました

成り行きで固定だとわかったのですね・・・
勉強になります
さっそく調べてみます

お礼日時:2013/05/24 11:54

DLLが実際にプロセス空間にロードされる際には、DLLファイルに設定されているベースアドレスの位置にロードされる保証はありません。


が、WindowsOSの根幹に関わるDLLについてはベースアドレスが重複しないように設定されているようなので、DLLが更新されなければ概ね同じ位置にロードされるでしょう。
# 重複していて再配置する場合にそこそこコストがあるので…。

んで……
WindowsUpdateなどでDLLが更新されたら、そのアドレスは別のものになったりしますがそこら辺は問題ないんですか?
そういった問題にハマらない為にGetProcAddress()等で取得できる手段が用意されているのですが……。


何故にそんな情報が必要なのか?
とか掲示されれば、もう少し安全な別の方法とかが出てくるかも知れませんけど……。
ドライバ作成やデバッグでもするんですか?
# それならDDKですかねぇ。
    • good
    • 0
この回答へのお礼

回答ありがとうございました

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

お礼日時:2013/05/24 12:08

とにかく情報が欲しいようですが、


APIのアドレスのリストを作って公開しているようなサイト・ドキュメントは残念ながら無いと思います。

#1や#5で述べられているように、
ツールを探すか自作するかして、自分で動かして調べるしか方法はないのでは?
解析っぽいことがしたいのであれば自分でできるようになりましょう。
    • good
    • 0
この回答へのお礼

ありがとうございました

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

お礼日時:2013/05/24 12:00

前のリンク先にも示した通り、CreateFileがあるkernel32.dllなどは環境を限定すればアドレスが固定されているとは思います。

Windows2000で日本語だけに限定等。
ただ、その条件から外れるとアドレスが変わってしまう程度の危ういものです。
なので、想定する条件を絞り込めるのかが問題となります。

と言うことで、Windows2000で日本語だけってことなら出来るものもありますと言えると思いますが、それで良いのでしょうか?
    • good
    • 0
この回答へのお礼

何度もありがとうございます

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

お礼日時:2013/05/24 10:35

何がしたいかがよく見えてこないので概要だけ。




具体的なツール名は挙げませんが、プロセスメモリエディタやデバッガを使うと
どこに何があるかを簡単に調べることができます。
(内部でGetProcAddressを呼んでいるだけですが)

が、DLLのベースアドレスは実行環境・実行タイミングによって変わるため、
基本的に「このアドレスには必ずこのAPIがある」ということは保証できません。
(コンパイル時のオプションでベースアドレスが固定されている場合もあります)
    • good
    • 0
この回答へのお礼

回答ありがとうございます
わかりにくくなって失礼致しました

>「このアドレスには必ずこの API がある」ということは保証できません

保証されている部分というのがあると思います
その部分の情報を手に入れたいということです

よろしくお願いします

お礼日時:2013/05/24 09:13

小生の場合は全てのドライブをデスクトップに表示させています。


マイコンピーターも,コントロールパネルもデスクトップにアイコンを置いています。
マイコンピューターを開いて,全てのドライブについて順次右クリックして「アイコンを作成」を選択します。
アイコンをダブルクリックすれば,記憶装置内のフォルダーが一覧できます。
    • good
    • 0
この回答へのお礼

回答ありがとうございます

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

お礼日時:2013/05/24 08:42

XPまでならuser32.dll/kernel32.dll/ntdll.dllに限り、アドレス値をハードコーティングでも大丈夫かなと。


(妥当かは別にして)

GetModuleHandle/GetProcAddressで、自力で調べるしかないのでは。
# 調査はC/C++の方が楽そうだけど
    • good
    • 0
この回答へのお礼

回答ありがとうございます

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

お礼日時:2013/05/24 08:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!