-3

DwordまたはIntを使用してC++でWriteProcessMemoryを実行したいのですが、変数に格納せずに、これを実行する1つの方法を見つけましたが、バイトでしか実行できません。誰かがこれを行う方法を知っていますか?これはバイトを使用して機能します。

WriteProcessMemory(hProcess, (void*)(BasePointer + 0x728),"\x90\x90", 4, NULL);

私が関数を作ったみんなの助けに感謝し、その働きは本当に良いです

void WriteMemory(DWORD Address,DWORD NewValue, int NewValueSize)
{
    WriteProcessMemory(hProcess, (void*)Address, (void*)&NewValue, NewValueSize, NULL);
}

int main()
{
    srand(time(0));
    GetProcess();
    WriteMemory((BasePointer + 0x6F8),2+rand()%65500,2);
    CloseHandle(hProcess);
    return 0;
}
4

2 に答える 2

2

データを配列に入れ、小さなループで配列から各アイテムを取得し、それをターゲット プロセスに書き込み、次に移動します。

struct data {
    DWORD offset;
    DWORD length;
    char data[256];
};

data items[] = {
    {0x728, 4, "\x90\x90"},
    // ...
};

for (int i=0; i<elements(items); i++)
    WriteProcessMemory(hProcess, (void *)(BasePointer + items[i].offset), items[i].data, items[i].length, NULL);
于 2012-04-03T20:03:43.507 に答える
2

コードがバイトで「機能する」理由は、文字列リテラルを使用しているためです。文字列リテラルは char の配列であり、 の 3 番目の引数として 1 つを渡そうとした場合と同様に、コンテキストが要求する場合、char の配列は最初の要素へのポインターに自動的に変換されますWriteProcessMemory

一度に 1 バイトずつ表現できる限り、4 バイトの DWord を含め、任意の値を文字列リテラルとして書き込むことができます。たとえば、"\x70\x71\x72\x73". Windows では、これは DWord 値 0x73727170 へのポインターに相当します。ただし、おそらくそれはしたくないでしょう。そのような数値を表現するのは面倒です。

C++ は、非 char 型のリテラル配列を持つための機能を提供しません。ただ需要はあまりありません。誰もがテキストを扱うため、リテラル char 配列の需要は高く、コード内でテキストを表現する簡単な方法が必要です。誰もが数値を扱うこともありますが、コード内で数値データの塊を表現する必要はほとんどありません。特に中間表現ではそうです。

あなたの質問によって解決される実際的な問題は与えられていません。何かできるかどうかを尋ねているだけです。悪いニュースの担い手になって申し訳ありませんが、答えは、あなたが求めていることは C++ では実行できないということです。他の人と同じように変数を宣言するだけです。変数は安価です。必要に応じていつでも自由に使用してください。それにもかかわらず、サブルーチンを使用してコードを簡潔に保つ方法を示しました。マクロは、それが目標である場合、コードを短くするのにも役立ちます。

また、コード内の文字列リテラルは3文字の配列であることにも注意してください。引用符で囲まれた 2 文字と、コンパイラがすべての文字列リテラルの末尾に自動的に含める nul 文字です。4バイトのブロックへのポインターを提供したことを関数に伝えていますが、これは false です。関数が他のプロセスに書き込む 4 番目のバイトには、未指定の値が含まれます。

于 2012-04-03T22:39:06.090 に答える