一个内核级的SHELL工具源代码

VirtualBox安装Windows 98步骤 一、准备工作 1、下载Windows 98 SE光盘镜像,网上下载307.3M的光盘镜像,大部分网站都是这个镜像,如下载地址:http://www.itmop.com/downinfo/14216.html,这个镜像已做成启动盘,还是比较方便。但是这个镜像没有集成KEY,后期输入有点不方便,网上还有个RAR压缩的安装文件,解开是WIN98和WIN98SE两个版本的安装文件,WIN98SE已集成了KEY。用UltraISO打开307.3M的光盘镜像删除win98下的文件,将已集成了KEY的WIN98SE的文件 阅读详情
信息来源:WhiteCell技术论坛

驱动部分
;@echo off
;goto make

;********************************************************************
;author  :dge
;homepage:http://llfdge.googlepages.com/
;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:http://llfdge.googlepages.com/
;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        '<C> 版权所有  2007  dge',0dh,0ah
                db        'http://llfdge.googlepages.com',0dh,0ah,0        
szDir          db      'dir',0dh,0ah,0
szExit          db      'exit',0dh,0ah,0
szCdB          db      'cd..',0dh,0ah,0
szCdC          db        'cd ..',0dh,0ah,0
szCdA          db      'cd ',0
szRoot          db      ':',0dh,0ah,0
szCaption      db        'FHF V1.0',0
szGet          db      100 dup(?)
szError        db      '不支持此命令',0dh,0ah,0   
last            db      '>',0
odoa            db      0dh,0ah,0
szFilter        db        '*.*',0
szOutputA      db        '%04d-%02d-%02d  %02d:%02d    %s      %-8d    %-s',0dh,0ah,0
szOutputB      db        '%04d-%02d-%02d  %02d:%02d            %-8d    %-s',0dh,0ah,0
szIr            db        '<DIR>',0
szOutput        db      1024 dup(?)
szFail          db        '系统找不到指定路径',0dh,0ah,0
FLAG                db      0
adwOutBuffer    db      65535 dup(?)
hDevice        dd        ?
inBuffer        db        100 dup(?)   
dwBytesReturned dd        ?
count          dd        ?
f              db      '%s %s',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,'>'
                mov    cx,100D
                repne  scasb
                dec        edi               
          @@:        dec    edi
                cmp    byte ptr[edi],'/'
                jne    @B
                cmp    byte ptr[edi-1],':'
                jne    @F  
                inc        edi
          @@:  mov    byte ptr[edi],'>'
                inc    edi
                mov    byte ptr[edi],0
                ret
_SubPath        endp

_AddPath        proc    lpSz

                pushad
                lea        edi,szBuffer
                mov    al,'>'
                mov    cx,100D
                repne  scasb
                dec        edi
                .if        byte ptr[edi-1]=='/'
                        mov        byte ptr[edi],0
                .else
                        mov        byte ptr[edi],'/'
                        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],'/'
                mov    byte ptr[esi+1],'*'
                mov        byte ptr[esi+2],'.'
                mov        byte ptr[esi+3],'*'
                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],'>'
                        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 ==  'c'                    
                        inc        esi
                        movzx        eax,byte ptr[esi]
                        .if        eax == 'd'
                                
                                inc        esi
                                movzx        eax,byte ptr[esi]
                                .if    eax == ' '                                      
                                        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],'/'
                        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,'/'
                        inc        edi
                        inc        edi
                        stosb
                        mov        al,'>'
                        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平台内核级文件访问
http://www.retcvc.com/cgi-bin/to ... pic=1113&show=0
(2)好象是Windows源代码http://www.koders.com/c/fid304D9 ... B5FABA820B185B.aspx
(3)Rajeev Nagar, "Windows NT File System Internals. A Developer's Guide", O'Reilly
Pixel 4上构建KernelSU与Frida的Android内核级分析环境 Android系统安全与逆向分析是移动安全领域的核心课题,其关键在于理解系统底层机制与动态分析技术。通过内核级权限管理工具与动态代码插桩框架的结合,可以实现对应用行为的深度监控与调试。KernelSU作为一种基于Linux内核的Root方案,相比传统用户空间方案,提供了更底层的权限控制与隐蔽性,尤其适用于对抗反调试机制。Frida作为动态插桩的瑞士军刀,支持对Java与Native层的函数Hook、内存操作及脱壳等高级功能。在Pixel 4这类开发者友好设备上,从内核编译到环境部署的完整实践,不仅能搭建一个 阅读详情

相关推荐

