
前提・実現したいこと
exeファイルのゲームの中のデータ(スコア等)をリアルタイムで取り出し続けたいと考えています。その際に必要となる、そのデータの保存場所となっているアドレスを見つける効率的な方法が知りたいです。
発生している問題
非常に多いプロセスメモリのデータの中から目的のアドレスを見つけ出す効率的な探索方法が見つかっていません。
試したこと
exeファイルを実行させ、プレイ中にある場面と、それよりちょっと進めた場面においてダンプファイルを作成し、stirlingを使ってそれらを比較しましたが、そもそもなぜか比較することができず(比較しても何も起こらなかったり、フリーズしてしまったり)、一度成功しましたが異なる箇所が多く調べることが困難でした。
OSはwindows10です。
どなたかご教授願います
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答4件
0
スコアがスタックにあるのかヒープにあるのかわかりませんが起動する度にそのアドレスは変わるので無理です。
それよりまずダンプできていないと思います。他のプロセスのメモリ内容にアクセスするには高度な技術が必要ですが質問内容から推測してそれができるとは思えません。
バイナリエディタで比較できないのはそれらと全く無関係の話で、単にデータ量が多すぎて比較に時間がかかっているのか何かでしょう。
投稿2018/03/20 22:44
総合スコア28673
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
総合スコア366
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2018/03/21 13:37

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/03/21 05:39
2018/03/21 06:01
2018/03/21 06:04
退会済みユーザー
2018/03/21 07:21