邪恶八进制信息安全团队技术讨论组's Archiver

如果if 2007-3-27 20:47

[转载]一个内核级的SHELL工具源代码

信息来源:WhiteCell技术论坛

驱动部分
;@echo off
;goto make

;********************************************************************
;author :dge
;homepage:[url]http://llfdge.googlepages.com/[/url]
;date  :2007.3.16
;********************************************************************

.386
.model flat, stdcall
option casemap:none

include        d:\masm32\include\w2k\ntstatus.inc
include        d:\masm32\include\w2k\ntddk.inc
include        d:\masm32\include\w2k\ntoskrnl.inc
includelib    d:\masm32\lib\w2k\ntoskrnl.lib
include        d:\masm32\Macros\Strings.mac
include        common.inc

_DispatchCreateClose proto :PDEVICE_OBJECT,:PIRP
_DriverUnload proto :PDRIVER_OBJECT
_DispatchControl proto :PDEVICE_OBJECT,:PIRP

.const
CCOUNTED_UNICODE_STRING    "\\Device\\devFHF", g_usDeviceName, 4
CCOUNTED_UNICODE_STRING    "\\??\\slFHF", g_usSymbolicLinkName, 4

.data
szDos    db    '\DosDevices\',0

.code

_SetEventComp  proc uses esi edi,pDeviceObject:PDEVICE_OBJECT,pIrp:PIRP,event
    mov    esi,pIrp
    assume    esi : ptr _IRP
    push  [esi].IoStatus.Status
    mov   edi,[esi].UserIosb
    assume edi : ptr IO_STATUS_BLOCK
    pop   [edi].Status

    push  [esi].IoStatus.Information
    pop   [edi].Information

    invoke KeSetEvent,[esi].UserEvent,0,FALSE
    assume esi:nothing
    assume edi:nothing
  
    invoke IoFreeIrp,pIrp

    mov eax,STATUS_MORE_PROCESSING_REQUIRED
    ret
_SetEventComp  endp


DriverEntry proc uses esi, pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
    local    status : NTSTATUS
    local    pDeviceObject : PDEVICE_OBJECT

;    int    3
    invoke    DbgPrint, $CTA0("Entry DriverEntry \n")
    mov    status, STATUS_DEVICE_CONFIGURATION_ERROR
   
    invoke    IoCreateDevice, pDriverObject,NULL, addr g_usDeviceName,\
        FILE_DEVICE_UNKNOWN, 0, FALSE, addr pDeviceObject
    .if    eax==STATUS_SUCCESS
        mov    esi, pDeviceObject
        assume    esi : ptr DEVICE_OBJECT
        
        invoke    IoCreateSymbolicLink,addr g_usSymbolicLinkName, addr g_usDeviceName
        .if    eax==STATUS_SUCCESS
            mov    eax, pDriverObject
            assume    eax:ptr DRIVER_OBJECT
            mov    [eax].DriverUnload,                      offset _DriverUnload
            mov    [eax].MajorFunction[IRP_MJ_CREATE*(sizeof PVOID)],      offset _DispatchCreateClose
            mov    [eax].MajorFunction[IRP_MJ_CLOSE*(sizeof PVOID)],      offset _DispatchCreateClose
            mov    [eax].MajorFunction[IRP_MJ_DEVICE_CONTROL*(sizeof PVOID)], offset _DispatchControl
            assume    eax:nothing
            
            mov    status, STATUS_SUCCESS
        .else
            invoke    IoDeleteDevice, pDeviceObject
        .endif
    .endif

    mov eax, status
    ret
DriverEntry endp
      
