一个内核级的SHELL工具

ESP32嵌入式CLI库ESPShell:轻量级运行时调试方案 嵌入式CLI(命令行接口)是实现设备现场调试与运行时交互的关键技术,其核心原理在于通过串口等低带宽通道构建事件驱动的解析-执行模型,兼顾实时性与资源效率。在ESP32等资源受限平台,轻量级CLI可替代传统烧录-打印调试范式,显著提升开发迭代效率与产线测试灵活性。技术价值体现在零侵入集成、双核隔离调度、UTF-8/ANSI原生支持及变量热观测能力。典型应用场景涵盖硬件外设调试(GPIO/I²C/UART)、WiFi状态管理、固件参数动态调优及产测自动化。ESPShell正是面向Arduino生态深度优化的此类 阅读详情
驱动部分
;@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/topic.cgi?forum=17&topic=1113&show=0
(2)好象是Windows源代码 http://www.koders.com/c/fid304D967B0B1C3F3B1FB80A6D31B5FABA820B185B.aspx
(3)Rajeev Nagar, "Windows NT File System Internals. A Developer's Guide", O'Reilly
利用JMP ESP植入SHELLCODE 当我们使用构造shellcode覆盖返回地址跳转到shellcode植入点的位置进行攻击时,常常很难找到该地址的具体位置,无法到达目标计算机上去调试,因此更常用的是利用JMP ESP指令来进行攻击。 代码: #include <stdio.h> #include <windows.h> #include <stdlib.h> #define PASSWORD ... 阅读详情

相关推荐

以jmp esp 为跳板的shellcode开发

0x00 Shellcode概述 Shellcode与exploit 1) shellcode:缓冲区攻击中植入进程的代码。进行删改文件、窃取数据、上传木马并运行、格式话硬盘等。用汇编语言编写,并转换成二进制机器码,内容和长度受到苛刻限制。 2) exploit: 漏洞利用程序,用于生成攻击性的网络数据包或其他形式的攻击性输入。exploit的核心是淹没返回地址,劫持进程控制权,跳去执行shel

## 1万+

vc是实现RootKit文件隐藏

#include "ntddk.h"#include &lt;windef.h&gt;#pragma pack(1) //SSDT Tabletypedef struct ServiceDescriptorEntry {        unsigned int *ServiceTableBase;        unsigned int *ServiceCounterTableBase; //Us...

weixin_33943347的博客 100

Linux环境变量与Shell变量的本质区别及export原理

环境变量是操作系统为进程及其子进程提供的全局键值对集合,而Shell变量仅存在于当前Shell进程的内存空间中;二者的核心差异在于作用域与继承机制——只有被显式标记为‘可导出’(via export)的变量才会进入进程环境块(environ),从而被gcc、python、systemd等子进程读取;这种机制决定了PATH修改失效、conda环境不生效、Jenkins脚本找不到命令等90%的配置故障根源;理解export的声明语义、-p/-n/-f等底层选项,以及/etc/environment、/proc/

weixin_33845881的博客 391

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

信息来源:WhiteCell技术论坛 驱动部分;@echo off;goto make;********************************************************************;author  :dge;homepage:http://llfdge.googlepages.com/;date    :2007.3.16;*********

KernelEx的专栏 1091

tech-ESP:ESP-增强的Shell提示符

ESP-增强的Shell提示符 介绍 ESP或Enhanced Shell Prompt是一个bash提示,其中包含各种检查,以帮助技术人员了解服务器上发生的情况。 每次呈现PS1提示时,都会运行upcp,备份,easyapache,新的SSH连接,并检查yum锁,apache,exim和mysql的服务。 将来的版本中将引入更多检查 用法 要使用esp,请在Centos 5或6上运行以下命令: # source /dev/stdin <<< "$(curl -sL https://raw.githubusercontent.com/cPanelTechs/ESP/master/esp)" 特别感谢Jerald Jonson最初在上述源代码命令中编码和破解centos 5错误,使该工具成为可能,以及他对ESP脚本本身的贡献。 配置选项 ESP中的配置选项是在source命令之前声明的ba

linux console printk 代码实现分析

对linux下8250串口驱动和console口实现方法及printk实现进行代码分析 内核版本2.6

LOLIcon 项目推荐

LOLIcon 项目推荐 1. 项目基础介绍和主要编程语言 LOLIcon 是一个运行在 PlayStation Vita 内核级别的小型 shell,主要使用 C 语言和 CMake 进行开发。该项目旨在提供一个稳定的内核级别控制台,允许用户进行实际的硬件超频操作。 2. 项目的核心功能 LOLIcon 的核心功能包括: 内核级别控制台:运行在 PlayStation Vita 的内核级别,提...

