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

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

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

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

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

335閲覧

プロセスのメモリ検索の質問です

masayukasina

総合スコア11

C

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

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/06/14 01:10

前提・実現したいこと

下記はソースの1部分なんですが、あるプロセスのメモリを検索しています。00000000~7FFFFFFFまでを検索しているのですが7FFFFFFFを9FFFFFFFまでに増やしたいです、単純に終了アドレスを9FFFFFFFにしても検索してくれないですが何故でしょうか?

発生している問題・エラーメッセージ

7FFFFFFF以上を検索してくれません

該当のソースコード

c++ UINT search_1(HANDLE hProcess, unsigned char bytecode[], int n, UINT and1, int intAnd1, UINT and2, int intAnd2) { TNtReadVirtualMemory pfnNtReadVirtualMemory = NULL; pfnNtReadVirtualMemory = (TNtReadVirtualMemory)GetProcAddress(GetModuleHandle(_T("ntdll.dll")), "NtReadVirtualMemory"); TNtWriteVirtualMemory pfnNtWriteVirtualMemory = NULL; pfnNtWriteVirtualMemory = (TNtWriteVirtualMemory)GetProcAddress(GetModuleHandle(_T("ntdll.dll")), "NtWriteVirtualMemory"); MEMORY_BASIC_INFORMATION mBI; // サーチ開始アドレス UINT start = 0x00000000; // サーチ終了アドレス UINT end = 0x7FFFFFFF; int a = 0; int b = 0; __int64 b_0 = 0; __int64 b_1 = 0; __int64 b_2 = 0; __int64 b_3 = 0; __int64 b_4 = 0; __int64 b_5 = 0; int r_11 = 11; int r_8 = 8; int addr1 = 0; int addr2 = 0; int addr2_0 = 0; int addr2_1 = 0; int addr2_2 = 0; int addr2_3 = 0; int addr2_4 = 0; int addr2_5 = 0; int intActionCnt = 0; while (start < end) { SIZE_T size = VirtualQueryEx(hProcess, (void*)start, &mBI, sizeof(MEMORY_BASIC_INFORMATION)); if (size == 0) { std::cout << "error" << std::endl; break; } if ((mBI.State == MEM_COMMIT) && (mBI.Type == MEM_PRIVATE) && (mBI.Protect == PAGE_READWRITE) && (mBI.Type != MEM_IMAGE)) { UINT start2, end2; start2 = start; end2 = start2 + mBI.RegionSize; int p; CHAR *MemoryBuff = new CHAR[4096]; while (start2 <= end2) { pfnNtReadVirtualMemory(hProcess, (LPVOID)start2, (LPVOID)MemoryBuff, 4096, NULL); for (p = 0; p < 4096; p++) //バッファのサイズ=ループ回数 { start2++; MemoryBuff++; if (memcmp(MemoryBuff, bytecode, n) == 0) { //cout << "address=" << hex << start2 << "\n"; //addr2_0 = start2 + 0x5c; addr2_1 = start2 + 0x68; addr2_2 = start2 + 0x18; addr2_3 = start2 + 0x10; addr2_4 = start2 + 0x14; //addr2_5 = start2 - 0x8; //pfnNtReadVirtualMemory(hProcess, (LPVOID)addr2_0, &b_0, 4, NULL); pfnNtReadVirtualMemory(hProcess, (LPVOID)addr2_1, &b_1, 4, NULL); pfnNtReadVirtualMemory(hProcess, (LPVOID)addr2_2, &b_2, 4, NULL); pfnNtReadVirtualMemory(hProcess, (LPVOID)addr2_3, &b_3, 4, NULL); pfnNtReadVirtualMemory(hProcess, (LPVOID)addr2_4, &b_4, 4, NULL); //pfnNtReadVirtualMemory(hProcess, (LPVOID)addr2_5, &b_5, 4, NULL); if (b_1 == 2 && b_2 == 383558760 && b_3 == 0 && b_4 == 0) { cout << "address1=" << hex << start2 << "\n"; pfnNtWriteVirtualMemory(hProcess, (LPVOID)addr2_1, &r_8, 4, NULL); //return start2; } } } MemoryBuff = MemoryBuff - 4096; //ポインタを戻しておきます。 } } start += mBI.RegionSize; } return 0; }

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

a_saitoh

2018/06/14 07:22

「探索してくれません」とはどのような症状が出て探索してくれないと判断したのでしょうか?
masayukasina

2018/06/14 07:45

cout << "address=" << hex << start2 << "\n"; で表示させても7FFFFFFFF以上は検索してないんです。
a_saitoh

2018/06/14 09:02

どういう症状から検索できてないと判断できたのでしょう?
guest

回答3

0

ベストアンサー

c

1 int addr1 = 0; 2 int addr2 = 0; 3 int addr2_0 = 0; 4 int addr2_1 = 0; 5 int addr2_2 = 0; 6 int addr2_3 = 0; 7 int addr2_4 = 0; 8 int addr2_5 = 0;

とりあえずコレをuintに変更すべき

投稿2018/06/14 02:11

asm

総合スコア15147

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

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

masayukasina

2018/06/14 02:20

ありがとうございます。 ソースのint をunitに変更するだけでしょうか?まだまだ覚えたての素人でして… ちなみにCheatEngineの様なメモリエディターで内部を検索すると7FFFFFFF以上に目的の値が出てきます、それを検索したいのですが難しいでしょうか?
asm

2018/06/14 04:25

> ソースのint をunitに変更するだけでしょうか? そうですね 実際に動かしたわけじゃないので、これで充分かはわかりませんが > 難しいでしょうか? コードを精査してゆっくりデバッグしていけば不可能ではないと思いますよ
masayukasina

2018/06/14 04:38

'uint': 定義されていない識別子です。 構文エラー: ';' が、識別子 'addr1' の前に必要です。 が出ます(・_・;)
asm

2018/06/14 04:42

んじゃ、unsigned int か UINTで
masayukasina

2018/06/14 05:01

int addr1 = 0; int addr2 = 0; int addr2_0 = 0; int addr2_1 = 0; int addr2_2 = 0; int addr2_3 = 0; int addr2_4 = 0; int addr2_5 = 0; この部分だけintをUINTにするとエラーが出なくなりましたがひたすらループして次に進まなくなりました。
asm

2018/06/14 07:40

うーん、あと問題になりそうなのは > start += mBI.RegionSize; ここだろうか mBI.RegionSizeが0だった場合(存在しうるかはしらん)無限ループすることになる。 0だったら適当に1KBくらい飛ばしとけばいいのではないだろうか
masayukasina

2018/06/14 07:51

start += mBI.RegionSize + 1; ということですか?
asm

2018/06/14 08:05

start += !mBI.RegionSize ? 1024 : mBI.RegionSize; かな
masayukasina

2018/06/14 09:02

ありがとうございます、今晩試してみます。
masayukasina

2018/06/14 09:44

ありがとうございます、下記のように変更するとFFFFFFFFまで検索するのですが検索が終わるとループ(最後でずっと同じ処理をしていて終了しない)するのですが何が原因でしょうか? UINT search_1(HANDLE hProcess, unsigned char bytecode[], int n, UINT and1, int intAnd1, UINT and2, int intAnd2) { TNtReadVirtualMemory pfnNtReadVirtualMemory = NULL; pfnNtReadVirtualMemory = (TNtReadVirtualMemory)GetProcAddress(GetModuleHandle(_T("ntdll.dll")), "NtReadVirtualMemory"); TNtWriteVirtualMemory pfnNtWriteVirtualMemory = NULL; pfnNtWriteVirtualMemory = (TNtWriteVirtualMemory)GetProcAddress(GetModuleHandle(_T("ntdll.dll")), "NtWriteVirtualMemory"); MEMORY_BASIC_INFORMATION mBI; // サーチ開始アドレス UINT start = 0x00000000; // サーチ終了アドレス UINT end = 0xFFFFFFFF; unsigned int a = 0; unsigned int b = 0; __int64 b_0 = 0; __int64 b_1 = 0; __int64 b_2 = 0; __int64 b_3 = 0; __int64 b_4 = 0; __int64 b_5 = 0; unsigned int r_11 = 11; unsigned int r_8 = 8; unsigned int addr1 = 0; unsigned int addr2 = 0; unsigned int addr2_0 = 0; unsigned int addr2_1 = 0; unsigned int addr2_2 = 0; unsigned int addr2_3 = 0; unsigned int addr2_4 = 0; unsigned int addr2_5 = 0; unsigned int intActionCnt = 0; while (start < end) { SIZE_T size = VirtualQueryEx(hProcess, (void*)start, &mBI, sizeof(MEMORY_BASIC_INFORMATION)); if (size == 0) { std::cout << "error" << std::endl; break; } if ((mBI.State == MEM_COMMIT) && (mBI.Type == MEM_PRIVATE) && (mBI.Protect == PAGE_READWRITE) && (mBI.Type != MEM_IMAGE)) { UINT start2, end2; start2 = start; end2 = start2 + mBI.RegionSize; int p; CHAR *MemoryBuff = new CHAR[4096]; while (start2 <= end2) { pfnNtReadVirtualMemory(hProcess, (LPVOID)start2, (LPVOID)MemoryBuff, 4096, NULL); for (p = 0; p < 4096; p++) //バッファのサイズ=ループ回数 { start2++; MemoryBuff++; if (memcmp(MemoryBuff, bytecode, n) == 0) { //cout << "address=" << hex << start2 << "\n"; //addr2_0 = start2 + 0x5c; addr2_1 = start2 + 0x68; addr2_2 = start2 + 0x18; addr2_3 = start2 + 0x10; addr2_4 = start2 + 0x14; //addr2_5 = start2 - 0x8; //pfnNtReadVirtualMemory(hProcess, (LPVOID)addr2_0, &b_0, 4, NULL); pfnNtReadVirtualMemory(hProcess, (LPVOID)addr2_1, &b_1, 4, NULL); pfnNtReadVirtualMemory(hProcess, (LPVOID)addr2_2, &b_2, 4, NULL); pfnNtReadVirtualMemory(hProcess, (LPVOID)addr2_3, &b_3, 4, NULL); pfnNtReadVirtualMemory(hProcess, (LPVOID)addr2_4, &b_4, 4, NULL); //pfnNtReadVirtualMemory(hProcess, (LPVOID)addr2_5, &b_5, 4, NULL); if (b_1 == 2 && b_2 == 383558760 && b_3 == 0 && b_4 == 0) { cout << "address1=" << hex << start2 << "\n"; pfnNtWriteVirtualMemory(hProcess, (LPVOID)addr2_1, &r_8, 4, NULL); //return start2; } } } MemoryBuff = MemoryBuff - 4096; //ポインタを戻しておきます。 } } start += mBI.RegionSize; } return 0; }
asm

2018/06/14 10:17

あー、オーバーフローしちゃいますね。 start += mBI.RegionSize; を start = std::numeric_limits<UINT>::max() - start < mBI.RegionSize ? std::numeric_limits<UINT>::max() : start + mBI.RegionSize; に変更して #include<limits> を冒頭へ挿入
masayukasina

2018/06/14 10:57

ありがとうございます、ビルドエラーの原因はなんですかね? : warning C4003: マクロ 'max' に指定された実引数の数が少なすぎます。 : error C2589: '(': スコープ解決演算子 (::) の右側にあるトークンは使えません。 : error C2062: 型 'unknown-type' は不要です。 これが出ます(泣) 1: error C2059: 構文エラー: ')' UINT search_1(HANDLE hProcess, unsigned char bytecode[], int n, UINT and1, int intAnd1, UINT and2, int intAnd2) { TNtReadVirtualMemory pfnNtReadVirtualMemory = NULL; pfnNtReadVirtualMemory = (TNtReadVirtualMemory)GetProcAddress(GetModuleHandle(_T("ntdll.dll")), "NtReadVirtualMemory"); TNtWriteVirtualMemory pfnNtWriteVirtualMemory = NULL; pfnNtWriteVirtualMemory = (TNtWriteVirtualMemory)GetProcAddress(GetModuleHandle(_T("ntdll.dll")), "NtWriteVirtualMemory"); MEMORY_BASIC_INFORMATION mBI; // サーチ開始アドレス UINT start = 0x00000000; // サーチ終了アドレス UINT end = 0xFFFFFFFF; unsigned int a = 0; unsigned int b = 0; __int64 b_0 = 0; __int64 b_1 = 0; __int64 b_2 = 0; __int64 b_3 = 0; __int64 b_4 = 0; __int64 b_5 = 0; unsigned int r_11 = 11; unsigned int r_8 = 8; unsigned int addr1 = 0; unsigned int addr2 = 0; unsigned int addr2_0 = 0; unsigned int addr2_1 = 0; unsigned int addr2_2 = 0; unsigned int addr2_3 = 0; unsigned int addr2_4 = 0; unsigned int addr2_5 = 0; unsigned int intActionCnt = 0; while (start < end) { SIZE_T size = VirtualQueryEx(hProcess, (void*)start, &mBI, sizeof(MEMORY_BASIC_INFORMATION)); if (size == 0) { std::cout << "error" << std::endl; break; } if ((mBI.State == MEM_COMMIT) && (mBI.Type == MEM_PRIVATE) && (mBI.Protect == PAGE_READWRITE) && (mBI.Type != MEM_IMAGE)) { UINT start2, end2; start2 = start; end2 = start2 + mBI.RegionSize; int p; CHAR *MemoryBuff = new CHAR[4096]; while (start2 <= end2) { pfnNtReadVirtualMemory(hProcess, (LPVOID)start2, (LPVOID)MemoryBuff, 4096, NULL); for (p = 0; p < 4096; p++) //バッファのサイズ=ループ回数 { start2++; MemoryBuff++; if (memcmp(MemoryBuff, bytecode, n) == 0) { cout << "address=" << hex << start2 << "\n"; //addr2_0 = start2 + 0x5c; addr2_1 = start2 + 0x68; addr2_2 = start2 + 0x18; addr2_3 = start2 + 0x10; addr2_4 = start2 + 0x14; //addr2_5 = start2 - 0x8; //pfnNtReadVirtualMemory(hProcess, (LPVOID)addr2_0, &b_0, 4, NULL); pfnNtReadVirtualMemory(hProcess, (LPVOID)addr2_1, &b_1, 4, NULL); pfnNtReadVirtualMemory(hProcess, (LPVOID)addr2_2, &b_2, 4, NULL); pfnNtReadVirtualMemory(hProcess, (LPVOID)addr2_3, &b_3, 4, NULL); pfnNtReadVirtualMemory(hProcess, (LPVOID)addr2_4, &b_4, 4, NULL); //pfnNtReadVirtualMemory(hProcess, (LPVOID)addr2_5, &b_5, 4, NULL); if (b_1 == 2 && b_2 == 383558760 && b_3 == 0 && b_4 == 0) { cout << "address1=" << hex << start2 << "\n"; pfnNtWriteVirtualMemory(hProcess, (LPVOID)addr2_1, &r_8, 4, NULL); //return start2; } } } MemoryBuff = MemoryBuff - 4096; //ポインタを戻しておきます。 } } start = std::numeric_limits<UINT>::max() - start < mBI.RegionSize ? std::numeric_limits<UINT>::max() : start + mBI.RegionSize; } return 0; }
masayukasina

2018/06/14 11:23

宜しくおねがいしますm(__)m
asm

2018/06/14 11:35

min maxがwindows.hで衝突してるのか・・・ そんじゃ最大値使わずにやるか start = end - start < mBI.RegionSize ? end : start + mBI.RegionSize;
masayukasina

2018/06/14 12:11

有難う御座います、完璧です。 師匠と呼ばせていただきますm(__)m
guest

0

こんにちは。

Nox Appについては把握していませんが、該当のソース・コードをコンパイルしているコンパイラも恐らくint型は4バイトではないでしょうか?(PC上の多くの処理系がこのようになっています。)
その場合、int型で表現できる最大値は0x7fffffffです。


この手の仮想OSが絡む話の場合は、masayukasinaさんのコードがどこで走るコードなのかも明記しましょう。ゲストOSなのかホストOSなのかで回答が変わる場合もあります。
コンパイラの情報も記載しましょう。コンパイラによって状況が異なる場合もありがちです。

投稿2018/06/14 01:59

Chironian

総合スコア23272

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

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

masayukasina

2018/06/14 02:19

ありがとうございます、コンパイラはVisual Studio 2017を使用しています。 ちなみにCheatEngineの様なメモリエディターで内部を検索すると7FFFFFFF以上に目的の値が出てきます、それを検索したいのですが難しいでしょうか?
Chironian

2018/06/14 02:30

アドレスを保持する変数を0x7fffffffを超える値も保持できる型へ変更すればできる可能性があります。 確実なのは、unsigned long longです。これは64ビット符号なしです。 他に、masayukasinaさんのアプリを64ビットビルドする必要もあります。32ビットビルドですとアドレスは32ビットしか扱えません。
masayukasina

2018/06/14 04:39

unsigned long long の使用法がわからないです、すいませんm(__)m
Chironian

2018/06/14 04:46

アドレスを保持している変数(addr1など)を unsigned long long型へ変えるだけですよ。
masayukasina

2018/06/14 05:02

例えばどの部分をどのように変更すればいいのでしょうか?
Chironian

2018/06/14 07:29

そこまで回答すると丸投げに該当しそうです。C言語の変数宣言について調べてみて下さい。がんばです。
masayukasina

2018/06/14 09:59

ありがとうございます、がんばります。
guest

0

OSが書いていないので推測ですが、32bit OS を使用していますでしょうか?

であれば、ユーザープロセスに割り当てられるメモリ領域の上限は一般的に 2GB なので、0x7fffffff までになるのはおかしくありません。
※上位側2GB はシステム用に予約される

投稿2018/06/14 01:23

tacsheaven

総合スコア13703

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

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

masayukasina

2018/06/14 01:38

ありがとうございます、OSはWindow8.1の64Bitです。 プロセスはNox AppというAndroidエミュレータです、その中のメモリを検索しています。
tacsheaven

2018/06/14 01:59

動作させているアプリが 32bit アプリならば、最大2GBの制限はついて回ります。 Nox APP は 32bit アプリのようですね。
masayukasina

2018/06/14 02:19

ありがとうございます。 ちなみにCheatEngineの様なメモリエディターで内部を検索すると7FFFFFFF以上に目的の値が出てきます、それを検索したいのですが難しいでしょうか?
tacsheaven

2018/06/14 09:08

上でも書いていますが、0x7fffffff より大きなアドレスは、システム用の領域です。ですからそこに目的の値があったとしても、それが目的のデータである可能性は低いです。
masayukasina

2018/06/14 10:00

ありがとうございます、何とか検索は出来るようになりましたが処理が終わらなくなってる状態です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問