5

ntdll.dllからNt関数を呼び出したいのですが、上記のように実行しています。

NtTestAlert()を呼び出すには、int2Ehを介してアクセスできる一般的なntcallカーネルルーチンが必要です。(ここからNt関数を取得しましたhttp://undocumented.ntinternals.net/

コードも未完成です、私は得ています:

*エラーC2664:'_ ntcall':パラメータ1を'int'から'MESS( _stdcall )'に変換できません

#include <iostream>
#include <windows.h>
#include <Ntsecapi.h>

using namespace std;

typedef int(__stdcall MESS)(unsigned int);

void __ntcall(MESS *msg)
{
    __asm
    {
        int 2Eh;
    }
}

int main(void)
{
    MESS *me = 0;
    int result = 0;

    HINSTANCE__ *hModule= LoadLibrary(L"C:\\Windows\\System32\\ntdll.dll");

    if(hModule != 0)
    {
        me = (MESS*)GetProcAddress(hModule, "NtTestAlert");

        if(me != 0)
        {
            unsigned int type = 1;

            result = (__ntcall((*me)(type)));
        }
        else
        {
            cout << "Error Load function!" << endl;
        }

        FreeLibrary(hModule);
    }
    else
    {
        cout << "Error load Dll!" << endl;
    }

    return 0;
}
4

1 に答える 1

12

ポインタを取得した関数を呼び出すだけです。これint 2Ehは、システムコールを行う古い(そしてXP SP2以降)方法です。(通常の方法で)呼び出す場合、その下で実行されるNTDLL関数。あなたはそれを気にする必要はありません。

補足:あなたはいくつかの概念を混乱させているようです。NtTestAlertパラメータを取りません。

NTSYSAPI NTSTATUS NTAPI NtTestAlert();

MESSつまり、(あなたのタイプ)に変換されます:

typedef NTSTATUS(__stdcall *TFNNtTestAlert)();

あなたに基づく例:

#include <iostream>
#include <windows.h>
#include <tchar.h>
#include <Ntsecapi.h>

using namespace std;

typedef NTSTATUS (__stdcall *TFNNtTestAlert)();
// NTSTATUS is LONG, in case that isn't defined in the above headers

int main(void)
{
    HMODULE hModule=GetModuleHandle(TEXT("ntdll.dll"));

    if(hModule != 0)
    {
        TFNNtTestAlert pfnNtTestAlert = (TFNNtTestAlert)GetProcAddress(hModule, "NtTestAlert");

        if(pfnNtTestAlert != 0)
        {
            result = pfnNtTestAlert();
        }
        else
        {
            cout << "Error Load function!" << endl;
            return 1;
        }
    }
    else
    {
        cout << "Error load Dll!" << endl;
        return 2;
    }

    return 0;
}

システムコールメカニズム:

Windowsのsyscallメカニズムはint 2Eh、ある時点(および現在sysenter)でユーザーモードスタックのパラメーター、syscallのインデックスを渡し、ディスパッチャーを呼び出すために使用されます。次に、スレッドをカーネルモードに移行します。ここで、ユーザーモードスタックのパラメーターがチェックされ、処理が続行されます。これは非常に大まかなアウトラインです。このトピックに関するGaryNebbettの本を読むことをお勧めします。

于 2012-04-09T15:29:48.023 に答える