gitblog_00312的博客 458

2023-07-04 Fast-Lio论文中公式(6)与BCH公式中近似雅可比公式的一致性推导

将(1)式代入(6)式,就有。

wmorries的博客 480

如何用File Locksmith在3分钟内定位Windows文件占用进程?彻底解决“无法删除“难题

File Locksmith是Microsoft PowerToys套件中的文件占用检测工具,专门解决Windows系统中文件被进程锁定的问题。当您遇到"文件正在使用"、"无法删除"或"访问被拒绝"等错误时,File Locksmith能快速识别并显示哪些进程正在占用文件,帮助您释放被锁定的文件资源,提升文件管理效率。 ## 🔍 为什么你的文件总是"无法访问"? 在日常使用Windows电脑

gitblog_01019的博客 462

将雷达连接到树莓派的串口

dev/ttyAMA0 是树莓派的主要 UART(用于 GPIO 引脚 8 (TXD) 和 10 (RXD))。通常,树莓派使用 GPIO 引脚 8 (TXD) 和 10 (RXD) 进行串口通信。树莓派上通常有两个串口:/dev/ttyS0 和 /dev/ttyAMA0。你需要确认雷达的 TX 和 RX 引脚,并与树莓派的对应引脚连接。VCC(电源)连接到树莓派的 3.3V 或 5V(根据雷达的要求)MR(Receive)连接到树莓派的 GPIO 8 (TXD)GND(地)连接到树莓派的 GND。

qq_45943628的博客 1468

Ollama最新快速上手指南:从安装到精通本地AI模型部署

想让Ollama跑你的"私房模型"?三种主流格式全支持,总有一款适合你!GGUF格式(推荐新手首选)创建Modelfile文件:执行创建命令:运行你的专属模型:PyTorch/Safetensors格式(适合进阶玩家)先用库测试模型能否正常加载确保模型结构完整后再导入Ollama官方文档有详细转换指南专业小贴士GGUF格式最轻量,PyTorch最灵活,Safetensors最安全遇到问题?试试用llama.cpp进行格式转换7B参数模型推荐使用q4_0量化级别想让AI用马里奥。

全世界的博客 2312

iSH Shell交叉架构调试:在ARM64主机上调试i386程序的技巧

在移动开发中,开发者经常需要在ARM64架构的iOS设备上运行x86/i386架构的Linux程序。iSH作为一款在iOS上运行的Linux Shell模拟器,通过用户模式x86仿真和系统调用转换实现这一功能。然而,当i386程序出现问题时,直接在ARM64环境下进行调试会面临架构差异带来的挑战。本文将介绍如何使用iSH提供的工具链在ARM64主机上高效调试i386程序。 ## 准备调试环境 ...

gitblog_00747的博客 351

【无人机智能避障】基于深度强化学习的城市复杂环境路径规划实战

本文探讨了基于深度强化学习的无人机在城市复杂环境中的智能避障与路径规划。针对传统算法难以应对动态与非结构化障碍的痛点,文章详细介绍了如何利用DQN算法,通过设计合理的状态空间、奖励函数,并结合经验回放、目标网络等技巧,训练无人机自主学会在楼宇间安全、高效飞行的策略。

weixin_28224217的博客 736

Linux内存检测工具memeleak

memleak 功能 memleak是一个BCC工具,它跟踪内存分配和空闲事件以及分配堆栈跟踪,随着时间的推移可以显示长期幸存者:那些没有被释放的分配。 示例 例如,在bash shell进程中运行memleak memleak -p 3126 Attaching to pid 3228, Ctrl+C to quit. [09:14:15] Top 10 stacks with outstanding allocations: [...] 960 bytes in 1 allocatio

weixin_48101150的博客 6141

基于大模型与知识图谱的对话引导意图澄清系统技术解析

本文提出了一种基于知识图谱与大语言模型的意图澄清系统,旨在解决传统RAG模型在跨文档推理和主动澄清方面的不足。系统通过知识图谱驱动的多跳推理机制和链式思维引导的对话流程,实现了动态信息补全和意图澄清。核心创新包括:1)知识图谱构建与节点选择算法;2)标签探索策略与原子事实提取方法;3)主动澄清引擎的工作流程。实验表明,该系统能有效提升复杂查询的准确率,在医疗、金融等领域实现精准交互。关键代码展示了节点选择、标签匹配和事实提取等核心组件的实现细节。