_DispatchControl proc uses esi edi ebx,pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
    local    status : NTSTATUS
    local    dwBytesReturned
    local  oa : OBJECT_ATTRIBUTES
    local  lpDeviceObject : PDEVICE_OBJECT
    local  event : KEVENT   
    local  ioStatus : IO_STACK_LOCATION
    local  ioS : IO_STATUS_BLOCK  
    local  lpIrp : PIRP
    local  hFile
    local  lpSystemBuffer
    local  lpInformation:PFILE_DIRECTORY_INFORMATION
    local  lpFileobject : PFILE_OBJECT
    local  uFileName : UNICODE_STRING
    local  UN:UNICODE_STRING
    local  aFileName : ANSI_STRING            
    local  Buffer[1024]:byte   

    and    dwBytesReturned,0
    mov    status, STATUS_UNSUCCESSFUL
    mov    esi, pIrp
    assume    esi : ptr _IRP
   
    IoGetCurrentIrpStackLocation esi
    mov    edi,eax
    assume    edi : ptr IO_STACK_LOCATION   
    mov    eax,[edi].Parameters.DeviceIoControl.IoControlCode   
    .if   eax == IOCTL_GET_DIRECTORY_INFO
        ;int 3
        push    [esi].AssociatedIrp.SystemBuffer
        pop   esi
        mov   lpSystemBuffer,esi
     
        assume    esi:nothing
        assume    edi:nothing

        invoke strcpy,addr Buffer,addr szDos
        invoke strcat,addr Buffer,lpSystemBuffer
        invoke    RtlInitAnsiString,addr aFileName,addr Buffer
        invoke    RtlAnsiStringToUnicodeString,addr uFileName,addr aFileName,TRUE

        InitializeObjectAttributes addr oa, addr uFileName,OBJ_CASE_INSENSITIVE + OBJ_KERNEL_HANDLE,\
                      NULL, NULL
        ;打开目录
        invoke    ZwOpenFile,addr hFile, FILE_LIST_DIRECTORY + SYNCHRONIZE+FILE_ANY_ACCESS, addr oa,\
                  addr ioS, FILE_SHARE_READ + FILE_SHARE_WRITE + FILE_SHARE_DELETE,\
                  FILE_DIRECTORY_FILE + FILE_SYNCHRONOUS_IO_NONALERT           
        .if    eax==STATUS_SUCCESS
            invoke    DbgPrint, $CTA0("ZwOpenFile SUCCESS\n"),eax            
        .endif   
        invoke RtlFreeUnicodeString,addr uFileName
        ;获得句柄的文件对象
        invoke    ObReferenceObjectByHandle,hFile,FILE_LIST_DIRECTORY + SYNCHRONIZE,\
            0,KernelMode,addr lpFileobject,NULL
        .if   eax==STATUS_SUCCESS           
            invoke    DbgPrint, $CTA0("file obj success\n")
            ;获得文件系统的底层设备对象
            mov    esi,lpFileobject
            assume    esi:ptr FILE_OBJECT
            
            push    [esi].Vpb
            pop    edi
            assume    edi:ptr VPB
            .if   [esi].Vpb & edi
                push    [edi].DeviceObject
                pop    lpDeviceObject
            .endif
            assume    esi:nothing
            assume edi:nothing
            mov   esi,lpDeviceObject
            assume esi:ptr DEVICE_OBJECT
         
            invoke IoAllocateIrp,[esi].StackSize,FALSE
            .if   eax !=NULL
                mov    lpIrp,eax
            .else  ;减少引用记数
                invoke    DbgPrint, $CTA0("allocate failed \n")
                invoke ObDereferenceObject,lpFileobject
                invoke ZwClose,hFile
                jmp    exit
            .endif

            ;int 3
            invoke    DbgPrint, $CTA0("allocate Irp success \n")
            invoke KeInitializeEvent,addr event,SynchronizationEvent,FALSE
            assume esi:nothing
            mov   esi,lpIrp
            assume    esi : ptr _IRP

            ;填充IRP结构            
            invoke ExAllocatePool,PagedPool,65535
            push    eax
            invoke memset,eax,0,65535
            pop    eax
            mov    lpInformation,eax
            mov   [esi].UserBuffer,eax
            mov    [esi].MdlAddress,NULL
            mov   [esi].AssociatedIrp.SystemBuffer,eax
            mov    [esi].Flags,0
            lea   eax, event
            mov   [esi].UserEvent,eax
            lea    eax,ioStatus
            mov   [esi].UserIosb,eax
            push  lpFileobject
            pop   [esi].Tail.Overlay.OriginalFileObject
            invoke PsGetCurrentThread
            mov   [esi].Tail.Overlay.Thread,eax
            mov   [esi].RequestorMode,KernelMode
            assume esi:nothing
            
            IoGetNextIrpStackLocation lpIrp
            mov   esi,eax
            assume esi:ptr IO_STACK_LOCATION

            mov   [esi].MajorFunction,IRP_MJ_DIRECTORY_CONTROL
            mov   [esi].MinorFunction,IRP_MN_QUERY_DIRECTORY
            push  lpFileobject
            pop   [esi].FileObject
            push  lpDeviceObject
            pop   [esi].DeviceObject
            mov   [esi].Flags,SL_RESTART_SCAN
            mov    [esi].Control,0
            mov   [esi].Parameters.QueryDirectory.FileIndex,0
            mov   [esi].Parameters.QueryDirectory.FileInformationClass,FileDirectoryInformation            
            
            mov   [esi].Parameters.QueryDirectory.FileName,NULL
            mov   [esi].Parameters.QueryDirectory._Length,65535
            
            assume esi:nothing
            
            IoSetCompletionRoutine lpIrp,addr _SetEventComp,0,TRUE,TRUE,TRUE

            invoke IoCallDriver,lpDeviceObject,lpIrp
            invoke    DbgPrint, $CTA0("status %x"),eax
            invoke KeWaitForSingleObject,addr event,Executive,KernelMode,TRUE,0

            mov    esi,lpInformation            
            assume esi:ptr FILE_DIRECTORY_INFORMATION

            mov    edi,lpSystemBuffer
            assume    edi:ptr DIRECTORY_INFO
            .while TRUE
                mov   eax,[esi].FileNameLength   
                mov   UN._Length,ax
                mov   UN.MaximumLength,ax
                lea    ecx,[esi].FileName
                mov   UN.Buffer,ecx               
                invoke RtlUnicodeStringToAnsiString, addr aFileName, addr UN,TRUE                 
                invoke    strcpy,addr [edi].FileName,aFileName.Buffer
                invoke    RtlFreeAnsiString,addr aFileName
                push  dword ptr[esi].CreationTime
                pop    dword ptr[edi].CreationTime
                push  dword ptr[esi].CreationTime+4
                pop    dword ptr[edi].CreationTime+4
            
                push    dword ptr[esi].EndOfFile
                pop    dword ptr[edi].EndOfFile

                push    [esi].FileAttributes
                pop    [edi].FileAttributes
            
                add   dwBytesReturned,sizeof DIRECTORY_INFO            
                add   edi,sizeof DIRECTORY_INFO
                 
                .if   ![esi].NextEntryOffset
                    .break
                .endif
                add    esi,[esi].NextEntryOffset                           
            .endw   
            assume esi:nothing
            invoke ExFreePool,lpInformation
            invoke ObDereferenceObject,lpFileobject
            invoke ZwClose,hFile
            mov   status,STATUS_SUCCESS           
        .else  
            invoke    DbgPrint, $CTA0("file obj failed \n")
            jmp    exit
        .endif
    .endif
