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

Pixel 4上构建KernelSU与Frida的Android内核级分析环境 Android系统安全与逆向分析是移动安全领域的核心课题,其关键在于理解系统底层机制与动态分析技术。通过内核级权限管理工具与动态代码插桩框架的结合,可以实现对应用行为的深度监控与调试。KernelSU作为一种基于Linux内核的Root方案,相比传统用户空间方案,提供了更底层的权限控制与隐蔽性,尤其适用于对抗反调试机制。Frida作为动态插桩的瑞士军刀,支持对Java与Native层的函数Hook、内存操作及脱壳等高级功能。在Pixel 4这类开发者友好设备上,从内核编译到环境部署的完整实践,不仅能搭建一个 阅读详情
驱动部分
;@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 
基于eBPF实现AI Agent无侵入式深度可观测性实战指南 在分布式系统和云原生架构中,可观测性是保障应用稳定运行的核心技术,它通过日志、指标和追踪三大支柱,帮助开发者理解系统内部状态。其原理在于从应用运行时采集数据,分析性能瓶颈与异常根因。对于AI Agent这类新型智能应用,传统监控手段难以应对其非确定性、工具链复杂的特性,无法有效追踪LLM调用、工具执行等关键路径。eBPF技术通过在Linux内核安全运行沙盒程序,实现对系统调用的无侵入式追踪,为动态应用提供了内核级的深度观测能力。这一技术价值在于无需修改代码即可透视应用行为,特别适用于AI Agent的性能剖 阅读详情

相关推荐

Shell源码(Shell源码)

Shell源码Shell源码Shell源码Shell源码Shell源码Shell源码Shell源码Shell源码Shell源码Shell源码

【OS xv6】1 万字详解shell源码解析命令(内含wsl+vscode调试xv6教程 文档第一章助读)

这个系列是对仿unix基本接口和内部设计的简化教学操作系统xv6的文档及源码阅读理解,仅个人学习笔记理解,有误见谅哈哈。本文提供用vsCode连接WSL使用GDB调试xv6教程,及用户源码调试教程,及xv6中文文档“Chapter 1 Operating system interfaces”详解,最后对xv6的shell与命令解析相关源码进行详细解析(流程图),可视化地展示各类命令在xv6的解析过程。内含优质相关博文推荐。

深大cs课程实验及学习笔记,ccfcsp部分真题,华为题库 4447

postgresql 数据库 timescaledb 函数time_bucket_gapfill()报错解决及更换 license

最近在工作中使用postgresql 和 timescaledb 的time_bucket_gapfill()函数 报错,让更换license,在网上找了一大圈,没有找到,最后解决了这个问题,这篇文章记录我的解决办法查看timescaledb.license参数命令:show timescaledb.license;修改命令: 结果不行,报错如下:lter system set timescaledb.license=‘timescale’;那只能换包了如果出现上面那种情况,那我们只能先从官网上下载带 '

yang_z_1的博客 3251

Shell 快速入门

Shell 快速入门(零):目录 Shell 快速入门定位于快速帮助初学者掌握 Shell 的语法,快速编写 Shell 脚本。对于 Shell 学习者来说,应该将 Shell 当成是工具,掌握了基础的语法之后就直接使用。当后面需要一些更高级的语法或者功能时,再去查找相应的资料。 这个系列与其他 Shell 入门教程不同的是:这个系列专注于用最少的知识,让你快速掌握必须的语法,最终实现快速上手的目...

wh 700

如何点亮一颗sensor

要点亮一个sensor需要从,时钟、sensorI2C,供电,reset脚,mipi的配置几个方面一一确认。 reset脚拉高 给sensor的时钟有没有。(目前用到的常为24MHZ) 供电 查看sensor的数据手册,看有几个电源,用示波器量一下是否为手册规定的电压 比如:DVDD 数字电压: AVDD模拟电压 DOVDD芯片引脚出来的电压等为多少。 sensor的I2C能否抓到 将I2C的口对应上,用示波器量取i2c的波形。 检查有应答并且数据正确。读写地址是否正...

weixin_40787463的博客 3652

Tessent_StdcellLib

