0

私がやっていることは、実行中のプロセスに DLL を挿入することです。次に、バージョンなど、そのプロセスに関するいくつかの情報を確認します。私の問題は、再確認したいリビジョン番号を含むアセンブリ ファイル内の文字列にアクセスできないように見えることです。これが私がこれまでに持っているものです:

__declspec(naked) void CheckBuild()
{
    char* revision;
    __asm {
        sub esp, __LOCAL_SIZE
        pushad
        pushfd

        mov revision, dword ptr 0x5F5200
    }

    printf("Detected revision ID: %u\n", revision);

    __asm {
        popfd
        popad
        add esp, __LOCAL_SIZE
        retn
    }
}

このトレーニングの場合、IDA を介して取得し、CheatEngine と OllyDbg を使用して確認した文字列のアドレスは一定です。

ただし、何を試しても、常に 0x5F5200 が 10 進数で返されますが、これは間違いなく期待どおりではありません。lea などを含め、ほとんどすべてを試しましたが、まだ有効な文字列を取得できません。

誰でも私を正しい方向に向けることができますか?

4

1 に答える 1

1
  1. 「間接参照」が欠落しています:

    mov revision, dword ptr [0x5F5200]

これは2つの間接があるため、有効な命令ではありません。

mov eax, dword ptr [0x5F5200]
mov revision, eax
  1. 値が実際に文字列である場合は、別の問題があります。

    • 文字列が0x5F5200に保存されている場合は、単に次を使用します。

    printf("Detected revision ID: %s\n", 0x5F5200)

    • 文字列のアドレスが0x5F5200に格納されている場合は、次を使用します。

    printf("Detected revision ID: %s\n", revision)

  2. 文字列形式

文字列がUnicodeの場合、次を使用します

printf("Detected revision ID: %S\n", revision);

(wprintfでは、その逆であることに注意してください。'ワイド文字列の場合は%s、char文字列の場合は%s)。

最後に、文字列がゼロで終了することが保証されていないが長さが固定されている場合は、アドレスからローカルバッファにコピーし、印刷前にゼロで終了するようにする必要があります。

于 2012-09-24T16:28:13.593 に答える