0

私は Windows 7 マシンを使用しており、IDA で kernel32.dll を開こうとしましたが、IDA は IsDebuggerPresent 関数のアドレスが 0x77e2b020 であることを示しています。インライン アセンブリを使用して関数を呼び出そうとしています。

vs2010 プラットフォームで、次のコードを使用してみました:-

#include<iostream>
using namespace std;

int blah() {
    __asm {
        xor eax, eax
        mov ebx, 0x77e2b020
        call ebx
    }
}

int main() {
    cout<<blah();
    return 0;
}

exe をビルドすると、kernel32.dll がロードされていることが示されます。

OllyDbg で exe をデバッグしようとしましたが、「call」命令を実行するとエラーが「アクセス違反」になります。

はい、C++ から API を直接呼び出すことが最善/正しい方法であることはわかっています。これは楽しみのためにやっているのですが、なぜこれが機能しないのかわかりません。

4

1 に答える 1

1

アドレス0x77e2b020は静的ではありません。明示的なアドレスではなく、名前で呼び出す必要があります。

再起動すると、ASLRが有効になっている場合、ライブラリは別のアドレスにロードされます。また、ライブラリのロード順序を保証できないため、アドレスにも影響します。

間接呼び出しを行おうとしている場合は、実行時にとを使用LoadLibraryGetProcAddressてのアドレスを見つけることを検討してください。IsDebuggerPresent

もう1つの問題は、ゴミ箱eaxに入れていることですebx。このようなインラインアセンブリを実行している間は、レジスタを安全に保つために、を使用する必要があります。次に例を示しpushadます。popad

__asm {
    pushad
    call IsDebuggerPresent
    mov dbgPresent, eax
    popad
}
于 2011-11-03T12:27:35.630 に答える