1

プロセスにフックされる dll アプリケーションを作成しました。動作しますが、最初の文字しか表示されません。
文字列全体を取得したかったのです。文字列は 2 文字から 32 文字までさまざまです。

//READING MEMORY
HANDLE ExeBaseAddress = GetModuleHandleA(0);

char uNameAddr = *(char*)((char*)ExeBaseAddress + 0x34F01C);
printf("%c \n", uNameAddr);

また、次の部分も理解したいと思いました。

 *(char*)((char*) //<-- what this is for.

マルチレベルポインターを使用する場合にこれを使用できる場合:

char multipoint = *(char*)((char*)ExeBaseAddress + 0x34F01C + 0x123 + 0x321 + 0x20);

アップデート

ここで何かが間違っていると思います:

if(uNameAddr == "omnicient")
    cout << "YOU ARE OMNI" << endl;

ユーザー名を使用しましたomnicientが、 cout しませんでしたYOU ARE OMNI。私の比較は間違っていると思いますか?

4

2 に答える 2

2

%cchars (単一文字) を表示し、 %sNULL で終わるchar*s (文字列)を表示します。

HANDLE ExeBaseAddress = GetModuleHandleA(0);

char *uNameAddr = (char*) ExeBaseAddress + 0x34F01C;
printf("%s \n", uNameAddr);

ポインターのキャストも整理したことに注意してください。ただし、重要なことは、最終的な逆参照 (先頭) を取り除き、それを(ポインター) ではなく (ポインター) に*割り当てたことです。char*char

%.*s文字列が NULL で終了していない場合 (可能性は低い)、文字列の長さも使用して渡す必要があります。

あなたの質問の2番目の部分については:

*(char*)((char*) ExeBaseAddress + 0x34F01C)

それを分解しましょう。括弧内 (したがって、最初に評価されるもの) は次のとおりです。

(char *) ExeBaseAddress + 0x34F01C

それは C のキャスト (HANDLEを a にキャストchar*) の後に追加が続くものです。言い換えれば、「これを何らかのメモリへのポインタであるかのように扱い、メモリの 0x34F01C バイト先を見てください」 (char常に 1 バイト)。これは、メモリ内の新しい位置へのポインターになりました。

次に、ブラケットから出て、char*再びキャストします...不必要に。次の可能性があります。

*((char*) ExeBaseAddress + 0x34F01C)

そして最後に*、(先頭の ) を逆参照します。これは、「今、あなたが指しているメモリのビットが何であるかを教えてください」と言います。ただし、この場合、最初の文字だけでなく文字列全体が必要なため、それは望ましくありません( 内では、送信するメモリに沿ってループし、 a 、別名akaprintfが見つかるまで各文字を印刷します)。0\0NULL

于 2013-04-18T00:06:12.393 に答える
2

char uNameAddr は文字です。文字のリストが必要です (または char*)

代わりにこれを試してください:

char* name= (char*)((char*)ExeBaseAddress + 0x34F01C);
printf("%s \n", name);

とは*(char*)((char*)どういう意味ですか?

(char*)ExeBaseAddressExeBaseAddress を char 型のデータへのポインタとして扱います

((char*)ExeBaseAddress + 0x34F01C)上記のポインターに 0x34F01C を追加して、0x34F01C 文字でオフセットすることを意味します。

(char*)((char*)ExeBaseAddress + 0x34F01C)この新しいアドレスをいくつかの文字へのポインタとして扱うことを意味します

*(char*)((char*)ExeBaseAddress + 0x34F01C)その場所の最初の文字の内容を取得します

char uNameAddr = *(char*)((char*)ExeBaseAddress + 0x34F01C);その文字を uNameAddr と呼ばれる char サイズの変数に入れることを意味します。

つまり、基本的にはポインターがあり、それをオフセットしてから、最初の文字を取得して印刷しました。

この例では、どのように firat 文字を使用しないかをメモし、それをポインター変数に置きました。

次に、printf で %s を使用して、名前で指定されたすべての文字を出力させました。

于 2013-04-18T00:02:39.390 に答える