exit:    mov   esi,pIrp
    assume    esi : ptr _IRP
    push    status
    pop   [esi].IoStatus.Status   
    push    dwBytesReturned
    pop    [esi].IoStatus.Information

    assume    esi : nothing
    assume    edi : nothing

    invoke    IoCompleteRequest, pIrp, IO_NO_INCREMENT
    mov   eax, status
    ret
_DispatchControl endp

_DispatchCreateClose proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
    mov    eax, pIrp
    assume    eax:ptr _IRP
    mov    [eax].IoStatus.Status, STATUS_SUCCESS
    and    [eax].IoStatus.Information, 0
    assume    eax:nothing
    invoke    IoCompleteRequest, pIrp, IO_NO_INCREMENT
    ret
_DispatchCreateClose endp

_DriverUnload proc pDriverObject:PDRIVER_OBJECT
    invoke    DbgPrint, $CTA0("Unload success\n")
    invoke    IoDeleteSymbolicLink, addr g_usSymbolicLinkName
    mov    eax, pDriverObject
    invoke    IoDeleteDevice, (DRIVER_OBJECT PTR [eax]).DeviceObject
    ret
_DriverUnload endp

end DriverEntry

:make
set path=%path%;d:\masm32\bin;
set drv=FHF

ml /nologo /c /coff %drv%.bat
link /nologo /driver /base:0x10000 /align:32 /out:%drv%.sys /subsystem:native %drv%.obj
del %drv%.obj
echo.
pause

用户部分:
;********************************************************************
;author :dge
;homepage:[url]http://llfdge.googlepages.com/[/url]
;date  :2007.3.16
;********************************************************************

.386
.model flat, stdcall
option casemap :none

