2

これをインラインasmでどのように書くことができますか? インライン asm の洞窟のメモリ位置に packet の値を書き込みたいのですが、どうすればよいですか? 私は WriteProcessMemory でそれを行うことができますが、それを取り除き、asm に置き換えたいです

int SendToClient(BYTE *packet, int Length)
{
    int cave = (int)VirtualAllocEx(hProcess, NULL, Length, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); 

    if (WriteProcessMemory(hProcess, (void*)cave, packet, Length, NULL))
    {

    }

    __asm
    {
        //how?
    }
}

たとえば、senderOffset というアドレスから読み取りたい場合は、次のようにします。

int GetSenderID()
{
    int value;

    __asm
    {
        mov eax, senderOffset
        mov value, eax
    }


    return *(int*)value;
}

これは、「ReadProcessMemory(GetCurrentProcess(), (VOID*)senderOffset, &value, 0)」が行うことを行っています。インライン asm を使用して「WriteProcessMemory」を行うのと同じ方法を探しています。

4

1 に答える 1

3

インラインアセンブリでWriteProcessMemory()を本質的に書き直したい場合は、忘れてください。そうなることはありません。WriteProcessMemory()は、別のプロセスの仮想メモリ空​​間のコンテンツを変更できるOSインターフェイスです。これは、使用する命令に関係なく、ユーザー空間プロセスから直接行うことはできません。インラインであろうと別のアセンブリソースファイルであろうと、アセンブリの量は、OSを経由せずに、仮想メモリサンドボックス内で動作するプロセスが別のプロセスの仮想メモリサンドボックスに書き込むことを可能にするために必要な魔法の呪文を唱えることができません。そうする。ユーザーモードプログラム内で動作している間、MMUは、プロセスが独自のメモリにアクセスできるように設定されています。そのメモリにアクセスしようとしても

別のプロセスのアドレス空間のメモリにアクセスするには、オペレーティングシステムを呼び出す必要があります。各システムには、プロセッサをユーザーモードからカーネルモードに切り替えるOS呼び出しを行うための制御された方法があります。x86では、これらは「リング」と呼ばれ、OSは最も特権の高い「リング0」で動作し、ユーザーモードコードは最も特権の低い「リング3」で動作します。ドライバーは他の2つのリングで動作します。CPUをリング3からリング0に単純に切り替えることはできません。そうしようとすると、特権違反が発生します。また、リング3内では、プロセスが別のプロセスのメモリ空間にアクセス(読み取り、書き込み、または実行)できるようにMMUを変更することはできません。

于 2012-12-19T18:00:32.303 に答える