2012-04-09 12 views
2

Ich möchte einige Nt-Funktion von Ntdll.dll aufrufen, mache ich das oben so.Aufruf von Nt-Funktion von Ntdll.dll in Win32-Umgebung, C++

Zum Aufrufen von: NtTestAlert(), benötigen Sie typische ntcall Kernel-Routine, Zugriff über Int 2Eh. (von hier ich Nt Funktionen bekam http://undocumented.ntinternals.net/)

-Code ist auch unvollendet, erhalte ich:

* error C2664: '_ ntcall': kann nicht Parameter konvertieren 1 von 'int' zu ‚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; 
} 
+1

hat meine Antwort für Sie funktioniert? Wenn nicht, bitte frage zurück. Ansonsten wäre es schön wenn du es annehmen könntest :) – 0xC0000022L

Antwort

7

Sie rufen Sie einfach die Funktion, deren Zeiger Sie abrufen. Die int 2Eh ist eine alte (und seit XP SP2 veraltete) Methode zum Ausführen von Systemaufrufen. Beim Aufruf (nur über das normale Mittel) eine NTDLL-Funktion, die darunter läuft. Du brauchst dich nicht darum zu kümmern.

Randnotiz: Sie scheinen einige Konzepte zu verwechseln. NtTestAlert nimmt keinen Parameter.

NTSYSAPI NTSTATUS NTAPI NtTestAlert(); 

so würde das (Ihr MESS Typ) übersetzen:

typedef NTSTATUS(__stdcall *TFNNtTestAlert)(); 

Ein Beispiel basierend auf Ihre Unterstützung:

#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; 
} 

Systemaufruf-Mechanismus:

die syscall Mechanismus in Windows verwendet int 2Eh an einem bestimmten Punkt (und jetzt sysenter) übergeben Sie die Parameter im Benutzermodus-Stack, den Index des syscall und rufen Sie dann den Dispatcher auf. Dies führt dann den Thread in den Kernel-Modus über, wo die Parameter aus dem Benutzermodus-Stapel überprüft werden und dann die Verarbeitung fortschreitet. Dies ist ein sehr grober Umriss. Ich schlage vor, Sie lesen Gary Nebbetts Buch zu diesem Thema.

+0

@ status-access-denied danke für die sehr gute antwort! –

+0

HMODULE hModule = GetModuleHandle (TEXT ("ntdll.dll")); – herodot

+0

@herodot: danke, korrigiert. – 0xC0000022L