include        d:\masm32\include\windows.inc
include        d:\masm32\include\kernel32.inc
includelib    d:\masm32\lib\kernel32.lib
include        d:\masm32\include\user32.inc
includelib    d:\masm32\lib\user32.lib
include        d:\masm32\include\winioctl.inc
include        d:\masm32\include\advapi32.inc
includelib    d:\masm32\lib\advapi32.lib
include        d:\masm32\Macros\Strings.mac
include     common.inc

.data?
szHostName    db    100 dup (?)
szBuffer    db    100 dup (?)
hInstance    dd    ?
;********************************************************************
; 标志及命令行参数
;********************************************************************
dwOption    dd    ?
F_ABORT        equ    0001h        ;按了 Ctrl-C 终止

.data
szVer      db    'FHF [版本 1.0]',0dh,0ah
        db    &#39;<C> 版权所有 2007 dge&#39;,0dh,0ah
        db    &#39;http://llfdge.googlepages.com&#39;,0dh,0ah,0   
szDir      db   &#39;dir&#39;,0dh,0ah,0
szExit     db   &#39;exit&#39;,0dh,0ah,0
szCdB      db   &#39;cd..&#39;,0dh,0ah,0
szCdC      db    &#39;cd ..&#39;,0dh,0ah,0
szCdA      db   &#39;cd &#39;,0
szRoot     db   &#39;:&#39;,0dh,0ah,0
szCaption    db    &#39;FHF V1.0&#39;,0
szGet      db   100 dup(?)
szError     db   &#39;不支持此命令&#39;,0dh,0ah,0  
last      db   &#39;>&#39;,0
odoa      db   0dh,0ah,0
szFilter    db    &#39;*.*&#39;,0
szOutputA    db    &#39;%04d-%02d-%02d %02d:%02d   %s   %-8d   %-s&#39;,0dh,0ah,0
szOutputB    db    &#39;%04d-%02d-%02d %02d:%02d       %-8d   %-s&#39;,0dh,0ah,0
szIr      db    &#39;<DIR>&#39;,0
szOutput    db   1024 dup(?)
szFail     db    &#39;系统找不到指定路径&#39;,0dh,0ah,0
FLAG        db   0
adwOutBuffer  db   65535 dup(?)
hDevice     dd    ?
inBuffer    db    100 dup(?)  
dwBytesReturned dd    ?
count      dd    ?
f        db   &#39;%s %s&#39;,0
.code

include        _Console.asm

_LoadDriver    proc    uses esi edi
        local    hSCManager
        local    hService
        local    acModulePath[MAX_PATH]:CHAR
        local    _ss:SERVICE_STATUS
        local    acBuffer[256+64]:CHAR
        local    acNumber[32]:CHAR
        local    szWide[100]:byte   
        
        invoke    CreateFile,$CTA0("\\\\.\\slFHF"), GENERIC_READ + GENERIC_WRITE, \
                 0, NULL, OPEN_EXISTING, 0, NULL
        .if    eax != INVALID_HANDLE_VALUE
             mov    hDevice,eax        
             mov    eax,TRUE
             ret
        .endif        
        invoke    OpenSCManager, NULL, NULL, SC_MANAGER_ALL_ACCESS
        .if    eax != NULL
            mov    hSCManager, eax
            push    eax
            invoke    GetFullPathName, $CTA0("FHF.sys"), sizeof acModulePath, addr acModulePath, esp
              pop    eax
            invoke CreateService, hSCManager, $CTA0("FHF"), $CTA0("FHF"),\
                SERVICE_START + SERVICE_STOP + DELETE, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, \
                SERVICE_ERROR_IGNORE, addr acModulePath, NULL, NULL, NULL, NULL, NULL
                .if   eax != NULL
                    mov    hService, eax
                    invoke    StartService, hService, 0, NULL
                    .if    eax != 0
                        invoke    CreateFile,$CTA0("\\\\.\\slFHF"), GENERIC_READ + GENERIC_WRITE, \
                                  0, NULL, OPEN_EXISTING, 0, NULL
                        .if   eax != INVALID_HANDLE_VALUE
                            mov    hDevice, eax
                            invoke    CloseServiceHandle, hService
                            mov    eax,TRUE
                            ret        
                        .endif            
                            invoke    ControlService, hService, SERVICE_CONTROL_STOP, addr _ss               
                    .endif
                    invoke     DeleteService, hService
                    invoke     CloseServiceHandle, hService
                .endif
                invoke    CloseServiceHandle, hSCManager
        .endif
    mov    eax,FALSE
    ret
