1

タイトルを編集してくれる人が必要です。これ以上のタイトルが見つかりません。


と呼ばれるこの単純なプログラムがあると仮定しますsource.exe

#include <stdio.h>

int main()
{
   int a = 5;
   printf("%p", &a);
   return 0;
}

change.exe上記を変更する別のアプリケーション を書きたいと思いますa

私はこのようなことを試しました:

int main()
{
   int * p = (int*) xxx; // xxx is what have printed above
   *p = 1;
   printf("%d", *p);
   return 0;
}

うまくいきません。私が管理者権限を持っていると仮定すると、上記で試したことを行う方法はありますか? ありがとう。

4

4 に答える 4

1

私は少し冒険的な気分だったので、もちろん WinAPI を使用して、Windows でこのようなものを書くことを考えました。Linux の と同様ptraceに、このコードで使用される呼び出しはデバッガーのみが使用する必要があり、通常のアプリケーション コードでは通常見られません。

PROCESS_VM_WRITEさらに、別のプロセスのメモリを書き込み用に開くには、プロセス ハンドルをPROCESS_VM_OPERATION特権で開く必要があります。ただし、これは、プロセスを開くアプリケーションでSeDebugPriviledge特権が有効になっている場合にのみ可能です。管理者権限で昇格モードでアプリケーションを実行しましたが、SeDebugPriviledge.

とにかく、これが私がこれに使用したコードです。VS2008でコンパイルしました。

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char cmd[2048];
    int a = 5;
    printf("%p %d\n", &a, a);

    sprintf(cmd, "MemChange.exe %lu %x", GetCurrentProcessId(), &a);
    system(cmd);

    printf("%p %d\n", &a, a);

    return 0;
}

MemChange.exeこのコードが呼び出すコードは次のとおりです。

#include <windows.h>
#include <stdio.h>

int main(int argc, char **argv)
{
    DWORD pId;
    LPVOID pAddr;
    HANDLE pHandle;
    SIZE_T bytesWritten;
    int newValue = 666;

    sscanf(argv[1], "%lu", &pId);
    sscanf(argv[2], "%x", &pAddr);

    pHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pId);
    WriteProcessMemory(pHandle, pAddr, &newValue, sizeof(newValue), &bytesWritten);
    CloseHandle(pHandle);

    fprintf(stderr, "Written %u bytes to process %u.\n", bytesWritten, pId);
    return 0;
}

ただし、このコードは使用しないでください。それは恐ろしく、エラーチェックがなく、おそらく聖なる地獄のようにリークします。で何ができるかを説明するためだけに作成されましたWriteProcessMemory。それが役に立てば幸い。

于 2013-08-20T07:07:13.203 に答える