utf8-kernel-2.6.22.5-fonts-1.patch.bz2

utf8-kernel-2.6.22.5-fonts-1.patch.bz2

Linux应用程序、shell脚本程序、驱动程序参数传递的方法

我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……/bin/bashecho "Shell 传递参数!echo "文件名:$0";echo "第一个参数为:$1";echo "第二个参数为:$2";echo "第三个参数为:$3";

123 8549

内核级的手动杀毒、进程管理工具 PowerTool_4.2_PortableSoft

内核级的手动杀毒、进程管理工具 PowerTool_4.2_PortableSoft

shell脚本学习——实战案例

一、监控一个主机的存活状态 方案1 [root@localhost AnLi]# sh ping.sh 192.168.3.222 192.168.3.222 is up [root@localhost AnLi]# sh ping.sh 192.168.3.223 192.168.3.223 is down [root@localhost AnLi]# cat ping.sh #!/bin/bash # ***************************************************

qq_43427354的博客 999

一款改自IPHook的IP数据包监控过滤程序

一款改自IPHook的IP数据包监控过滤程序 By ccc 2009-6-13 完成(ch2zh1@tom.com) IP包过滤程序采用IPHook驱动器程序,在内核层用钩子回调函数(IpHookFilter)勾住系统自带的IP过滤驱动器(System32\Drivers\IpFltDrv.sys),从而返回过滤驱动器传输的所有IP包数据。可以通过回调函数的返回值(PF_DROP、PF_FORWARD、PF_PASS),指示滤波驱动器对包的处理,是抛弃还是通过。 应用启动驱动器过程可以使用驱动器的安装,或使用系统的服务控制器(ServiceControl)直接启动和停止驱动程序。 服务控制器利用OpenSCManager等服务控制函数控制驱动程序的加载与卸载。这就使得应用程序可以在运行时自动加载和卸载需要的驱动程序。而不必设置驱动程序的安装过程。 初始的IPHook.sys只提供了IP包的监视过程即,仅仅返回IP头信息。在应用中解释并显示这个头信息。经过写改的IPHook增加了对IP包的过滤处理,有几个设置命令: START_IP_HOOK :启动钩子过滤命令,建立连接IP滤波器的回调函数(原始命令) STOP_IP_HOOK :停止钩子过滤命令,撤销IP滤波器回调函数(原始命令) ADD_IP_HOOKADDR :添加过滤IP地址,回调函数判断IP包,以决定是放弃还是通过(新命令) DEL_IP_HOOKADDR :删除过滤IP地址(新命令) ADD_IP_HOOKPORT :添加过滤端口号(新命令) DEL_IP_HOOKPORT :删除过滤端口号(新命令) ADD_IP_OVER_HOOK :添加置换的IP地址,用于对指定目的的IP包置换源地址和端口号(New) DEL_IP_OVER_HOOK :取消IP地址置换。(New) 应用程序可一次设置和删除对个滤波地址和端口号。对于重复设置,IPHook可以正确识别并加以剔除。这是一个演示程序主要想说明windows2000驱动程序编程过程,及应用自动加载和卸载驱动的方式。 驱动程序的源码在DrvChecked.rar中,要想正确编译,必须安装windows2000 DDK,并在VS2003下设置包含目录指向DDK的目录,库目录也要指向DDK的库目录: C:\NTDDK\inc C:\NTDDK\inc\ddk C:\NTDDK\libchk\i386 并且在排列上一定要排在头两个位置上。 这个驱动程序在VC++下是可以正确编译通过的。驱动程序名:DrvChecked.sys。使用时应该改为:iphook.sys。delphi下的应用程序为:IPPacketMonitor.exe,它使用IPHook.sys。 任何人可以自己编译和修改这个驱动程序,使之能够按照一定的方式运行,这里给出的只是本人的一个想法,希望能给各位带来一点帮助。任何应用程序都可以想打开文件一样使用这个驱动程序,关于使用方法请参考Release Notes.htm提供的线索。 有什么问题和建议请电邮:ch2zh1@tom.com

自己写的shell源码

这是我自制的linux shell 想学shell的可以看一下,里面包含了许多有关linux命令,目录切换,多进程的操作。。。

一个内核级的SHELL工具

驱动部分;@echo off;goto make;********************************************************************;author  :dge;homepage:http://llfdge.googlepages.com/;date    :2007.3.16;**********************************

995

DotNetFX-NET Framework 4.5.2

.NET Framework 4.5.2 是由微软开发的一款强大的应用程序框架,作为Windows操作系统上的核心组件,