_LoadDriver    endp

_CloseDevice    proc uses ebx esi edi
        LOCAL    hSCManager
        LOCAL    hService
        LOCAL    sest : SERVICE_STATUS
        
        .if    hDevice
            invoke    CloseHandle, hDevice
        .endif
   
        invoke    OpenSCManager, NULL, NULL, SC_MANAGER_CONNECT
        .if    eax!=0
            mov    hSCManager, eax
        
            invoke    OpenService, hSCManager, $CTA0("FHF"), SERVICE_STOP+DELETE
            .if    eax!=0
                mov    hService, eax
                invoke    ControlService, hService, SERVICE_CONTROL_STOP, addr sest
                invoke    DeleteService, hService
                invoke    CloseServiceHandle, hService
            .endif
            invoke    CloseServiceHandle, hSCManager
        .endif
      
        ret
_CloseDevice endp
  
_PrintFileInfo    proc
        local    sysTime :SYSTEMTIME
        local    stFindFile:WIN32_FIND_DATA
        local    hFindFile
        local  lpName
        local  EnFilea
        local  EnFileb
        pushad
        lea    esi,adwOutBuffer
        assume    esi:ptr DIRECTORY_INFO
        
        mov    ecx,count         
     @@:  push    ecx
        .if    [esi].FileAttributes & FILE_ATTRIBUTE_DIRECTORY
            .if    [esi].Flag == TRUE
                invoke SetConsoleTextAttribute,hStdOut,FOREGROUND_RED+FOREGROUND_INTENSITY
            .endif
            invoke FileTimeToSystemTime,addr [esi].CreationTime,addr sysTime   
            push    esi
            lea   esi,[esi].FileName
            mov    lpName,esi
            push  dword ptr[esi].EndOfFile
            pop   EnFilea
            push  dword ptr[esi].EndOfFile+4
            pop    EnFileb
            movzx    esi,sysTime.wYear
            movzx    edi,sysTime.wMonth
            movzx    ebx,sysTime.wDay
            movzx    ecx,sysTime.wHour
            movzx    edx,sysTime.wMinute
            invoke    wsprintf,addr szOutput,addr szOutputA,esi,edi,ebx,ecx,\
                     edx,addr szIr,EnFilea,lpName

            invoke _ConsolePrint,addr szOutput

            pop    esi
        .else
            .if    [esi].Flag == TRUE
                invoke SetConsoleTextAttribute,hStdOut,FOREGROUND_RED+FOREGROUND_INTENSITY
            .endif

            invoke FileTimeToSystemTime,addr [esi].CreationTime,addr sysTime
            push    esi
            lea   esi,[esi].FileName
            mov    lpName,esi
            push  dword ptr[esi].EndOfFile
            pop   EnFilea
            push  dword ptr[esi].EndOfFile+4
            pop    EnFileb
            movzx    esi,sysTime.wYear
            movzx    edi,sysTime.wMonth
            movzx    ebx,sysTime.wDay
            movzx    ecx,sysTime.wHour
            movzx    edx,sysTime.wMinute
            
            invoke wsprintf,addr szOutput,addr szOutputB,esi,edi,ebx,ecx,edx,EnFilea,\
                     lpName
            
            invoke _ConsolePrint,addr szOutput

            pop    esi
        .endif
        invoke SetConsoleTextAttribute,hStdOut,FOREGROUND_GREEN
        add    esi,sizeof DIRECTORY_INFO
        pop    ecx
        dec    ecx
        .if    ecx
            jmp @B
        .endif
               
         ret
_PrintFileInfo     endp               
         
_SubPath    proc
        lea    edi,szBuffer
        mov   al,&#39;>&#39;
        mov   cx,100D
        repne  scasb
        dec    edi        
     @@:    dec   edi
         cmp   byte ptr[edi],&#39;\&#39;
        jne   @B
        cmp   byte ptr[edi-1],&#39;:&#39;
        jne   @F
        inc    edi
     @@:  mov   byte ptr[edi],&#39;>&#39;
        inc   edi
        mov   byte ptr[edi],0
        ret
_SubPath    endp

