Problem bei Treiberprogrammierung unter Windows



  • Hallo,
    ich habe mir vor Kurzem das Buch "Rootkits - Den Windows Kernel unterwandern" (http://www.c-plusplus.net/cms/modules.php?op=modload&name=mbBooks&file=index&func=isbn&isbn=382732341X)
    gekauft.
    Habe nun aber aber einige Probleme die dort gezeigten Beispiele selbst zu schreiben.

    Zunächst wollte ich nur einen kleinen Treiber schreiben, welcher einfach als Debug-Meldung ein "Hallo Welt" ausgibt.
    Der Code sieht folgendermaßen aus:

    //Basic Device Driver
    
    #include "E:\Coding\Programme\WINDDK\3790.1830\inc\ddk\wxp\ntddk.h"
    
    NTSTATUS OnStubDispatch(IN PDEVICE_OBJECT DeviceObject, PIRP Irp)
    {
        Irp->IoStatus.Status = STATUS_SUCCESS;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
    
        return STATUS_SUCCESS;
    }
    
    //Entladefunktion
    VOID OnUnload ( IN PDRIVER_OBJECT DriverObject)
    {
        DbgPrint("Unload Called\n");
    }
    
    NTSTATUS DriverEntry( IN PDRIVER_OBJECT theDriverObject,
                            IN PUNICODE_STRING theRegistryPath)
    {
        int i;
        DbgPrint("Huhu");
        //Zeiger auf die Entladefunktion in "theDriverObject" initialisieren
        theDriverObject->DriverUnload = OnUnload;
    
        for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
        {
            theDriverObject->MajorFunction[i] = OnStubDispatch;
        }
    
        return STATUS_SUCCESS;
    }
    

    Danach hab ich eine "SOURCES"-Datei:

    TARGETNAME=test
    TARGETPATH=OBJ
    TARGETTYPE=DRIVER
    SOURCES= driver.c
    TARGETLIBS=$(DDK_LIB_PATH)\ndis.lib
    

    und eine "MAKEFILE" angelegt:

    !INCLUDE $(NTMAKEENV)\makefile.def
    

    Anschließen das ganze mittels WDK (checked) kompiliert und scheinbar auch keine Fehlermeldung erhalten:

    BUILD: Computing Include file dependencies:
    BUILD: Examining e:\coding\rootkit directory for files to compile.
    Compiling (NoSync) e:\coding\rootkit directory ********************
    'nmake.exe /nologo BUILDMSG=Stop. -i NTTEST= UMTEST= NOLINK=1 NOPASS0=1 386=1'
    cl -nologo -Ii386\ -I. -IE:\Coding\PROGRA~1\WINDDK\3790~1.183\inc\mfc42 -Iobjchk_wxp_x86\i386 -IE:\Coding\PROGRA~1\WINDDK\3790~1.183\inc\wxp -IE:\Coding\PROGRA~1\WINDDK\3790~1.183\inc\wxp -IE:\Coding\PROGRA~1\WINDDK\3790~1.183\inc\ddk\wxp -IE:\Coding\PROGRA~1\WINDDK\3790~1.183\inc\ddk\wdm\wxp -IE:\Coding\PROGRA~1\WINDDK\3790~1.183\inc\crt -D_X86_=1 -Di386=1  -DSTD_CALL -DCONDITION_HANDLING=1   -DNT_INST=0 -DWIN32=100 -D_NT1X_=100 -DWINNT=1 -D_WIN32_WINNT=0x0501 /DWINVER=0x0501 -D_WIN32_IE=0x0603    -DWIN32_LEAN_AND_MEAN=1 -DDEVL=1 -DDBG=1 -D__BUILDMACHINE__=WinDDK -DFPO=0  -DNDEBUG -D_DLL=1      /c /Zl /Zp8 /Gy /Gm- -cbstring /W3 /WX /Gz  /GX-  /GR- /GF /GS /G6 /Ze /Gi- /QIfdiv- /hotpatch -Z7 /Od /Oi  /Oy-   -FIE:\Coding\PROGRA~1\WINDDK\3790~1.183\inc\wxp\warning.h   .\driver.c 
    driver.c
    
    Stop.
    Linking e:\coding\rootkit directory ********************
    'nmake.exe /nologo BUILDMSG=Stop. -i LINKONLY=1 NOPASS0=1 NTTEST= UMTEST= 386=1'
    	link -out:objchk_wxp_x86\i386\test.sys -machine:ix86 @C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp\nm138A.tmp
    Microsoft (R) Incremental Linker Version 7.10.4035
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
    -MERGE:_PAGE=PAGE 
    -MERGE:_TEXT=.text 
    -SECTION:INIT,d 
    -OPT:REF 
    -OPT:ICF 
    -IGNORE:4198,4010,4037,4039,4065,4070,4078,4087,4089,4221 
    -INCREMENTAL:NO 
    -FULLBUILD 
    /release 
    -NODEFAULTLIB 
    /WX 
    -debug 
    -debugtype:cv 
    -version:5.1 
    -osversion:5.1 
    /functionpadmin:5 
    /safeseh 
    /pdbcompress 
    -STACK:0x40000,0x1000 
    -driver 
    -base:0x10000 
    -align:0x80 /stub:E:\Coding\PROGRA~1\WINDDK\3790~1.183\lib\wxp\stub512.com 
    -subsystem:native,5.01 
    -entry:GsDriverEntry@8 
    -out:objchk_wxp_x86\i386\test.sys 
    objchk_wxp_x86\i386\driver.obj 
    E:\Coding\PROGRA~1\WINDDK\3790~1.183\lib\wxp\i386\BufferOverflowK.lib 
    E:\Coding\PROGRA~1\WINDDK\3790~1.183\lib\wxp\i386\ntoskrnl.lib 
    E:\Coding\PROGRA~1\WINDDK\3790~1.183\lib\wxp\i386\hal.lib 
    E:\Coding\PROGRA~1\WINDDK\3790~1.183\lib\wxp\i386\wmilib.lib 
    E:\Coding\PROGRA~1\WINDDK\3790~1.183\lib\wxp\i386\ndis.lib 
    E:\Coding\PROGRA~1\WINDDK\3790~1.183\lib\wxp\i386\sehupd.lib 
    	echo Skip Binplace:
    Skip Binplace:
    
    Stop.
    

    Wenn ich den Treiber allerdings mit "InstDriver.exe" installiere und anschließend testen will bekomme ich nur die Meldung:

    Fail To Start The Service "test"
    

    So, das war jetzt ganz schön viel.
    Ich würd mich aber freuen wenn mir da jemand weiterhelfen kann 😉



  • Dieser Thread wurde von Moderator/in Tim aus dem Forum ANSI C in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • artificial schrieb:

    -entry:GsDriverEntry@8

    dein einsprungpunkt heisst aber 'DriverEntry'
    vielleicht isses das?



  • Also habe grad mal "DriverEntry" in "GsDriverEntry" geändert und neu kompiliert aber es bringt leider nichts...



  • als erstes musste mal feststellen, ob deine 'DriverEntry' überhaupt angesprungen wird. damit z.b: http://www.microsoft.com/technet/sysinternals/utilities/debugview.mspx
    einen 'DbgPrint' aufruf hast du ja schon drin...
    🙂



  • Undertaker schrieb:

    als erstes musste mal feststellen, ob deine 'DriverEntry' überhaupt angesprungen wird. damit z.b: http://www.microsoft.com/technet/sysinternals/utilities/debugview.mspx
    einen 'DbgPrint' aufruf hast du ja schon drin...
    🙂

    Mit DebugView seh ich leider nichts weil ich den Treiber ja nicht testen kann.
    Die Installation funktioniert noch ohne Probleme. Ich nehme an ich muss die .sys-Datei zum installieren auswählen.
    Falls nicht klärt mich bitte auf 🙂



  • artificial schrieb:

    Ich nehme an ich muss die .sys-Datei zum installieren auswählen.

    der treiber muss selbstverständlich geladen werden 🙄
    probier's damit: http://www.codeproject.com/system/tdriver.asp
    falls das auch nicht geht, könnte ein übler hack helfen: du kannst den treiber in dein /%systemroot%/drivers verzeichnis kopieren und dann umbenennen, so dass er z.b. den namen eines nicht benutzten usb-devices hat, dann das usb-device reinstecken und der treiber müsste geladen werden... 🙂



  • Auch mit diesem Programm bekomme ich nur die Meldung:

    Error. I can't load the driver.
    

    Also muss entweder im Code oder beim build was schief gelaufen sein...



  • da ist irgendwo der wurm drin 😞
    probier's doch mal zum anfang damit: http://tiger.la.asu.edu/Quick_Ref/DeviceDriver.pdf
    vergleich' auch mal die DriverEntry mit deiner und mach den 'build' und die installation des DDK wie dort beschrieben...
    und das: http://www.codeproject.com/system/driverdev.asp
    könnteste auch mal lesen.
    🙂


Anmelden zum Antworten