KernelSU Next终极指南:10分钟掌握内核级Android权限管理

在Android系统定制和深度优化的世界里,内核级root解决方案一直是最专业、最稳定的选择。KernelSU Next作为一款基于内核的高级root工具,为技术爱好者和开发者提供了前所未有的Android权限管理能力。这款内核级root解决方案通过直接在Linux内核层实现权限控制,避免了传统root方法对系统稳定性的破坏,让Android系统定制变得更加安全可靠。 ## 核心概念解析:内核级

gitblog_00077的博客 1027

海康VisionMaster零代码开发实战:从PLC工程师到视觉专家的捷径

本文为PLC工程师提供了利用海康VisionMaster视觉平台实现零代码视觉开发的实战指南。文章详细阐述了如何通过图形化流程设计替代传统编程,快速搭建视觉检测应用,并实现与PLC的无缝通讯,是工程师从设备控制迈向视觉系统集成的有效捷径。

weixin_29201859的博客 293

tcllib2.0 package - csv

tcl lib 的csv库

shin 861

KernelSU Next 内核级Root解决方案实战指南

KernelSU Next作为Android设备的内核级root解决方案,为开发者和技术爱好者提供了基于内核的系统权限管理能力。这款内核级root工具通过创新的内核模块技术实现安全可控的权限管理,支持从Android 4.4到6.6的内核版本,为ARM64、ARMv7和x86_64架构提供完整的root环境部署方案。 ## 🔍 技术架构深度解析 KernelSU Next的核心价值在于其内核

gitblog_02389的博客 355

【无标题】STM32F767串口空闲中断+DMA实现不定帧长度的接收

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、配置串口与DMA二、空闲中断服务函数二.串口+DMA发送三、主函数总结 前言 提示:这里可以添加本文要记录的大概内容: 使用STM32F767实现串口空闲中断+DMA传输接收不定帧长度数据,以及当中可能遇到的错误总结 提示:以下是本篇文章正文内容,下面案例可供参考 一、配置串口与DMA //硬件模块配置可直接通过CUBEMX配置 void MX_USART1_UART_Init(void) { huart1.In.

qq_42589531的博客 1168

linux shell脚本攻略第3版_那些被遗忘的 UNIX/Linux 经典著作

来自:程序员书库(ID:OpenSourceTop) 编译书单来自:https://medium.com/@sarahelson81/top-6-books-for-unix-and-shell-scripting-beginners-d3e4de7af7a6你可以通过许多种不同的方式去学习新的编程语言,有些人关注博客,有些人看在线教程,而有些人则喜欢安安静静坐下来读一本好书,就我个人而言,我还是...

weixin_39628180的博客 338

华为OD机试真题 新系统2026-04-01 Java&Go 实现【勇攀数字高峰】

请你在给定的数字地形图中寻找登山路径,数字代表当前位置的海拔高度,要求从最低海拔出发,不断攀登,最终到达最高山峰。你需要寻找所有满足条件的登山路径。地图已经保证最低海拔和最高山峰都只有一个。

MISAYAONE的博客 627

学习笔记:TF卡启动荔枝派Nano(全志F1C200S)

