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

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

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

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

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

3009閲覧

c言語でのプロセスメモリの中身の一部の値の読み取り方を教えて下さい。

退会済みユーザー

退会済みユーザー

総合スコア0

Windows 10

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

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/03/19 13:17

編集2018/03/19 13:21

実行されている外部のexeファイルのメモリを番地を指定して値をリアルタイムで読み込むプログラムをc言語で書きたいです。

exeファイルのゲームを実行し、常にデータを取り出してプログラムに用いることが目的です。

readprocessmemory関数というものの存在は知っているのですが、使い方がよくわかりません。

OSはWindows10です。

どなたかご教授願います。

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

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

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

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

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

cateye

2018/03/19 14:11

ゲームってどんなゲームでしょう? 利用規約違反になりませんか?
退会済みユーザー

退会済みユーザー

2018/03/19 14:29

個人の方が無料で配布しているものです。利用規約には触れられていませんでしたが、この場合はメモリを読むことは良くないのでしょうか。
guest

回答1

0

ベストアンサー

ReadProcessMemory を使用しているソースの例は
http://www5.plala.or.jp/softworld/api_ReadProcessMemory.htm
http://gimite.net/bcbqtree/qtreemain.cgi?mode=thread&thread=851
この辺にあるみたいですね。まずは、プロセスのハンドルを取得する必要があります。
ちなみに、読むのはReadProcessMemoryだけではなくToolhelp32ReadProcessMemory もあります。こちらはハンドルではなくプロセスIDを指定します。私はどちらのAPIもWindows10で使ったことはありませんが、昔のWindowでは使えました。

投稿2018/03/19 14:17

okrt

総合スコア366

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

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

退会済みユーザー

退会済みユーザー

2018/03/19 14:37 編集

実行しているアプリケーションのハンドルやプロセスIDはどのように取得すればよいのでしょうか
退会済みユーザー

退会済みユーザー

2018/03/19 15:04

すみません、プロセスIDの取得はできました。
退会済みユーザー

退会済みユーザー

2018/03/19 16:34 編集

ありがとうございます。無事プロセスハンドルの取得までは行けました。 HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); DWORD dw, read; ReadProcessMemory(hProcess, 0, &dw, sizeof(DWORD), &read); そして最初から数バイトメモリを読もうと思い↑のコードを書いて実行したのですが、何故かメモリを読むことができません。(ReadProcessMemory関数から0が返ってきます…)。連続質問申し訳ないのですが、解決策を教えていただけないでしょうか。
okrt

2018/03/19 16:45

読み取り開始アドレスが0では読めないのが普通だと思います。他のEXEのプロセスメモリに限った話ではなく、自分自身のメモリも。 VirtualQueryEx https://msdn.microsoft.com/ja-jp/library/cc430218.aspx を活用すると、読めるかどうか事前にチェックできます。
退会済みユーザー

退会済みユーザー

2018/03/20 15:01 編集

詳しく教えてくださり本当にありがとうございました。
退会済みユーザー

退会済みユーザー

2018/03/20 13:25 編集

本題からは逸れてしまいますが、そもそもexeファイルからリアルタイムでデータ(現スコア等)を抜き取るのにメモリを読むという方法は最も適していると思われますか。(画面から読み取ることが不可能な情報についてです)
okrt

2018/03/20 14:00

メモリを読むのが一番確実だと思います。 「欲しいデータが格納されているアドレスはどこなんだろう?」という問題が出てくるかもしれませんが、それはまた別の話です。 あと、「画面上に表示されている数値と、メモリ内の数値は異なるかもしれない」も。
退会済みユーザー

退会済みユーザー

2018/03/20 14:43

なるほど、ありがとうございます。
退会済みユーザー

退会済みユーザー

2018/03/20 15:44

アドレスを指定するために"ベースアドレスへのポインタの取得"が必要であるようですが、その取得方法はPEB構造体を使うというのでいいのですか。ベースアドレスの取得の方法を教えていただけませんか。
okrt

2018/03/20 16:30

PEB構造体で取得することもできるかもしれませんが、私は使ったことがありません。 そのプロセスで使用中のモジュールの中にはEXEファイル自身も含まれるので、自身を示すモジュールのMODULEENTRY32構造体 https://msdn.microsoft.com/ja-jp/library/ms684225.aspx かMODULEINFO構造体 https://msdn.microsoft.com/ja-jp/library/ms684229.aspx のどちらかからベースアドレスを取得できていたと思います。(うろ覚え) PEB構造体で取得できるなら、それを使うほうが簡単かもしれません。
asm

2018/03/20 17:35 編集

EnumProcessModulesExでモジュール列挙して GetModuleBaseNameWで名前取得して対象を絞るのが正攻法 https://support.microsoft.com/ja-jp/help/175030 より EnumProcessModulesの最初の呼び出しはexeが取得できる事が担保されている(はず なので最初に取得できた奴を用いるのが手抜き実装 昔やった事なんだけど、なんでEnumProcessModulesExを使ってたのかが思い出せない… 64bitプロセスから32bitプロセス触った時に意図しない動作になったような?
退会済みユーザー

退会済みユーザー

2018/03/20 17:58 編集

お二方ともありがとうございます。 http://eternalwindows.jp/windevelop/dll/dll12.html こちらのサイト様の void EnumModule(HANDLE hProcess) { DWORD i; DWORD dwSize; TCHAR szModule[256]; HMODULE hmod[100]; MODULEINFO mi; EnumProcessModules(hProcess, hmod, sizeof(hmod), &dwSize); for (i = 0; i < dwSize / sizeof(HMODULE); i++) { GetModuleBaseName(hProcess, hmod[i], szModule, sizeof(szModule)); GetModuleInformation(hProcess, hmod[i], &mi, sizeof(MODULEINFO)); } } この部分を組み込んでみると、確かにhmod[0]にはexeファイルが、そのあとにはdllファイルがたくさん、という感じになっていました。そして、GetModuleInformation関数でmi.lpBaseOfDllにアドレスを格納できたと思います。(ちゃんと確認できてないので多分ですが…)
退会済みユーザー

退会済みユーザー

2018/03/20 18:23

それと、実は先ほどおっしゃっていた「欲しいデータが格納されているアドレスはどこなんだろう?」という問題が解決しておらず、もし解決方法をご存知でしたら新たにたてた下の質問ページで教えていただければと思います。 https://teratail.com/questions/118352
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問