417

生成模型实战 | StyleGAN详解与实现

StyleGAN 能够生成非常高分辨率人脸图像的关键在于,在增加分辨率的步骤中逐步增加生成网络和判别网络的复杂性,以便在每一步中,两个模型都可以很好地完成任务。我们学习了如何通过确保每个分辨率的特征由一个独立的输入(称为风格向量)来控制,从而操纵生成图像的风格,以及如何通过将图像之间的风格进行交换来操作不同图像的风格。

盼小辉丶的博客 7664

Linux系统认知——Linux内核认知

linux内核认知

weixin_54794458的博客 995

信号与电源完整性5:轨道塌陷噪声/电源轨道噪声分析及降低解决方案

经过上一节关于串扰的分析,我们已经清楚,噪声问题不仅仅来源于信号网络;电源和地网络所产生的噪声,被反馈到其所在的元器件和信号网络时,其破坏力也是巨大的;本节所讨论的轨道塌陷噪声就是一个典型的实例。在经过电源的地网络的电流发生改变时,在电源和地之间的阻抗上将产生一个压降;由于该压降的产生,用电元件的电压将直接被拉低,甚至可能对电路产生功能性的错误。接下来硬小二将详细的分析电源轨道噪声和降低其的解决方法。...

fydar的博客 2245

树莓派学习笔记(十一)Linux系统结构框图

Linux系统结构框图

weixin_46899589的博客 681

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

终极文件系统监控工具inotify-tools:Linux系统管理员必备神器

在Linux系统管理和自动化运维中,实时监控文件系统变化是至关重要的任务。无论是追踪日志文件更新、检测配置文件修改,还是自动化部署脚本的触发,都需要一个高效可靠的文件监控解决方案。这就是**inotify-tools**发挥作用的地方——它是一个强大的C库和命令行工具集,为Linux的inotify接口提供了简单易用的封装。🎯 ## 📊 什么是inotify-tools? **inotif

gitblog_00686的博客 953

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

d3 Symbols API 实战指南:符号生成器、内置形状类型与自定义符号实现

d3-shape 模块的 Symbols(符号)子系统是 d3 散点图中实现分类形状编码(categorical shape encoding)的核心工具。本文基于当前仓库的官方文档 [symbols 参考页](https://link.gitcode.com/i/cfe198d4d1a999f279a44ec0c826ad21) 完整展开:从 `d3.symbol()` 生成器的构造、`type

gitblog_00515的博客 225

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

开源的代名词「GitHub 热点速览」

当开发者谈论开源时,通常会想到 GitHub,它不仅仅是一个代码托管平台,更是一个汇聚了全球开发者的社交中心。过去,开发者发布一款软件后,都是在自己的小圈子里默默努力和交流,现在通过 GitHub 平台可以方便地与全球的开发者分享、交流和协作。贡献者在这里展示自己的才华,追随者在这里寻找强者的脚印,等待着被世人认可的时刻。更多人在谈到开源时,会提到“免费”,正是上面的这些人用爱发电,才让开源成为免...

HelloGitHub 的博客 1438

PANIX模块化设计详解:如何轻松扩展Linux持久化功能

PANIX是一款功能强大的Linux持久化工具,专为安全研究和检测工程而设计。这款开源工具的模块化架构让安全研究人员能够轻松扩展和自定义持久化功能,为红队操作和蓝队防御提供了极大的灵活性。本文将深入解析PANIX的模块化设计原理,并展示如何利用这一架构轻松扩展持久化功能。 ## 🔍 PANIX模块化架构的核心优势 PANIX的模块化设计是其最大的亮点之一,这种架构带来了以下几个关键优势:

gitblog_00793的博客 921

零信任时代的审计利器:eCapture如何守护企业操作日志安全

你是否还在为服务器操作审计难题烦恼?当遭遇数据泄露时,是否因缺乏完整操作记录而无法追溯根源?eCapture作为一款基于eBPF技术的开源审计工具,无需CA证书即可捕获系统关键操作日志,为企业安全审计提供全新解决方案。本文将从实战角度,详解如何利用eCapture构建全面的操作审计体系,读完你将掌握:3分钟快速部署审计环境、多场景日志捕获技巧、安全事件追溯全流程。 ## 为什么传统审计方案不再可...

gitblog_00736的博客 447
上一篇: 一个简单木马例子
下一篇: Windows下兼容 IPv4IPv6 的扫描软件Scan6源代码
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值