_AddPath    proc  lpSz

        pushad
        lea    edi,szBuffer
        mov   al,&#39;>&#39;
        mov   cx,100D
        repne  scasb
        dec    edi
        .if    byte ptr[edi-1]==&#39;\&#39;
            mov    byte ptr[edi],0
        .else
            mov    byte ptr[edi],&#39;\&#39;
            inc    edi
            mov    byte ptr[edi],0
        .endif   
        mov    esi,lpSz
        invoke lstrlen,esi
        add    esi,eax
        mov    word ptr[esi-2],0
        invoke    lstrcat,addr szBuffer,lpSz
        invoke lstrcat,addr szBuffer,addr last

        popad
        ret
_AddPath    endp

_Init      proc
        pushad

        lea    esi,adwOutBuffer
        assume    esi:ptr DIRECTORY_INFO
        xor    edx,edx
        mov    eax,dwBytesReturned
        mov    ecx,sizeof DIRECTORY_INFO
        div    ecx
        mov    count,eax
        mov    ecx,eax
    @@:    mov    [esi].Flag,TRUE
        push    ecx              
        add    esi,sizeof DIRECTORY_INFO
        pop    ecx
        loop    @B
        popad
        ret
_Init        endp

_SetFlag    proc lpName
   
        pushad
        lea    esi,adwOutBuffer
        assume    esi:ptr DIRECTORY_INFO
        mov    ecx,count
    @@:   push    ecx
        invoke lstrcmp,addr [esi].FileName,lpName
        .if    !eax
            mov    [esi].Flag,FALSE   
        .endif
        pop    ecx
        add    esi,sizeof DIRECTORY_INFO
        loop    @B

        assume    esi:nothing
        popad
        ret
_SetFlag    endp

_FindHideFile  proc
        local    stFindFile:WIN32_FIND_DATA
        local    hFindFile
        local    @szSearch[MAX_PATH]:byte   
        local    sysTime :SYSTEMTIME

        pushad
        invoke    lstrcpy,addr @szSearch,addr szBuffer
        invoke    lstrlen,addr @szSearch
        lea   esi,@szSearch
        add   esi,eax
        xor    eax,eax
        dec    esi
        mov    byte ptr[esi],&#39;\&#39;
        mov   byte ptr[esi+1],&#39;*&#39;
        mov    byte ptr[esi+2],&#39;.&#39;
        mov    byte ptr[esi+3],&#39;*&#39;
        mov   byte ptr[esi+4],0
        invoke    FindFirstFile,addr @szSearch,addr stFindFile
        .if    eax !=    INVALID_HANDLE_VALUE
            mov    hFindFile,eax
            .repeat
                invoke    _SetFlag,addr stFindFile.cFileName
                invoke    FindNextFile,hFindFile,addr stFindFile
            .until    (eax ==    FALSE)
            invoke    FindClose,hFindFile   
        .endif
        popad

        ret
_FindHideFile    endp