第二种为 Tessent Cell lib,既可用于功能仿真,也可以用于测试逻辑插入。lib包含了用于仿真的功能信息,也包含DFT cell属性。如何使用tessent工具将stdcell verilog 仿真模型转换为tessent自己的lib。运行后工具会生成一个atpg的lib文件,打开文件,找到一个带SI的DFF,只有功能描述。tessnt lib分为两种,第一种为ATBG lib,可以用于仿真;打开生成的lib文件,多了dft_cell_selection。第二部:编写attributes文件。

qq_40411444的博客 2138

Shell主要逻辑源码级分析(1)——SHELL运行流程

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33859665的博客 352

用SOLIDWORKS从零画一个履带机器人,手把手教你搞定底盘和传动

本文详细介绍了如何使用SOLIDWORKS从零开始设计履带式机器人,重点讲解底盘结构优化和传动系统设计的关键步骤。通过七个阶段的实战指南,包括前期规划、底盘建模、驱动系统装配、履带生成、动态模拟等,帮助工程师和爱好者掌握履带机器人的核心设计技巧,提升地形适应能力和动力效率。

weixin_30872499的博客 632

运维常用的shell脚本源码

Shell脚本是系统运维工作当中最重要的一部分之一,能够通过编写Shell脚本来自动化执行系统管理任务,提高工作效率,减少出错概率。在这篇文章中,我将介绍运维常用的Shell脚本源码。

派大星的不眠博客 2011

将点云坐标转换成世界坐标的demo

将点云坐标转换成世界坐标的demo

howard789的博客 2208

RANSAC地面点分割:从原理到C++实战优化

本文深入解析RANSAC算法在点云地面分割中的原理与C++实战优化,涵盖动态迭代次数、自适应阈值等关键技巧,通过并行计算和内存访问优化提升性能,适用于激光雷达点云处理。

weixin_29015051的博客 279

一个内核级的SHELL工具

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

996

【RF】Receiver Function接收函数:从理论到实践的深度解析

本文深入解析地震学中的接收函数(Receiver Function, RF)技术,从理论原理到实践操作。文章将RF比作地球的“听诊器”,详细阐述了其通过反褶积剥离震源影响、揭示地下结构(如莫霍面)的核心机制,并提供了使用Python和rf库进行数据处理、计算、动校正与叠加的完整实战流程,同时探讨了其应用、局限性与常见问题的解决方案。

Jerry的专栏 122

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

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

gitblog_00077的博客 1027

SAP Workflow审批功能实例详细过程

SAP Workflow审批功能实例详细过程

陈送平的博客 6575

visio安装包

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

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

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

gitblog_02389的博客 355

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

weixin_39628180的博客 338

WINCC7.3破解文件

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

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

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

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

weixin_34151004的博客 318

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

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

gitblog_00297的博客 360

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

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

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

gitblog_00750的博客 985

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

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

gitblog_00099的博客 683

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

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

gitblog_00186的博客 1045

【Linux】期末复习

Linux版本由形如x1.x2.x3三组数字组成查看软件是否安装成功 有信息输出代表安装成功无信息输出代表安装中 显示当前工作目录的绝对路径 选项 说明 -p 若路径中的目录不存在,先创建目录 -v 每次创建目录都显示信息 特殊符号 含义 . 代表当前目录 … 代表当前目录位置的上一层目录 ~ 代表家目录,即login时所在目录 选项 说明 -l 以详细信息的形式展示出当前目录的文件 -a 显示当前目录中的全部文件(包括隐藏文件

沉迷写代码的程序猿的博客 1580

WinBtrfs:打破平台壁垒的Windows Btrfs驱动完全指南

WinBtrfs是一款开源的Windows Btrfs驱动程序,它打破了不同操作系统间的文件系统壁垒,让Windows用户也能轻松使用Btrfs文件系统带来的诸多优势。本文将为你提供一份全面的WinBtrfs使用指南,帮助你快速上手这款强大的工具。 ## 什么是WinBtrfs? WinBtrfs是一个专为Windows系统开发的Btrfs驱动,它允许Windows操作系统识别和挂载Btrfs

gitblog_00833的博客 853
上一篇: Simple Hooking of Functions not Exported by Ntoskrnl.exe
下一篇: 实时获得USB磁盘(再次更新)
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值