質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Q&A

解決済

4回答

2379閲覧

実行中のexeファイルのプロセスメモリ内の欲しいデータが格納されているアドレスの探し方を教えてください。

退会済みユーザー

退会済みユーザー

総合スコア0

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

0グッド

0クリップ

投稿2018/03/20 18:19

編集2018/03/21 07:23

前提・実現したいこと

exeファイルのゲームの中のデータ(スコア等)をリアルタイムで取り出し続けたいと考えています。その際に必要となる、そのデータの保存場所となっているアドレスを見つける効率的な方法が知りたいです。

発生している問題

非常に多いプロセスメモリのデータの中から目的のアドレスを見つけ出す効率的な探索方法が見つかっていません。

試したこと

exeファイルを実行させ、プレイ中にある場面と、それよりちょっと進めた場面においてダンプファイルを作成し、stirlingを使ってそれらを比較しましたが、そもそもなぜか比較することができず(比較しても何も起こらなかったり、フリーズしてしまったり)、一度成功しましたが異なる箇所が多く調べることが困難でした。

OSはwindows10です。

どなたかご教授願います

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

スコアがスタックにあるのかヒープにあるのかわかりませんが起動する度にそのアドレスは変わるので無理です。

それよりまずダンプできていないと思います。他のプロセスのメモリ内容にアクセスするには高度な技術が必要ですが質問内容から推測してそれができるとは思えません。

バイナリエディタで比較できないのはそれらと全く無関係の話で、単にデータ量が多すぎて比較に時間がかかっているのか何かでしょう。

投稿2018/03/20 22:44

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/03/21 05:39

タスクマネージャの「ダンプファイルの作成」でdmpファイルを得たのですが、このファイルはなんのデータなのでしょうか
Zuishin

2018/03/21 06:01

C 言語を使っているとあったので自前でダンプをとっているように読みました。 タスクマネージャーのダンプなら最小ダンプだと思いますがそれだとヒープの内容まで含まれているんでしょうか? 詳しくないので私は知りません。 しかし回答にも書いたようにメモリの内容はガベージコレクションと再割り当てなどによって刻刻変化しますし、スレッドが複数あるならなおさらどのようにスタックやヒープが割り当てられているかも不定です。 ダンプを解析してそのゲームがどのようにメモリを使っているのかがわかればスコアの位置も特定できる可能性がありますが、まず法則の解析を自分でしなければならないのと、次は自分で DLL を注入して読み取るプログラムを作らなければなりません。 ここで簡単に聞いて答えが得られるような問題ではないと思います。
Zuishin

2018/03/21 06:04

問題を解決する上で最初にしなければならないのは、他のツールを使わず自分でメモリのダンプが取れるプログラムを組むことだろうと思います。 それができなければ話になりません。
退会済みユーザー

退会済みユーザー

2018/03/21 07:21

わかりづらい文章を書いてしまい申し訳ございませんでした。やはりかなり難しい問題となるのですね。ありがとうございます。
guest

0

そのプログラムのソースがあるなら、コンパイル/リンク時に生成させることのできるリストファイルやマップファイルを見れば具体的なアドレスは参照できます

それがないというなら、その分析はあなたの仕事、というはなしになりますねー

投稿2018/03/20 22:27

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「プログラミングに関係のない質問」なのではないか?と思いますが…

まぁ最大限に好意的に解釈してソースがない場合のデバッグ手法として捉えると
「デバッガ」や「プロセスメモリエディタ」といった専門のツールを利用しましょう。

効率的な方法は一種の職人技なので、長年の勘としか言えなかったり

投稿2018/03/21 06:14

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/03/21 07:36

cのタグ等は消させていただきました。今後情報の関係性をよく考えるようにします。
guest

0

ベストアンサー

c言語でのプロセスメモリの中身の一部の値の読み取り方を教えて下さい。 の続きですよね。
こちらは、プログラミングに関係あったりなかったりする回答になります。

(1)自作プログラムで他のプロセスのメモリを読むとかどうとかは置いといて、まずは「目的のデータが現在どのアドレスにあるのかを知りたい」編:

うさみみハリケーン http://www.vector.co.jp/soft/win95/prog/se375830.html https://digitaltravesia.jp/usamimihurricane/HowToUseUsaMimi.html のようなツールで検索してみましょう。他にもプロセスメモリやチート等に関するツールが色々存在します。機能や使い勝手はそれぞれ異なるでしょう。
なお、「画面上に表示されている数値と、メモリ内の数値は異なる」の場合は手間が余分にかかります。
実行中にデータのアドレスが頻繁に変化するような仕組みのEXEファイルの場合はまともに検索できないかもしれませんが、そういう物でも検索できるツールもあるかもしれません。
もしここで、目的のデータがEXE自身のモジュール領域内にあることがわかれば、自作プログラムから読むのは容易です。

(2)「他のプロセスメモリ内の欲しいデータを、自作プログラムから読みたい」編:

目的のデータをグローバル変数に持っている場合、そのプロセスのメモリ空間内では

C

1*(「EXEのベースアドレス」+「定数」)

のような感じで取得できるでしょう。
自作プログラムから取得する場合は、ReadProcessMemoryが1回必要ですね。

mallocした領域内に目的のデータを持っていて、mallocの戻り値をグローバル変数に持っている場合、そのプロセスのメモリ空間内では

C

1*(*(「EXEのベースアドレス」+「定数1)+「定数2)

のような感じで取得できるでしょう。ポインタのポインタだと思えばいいかと。
自作プログラムから取得する場合は、少なくとも初回はReadProcessMemoryが2回必要になりそうですね。

ただ実際には、EXEのベースアドレスではなくDLLのベースアドレスが基準になっている場合もありますし、ポインタのポインタのポインタのポインタの…… もっと続く場合もあるらしいです。
さらに、
・EncodePointerとDecodePointerを使ってる
・解析されにくいような細工をしている
・自分で直接メモリ領域を管理してない
等々、素直にいかない可能性もあります。私はレベルが低いので、難しそうだったら早々に諦めます。もう何年もやってないし。
目的のEXE内では勿論データを読み書きできているはずなので、レベルの高い人はどんなEXEが相手でも完璧にやってのけるのかもしれません。

(3)「グローバル変数じゃないみたいだし、ポインタのポインタの(以下略)形式か何かで取得する方法もわからないけど、それでもやっぱり自作プログラムから読みたい」編 その1:

上に挙げた(1)の方法でアドレスがわかるのであれば、そのアドレスを入力して利用するような自作プログラムでもいいかもしれません。割り切り。

(4)「グローバル変数じゃないみたいだし、ポインタのポインタの(以下略)形式か何かで取得する方法もわからないけど、それでもやっぱり自作プログラムから読みたい」編 その2:

メモリ内のデータの並び方や値の変化に特徴がある場合、例えば「プレイヤーが決めたキャラクター名とキャラ種別IDと体力と気力と体力最大値と気力最大値と空腹度が1つの構造体のような物に入ってるっぽい」ことがわかっていれば、目的のEXEのメモリ空間を検索して特徴と一致するデータのアドレスを見つけるようなプログラムを自作できるかもしれません。自作ではなく、複雑で柔軟な組み合わせ条件で検索できるツールがあれば、それを試すのもいいかもしれません。
目的のデータのアドレスを全自動で見つけられる可能性もありますが、ユーザーが何らかの情報を入力してあげないといけない可能性もあります。

投稿2018/03/21 11:29

okrt

総合スコア366

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/03/21 13:37

うさみみハリケーンなんていう便利なソフトが存在したのですね…すぐに目的のアドレスが見つかりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問