start:
        call    _ConsoleInit
        invoke SetConsoleTextAttribute,hStdOut,FOREGROUND_BLUE+FOREGROUND_INTENSITY
        invoke _ConsolePrint,addr szVer
        invoke GetCurrentDirectory,1024,addr szBuffer
        invoke    lstrcat,addr szBuffer,addr last
        invoke    SetConsoleTitle,addr szCaption
        invoke SetConsoleTextAttribute,hStdOut,FOREGROUND_GREEN
      @@: invoke _ConsolePrint,addr szBuffer
        invoke    RtlZeroMemory,addr szGet,sizeof szGet
        invoke _ConsoleRead,addr szGet
        lea   esi,szGet
        
        invoke    lstrcmp,esi,addr szExit
        .if    !eax
            invoke    _CloseDevice
            invoke ExitProcess,NULL
        .endif
        invoke    lstrcmp,esi,addr szCdB
        .if    !eax
         p2:  or    FLAG,1
            lea    esi,szBuffer
            inc   esi
            inc    esi
            cmp   byte ptr[esi],&#39;>&#39;
            je   ll
            invoke    _SubPath
            invoke _ConsolePrint,addr odoa
        ll:    jmp     @B
        .endif

        invoke    lstrcmp,esi,addr szCdC
        .if    !eax
            jmp    p2
        .endif
        
        movzx    eax,byte ptr[esi]
        .if   eax == &#39;c&#39;           
            inc    esi
            movzx    eax,byte ptr[esi]
            .if    eax == &#39;d&#39;
               
                inc    esi
                movzx    eax,byte ptr[esi]
                .if   eax == &#39; &#39;                    
                    inc    esi
                    
                    cmp   byte ptr[esi],0dh
                    jz   L
                    invoke _AddPath,esi
                     
                 L:    invoke _ConsolePrint,addr odoa
                    jmp   @B               
                .else
                    invoke _ConsolePrint,addr odoa
                    jmp   @B
                .endif
            .else
             dec    esi
            .endif            
        .endif
      
        invoke    lstrcmp,esi,addr szDir
        .if    !eax
           
        L1:   invoke    _LoadDriver
            .if    !eax
                invoke _CloseDevice
                jmp    L1
            .endif
              
            invoke    lstrcpy,addr inBuffer,addr szBuffer
            invoke    lstrlen,addr inBuffer
             lea   esi,inBuffer
            add   esi,eax
            dec    esi
            mov    byte ptr[esi],&#39;\&#39;
            invoke RtlZeroMemory,addr adwOutBuffer,sizeof adwOutBuffer
            invoke    DeviceIoControl,hDevice, IOCTL_GET_DIRECTORY_INFO, addr inBuffer,sizeof inBuffer, \
                        addr adwOutBuffer, sizeof adwOutBuffer, addr dwBytesReturned, NULL
            .if    ( eax != 0 ) && ( dwBytesReturned != 0 )
                invoke _Init
                invoke    _FindHideFile               
                invoke _PrintFileInfo
                invoke _ConsolePrint,addr odoa
                jmp    @B
            .else
                invoke _ConsolePrint,addr szFail
                jmp    @B
            .endif
        .endif

        inc    esi
        invoke    lstrcmp,esi,addr szRoot
        dec    esi
        .if    !eax
            
            lea    edi,szBuffer
            invoke    RtlZeroMemory,edi,sizeof szBuffer
            lodsb
            .if    al>60h
                sub    al,20H
            .endif
            mov    byte ptr[edi],al
            lodsb
            mov    byte ptr[edi+1],al
            mov    al,&#39;\&#39;
            inc    edi
            inc    edi
            stosb
            mov    al,&#39;>&#39;
            stosb   
            invoke _ConsolePrint,addr odoa
            jmp    @B
        .endif

        invoke _ConsolePrint,addr szError
        invoke _ConsolePrint,addr odoa
        jmp   @B

        end    start


文件common.inc:
IOCTL_GET_DIRECTORY_INFO equ CTL_CODE(FILE_DEVICE_UNKNOWN, 800h, METHOD_BUFFERED, FILE_READ_ACCESS + FILE_WRITE_ACCESS)

FILE_DIRECTORY_INFORMATION STRUCT        ; sizeof = 48h
    NextEntryOffset        DWORD    ?
    FileIndex            DWORD    ?
    CreationTime        LARGE_INTEGER    <>
    LastAccessTime        LARGE_INTEGER    <>
    LastWriteTime        LARGE_INTEGER    <>
    ChangeTime            LARGE_INTEGER    <>
    EndOfFile            LARGE_INTEGER    <>
    AllocationSize        LARGE_INTEGER    <>
    FileAttributes        DWORD    ?
    FileNameLength        DWORD    ?
    FileName            WORD 1 dup(?)    ; WCHAR
                        WORD 3 dup(?)    ; padding
FILE_DIRECTORY_INFORMATION ENDS
PFILE_DIRECTORY_INFORMATION typedef ptr FILE_DIRECTORY_INFORMATION

DIRECTORY_INFO  STRUCT
    FileName    DB    50 dup(?)
    CreationTime    LARGE_INTEGER    <>
    EndOfFile    LARGE_INTEGER    <>
    FileAttributes    DWORD    ?
    Flag        DWORD    ?
DIRECTORY_INFO     ENDS

参考资料:
(1)Windows平台内核级文件访问
[url]http://www.retcvc.com/cgi-bin/topic.cgi?forum=17&topic=1113&show=0[/url]
(2)好象是Windows源代码[url]http://www.koders.com/c/fid304D967B0B1C3F3B1FB80A6D31B5FABA820B185B.aspx[/url]
(3)Rajeev Nagar, "Windows NT File System Internals. A Developer&#39;s Guide", O&#39;Reilly



页: [1]
© 1999-2008 EvilOctal Security Team