荔枝派Nano编译Kernel报错报错内容如下编译烧录 报错内容如下 No controllers found No ethernet found. 从这些报错我真没看从出啥问题,也是在网上找,说是没有找到flash,是因为淘宝买的板子更换了flash,需要在u-boot里面重新适配型号: 板子的型号为xt25f128,但是实际u-boot的配置里面不是需要重新更改: u-boot/arch/arm/dts/suniv-f1c100s-licheepi-nano.dts &spi0 { pin

热爱科技,物联,程序开发等 2135

Shell命令的七层解码:从输入到系统调用的完整执行链

Shell命令不是简单的功能调用,而是字符流经终端缓冲、行编辑、词法语法分析、变量扩展、重定向设置直至execve系统调用的精密七层转化过程。理解这一底层执行链,是掌握Linux命令行为、诊断管道阻塞、修复重定向失效、规避子shell变量丢失等高频问题的技术根基。尤其在涉及adb shell权限控制、CTF反弹shell构造、WSL磁盘释放异常等跨层场景时,必须回归bash解释器的逐层处理逻辑与内核接口契约。本文聚焦shell命令的本质机制,揭示从用户输入到进程执行的完整数据流路径。

weixin_34151004的博客 318

YOLOv8实战教程:从模型训练到改进的全流程指南

回顾这段YOLOv8的实战历程,从最初的模型训练到后来的各种改进尝试,我深刻体会到目标检测技术的魅力与挑战。YOLOv8作为一款优秀的框架,不仅易用性强,而且具备很强的可扩展性,让我能在其基础上不断创新。未来,我计划在以下几个方向继续探索:一是将YOLOv8与多模态技术结合,尝试实现图像与文本的联合目标检测;二是深入研究自监督学习在YOLOv8中的应用,减少对标注数据的依赖;三是探索YOLOv8在更广泛场景的部署,如机器人、自动驾驶等。

LXY_LOVE36的博客 281

PowerToys File Locksmith:技术架构与文件锁定检测的深度解析

在Windows系统管理实践中,文件锁定问题一直是困扰开发者和系统管理员的技术难题。当用户尝试删除、移动或修改文件时,系统提示"文件正在被其他程序使用",却无法快速定位具体是哪个进程持有文件句柄。Microsoft PowerToys中的File Locksmith模块通过深入Windows内核级别的技术实现,为解决这一经典问题提供了专业级解决方案。 ## 文件锁定检测的技术挑战与架构设计原理

gitblog_00297的博客 360

手势识别器:实现手部动作识别器

在本篇文章中,我们将使用Python来实现一个简单的手部动作识别器。然后,我们通过循环从摄像头获取每一帧图像,并对每一帧图像进行处理。我们提取手部关键点并计算手势的特征向量,然后将其添加到特征列表和标签列表中。接下来,我们再次从摄像头获取每一帧图像,并进行手势识别。我们提取手部关键点并计算手势的特征向量,然后使用训练好的分类器来预测手势,并在图像上显示出来。在这个实现中,我们将使用MediaPipe库来检测和跟踪手部关键点,然后使用K最近邻(K-Nearest Neighbors)算法对手势进行分类。

BitSlinger的博客 241

opencode : 无法将“opencode”项识别为 cmdlet、函数、脚本文件或可运行程序的名称 解决方案

本文主要介绍了opencode : 无法将“opencode”项识别为 cmdlet、函数、脚本文件或可运行程序的名称解决方案,希望能对使用opencode的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 11万+

Linux U-Boot 与内核启动流程深度解析:从上电到 Shell 的完整之旅

U-Boot (Das U-Boot) 是遵循 GPL 条款的开放源代码项目,由 DENX 软件工程中心的 Wolfgang Denk 创建。它支持多种架构(ARM、PowerPC、MIPS、x86 等)和多种板卡。硬件初始化(CPU、内存、外设)引导操作系统加载提供交互式命令行支持网络启动(TFTP、NFS)支持多种文件系统(FAT、EXT4、JFFS2)启动阶段:上电 → ROM → SPL → U-Boot → 内核 → 文件系统U-Boot 功能。

1197

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

KernelSU实战指南:从入门到精通的三大核心问题解决方案

KernelSU作为Android设备上基于内核的root解决方案,以其独特的内核级权限管理能力和模块化设计赢得了众多开发者和高级用户的青睐。不同于传统的用户空间root工具,KernelSU直接在内核层面工作,提供了更加稳定和强大的系统控制能力。本文将针对KernelSU使用过程中最常见的三大核心问题,提供详细的解决方案和实践指导。 ## 问题识别:为什么我的设备不支持KernelSU? 许

gitblog_00750的博客 985

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

KernelSU Next 模块开发实战:从零开始构建你的第一个内核模块

KernelSU Next 是一款基于内核的 Android 设备 Root 解决方案,它为开发者提供了强大的模块化扩展能力。本文将为你详细介绍如何从零开始构建你的第一个 KernelSU Next 内核模块,涵盖模块结构、开发流程和最佳实践。无论你是 Android 开发者还是系统爱好者,通过本指南都能快速掌握 KernelSU Next 模块开发的核心技能。 ## 什么是 KernelSU

gitblog_00099的博客 683

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

如何在10分钟内高效禁用Windows安全机制:EfiGuard专业配置实战方案

EfiGuard是一款强大的UEFI启动工具,能够在系统启动时直接禁用Windows的PatchGuard和驱动程序签名强制(DSE),为安全研究人员和系统管理员提供深度系统控制能力。本文将详细介绍如何快速配置EfiGuard,实现高效的系统安全机制绕过,同时提供多种实现路径和最佳实践建议。 ## 问题场景:传统安全机制绕过的局限性 许多安全研究人员和系统开发者在进行内核级调试或驱动开发时,都

gitblog_00186的博客 1045
上一篇: windbg 使用
下一篇: 仿真WINDOWS PE加载器的程序
普通网友
博客等级 码龄17年 1粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值