驱动遍历句柄表

2023-05-16



驱动遍历句柄表附加第二个方法的反汇编代码 其中还有对其拦截的方式的一些需要HOOK处比如伪造句柄表

因为大量使用硬编码所以此份代码通用性不强一切均在虚拟机XP3下操作

#include "ntddk.h"
typedef struct _EX_PUSH_LOCK {

 //
 // LOCK bit is set for both exclusive and shared acquires
 //
#define EX_PUSH_LOCK_LOCK_V          ((ULONG_PTR)0x0)
#define EX_PUSH_LOCK_LOCK            ((ULONG_PTR)0x1)

 //
 // Waiting bit designates that the pointer has chained waiters
 //

#define EX_PUSH_LOCK_WAITING         ((ULONG_PTR)0x2)

 //
 // Waking bit designates that we are either traversing the list
 // to wake threads or optimizing the list
 //

#define EX_PUSH_LOCK_WAKING          ((ULONG_PTR)0x4)

 //
 // Set if the lock is held shared by multiple owners and there are waiters
 //

#define EX_PUSH_LOCK_MULTIPLE_SHARED ((ULONG_PTR)0x8)

 //
 // Total shared Acquires are incremented using this
 //
#define EX_PUSH_LOCK_SHARE_INC       ((ULONG_PTR)0x10)
#define EX_PUSH_LOCK_PTR_BITS        ((ULONG_PTR)0xf)

 union {
  struct {
   ULONG_PTR Locked         : 1;
   ULONG_PTR Waiting        : 1;
   ULONG_PTR Waking         : 1;
   ULONG_PTR MultipleShared : 1;
   ULONG_PTR Shared         : sizeof (ULONG_PTR) * 8 - 4;
  };
  ULONG_PTR Value;
  PVOID Ptr;
 };
} EX_PUSH_LOCK, *PEX_PUSH_LOCK;

typedef struct _HANDLE_TABLE{
 ULONG   TableCode;
 ULONG   QuotaProcess;
 ULONG   UniqueProcessId;
 EX_PUSH_LOCK HandleLock;
 ULONG   DebugInfo;
 int    ExtraInfoPages;
 ULONG   Flags;
 ULONG   FirstFreeHandle;
 ULONG   LastFreeHandleEntry;
 ULONG   HandleCount;
 ULONG   NextHandleNeedingPool;
 ULONG   HandleCountHighWatermark;
}HANDLE_TABLE,*PHANDLE_TABLE;
NTSTATUS PsLookupProcessByProcessId(
    HANDLE    ProcessId,
   PEPROCESS *Process
 );
#pragma pack(1)
typedef struct ServiceDescriptorEntry {

 unsigned int *ServiceTableBase;

 unsigned int *ServiceCounterTableBase;

 unsigned int NumberOfServices;

 unsigned char *ParamTableBase;

} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
__declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable;
#pragma pack()
//Xp下的MOVE DEBUGPORT need of
/**8065bffb 8987bc000000    mov     dword ptr [edi+0BCh],eax
8065c015 83a7bc00000000  and     dword ptr [edi+0BCh],0
 8065af6f 39bebc000000    cmp     dword ptr [esi+0BCh],edi
 8065b25a 8b80bc000000    mov     eax,dword ptr [eax+0BCh]
8065b25a 8b80bc000000    mov     eax,dword ptr [eax+0BCh]
8057c1b2 399fbc000000    cmp     dword ptr [edi+0BCh],ebx
 8065c64c 8b89bc000000    mov     ecx,dword ptr [ecx+0BCh]
8065b25a 8b80bc000000    mov     eax,dword ptr [eax+0BCh]
805833d5 83bbbc00000000  cmp     dword ptr [ebx+0BCh],0
 8057c1b2 399fbc000000    cmp     dword ptr [edi+0BCh],ebx
 8065c6cb 8b89bc000000    mov     ecx,dword ptr [ecx+0BCh]
8065b25a 8b80bc000000    mov     eax,dword ptr [eax+0BCh]
80582dc0 8dbebc000000    lea     edi,[esi+0BCh]
80581cb9 399ebc000000    cmp     dword ptr [esi+0BCh],ebx
 805826d0 81c6bc000000    add     esi,0BCh
 8058fa53 399ebc000000    cmp     dword ptr [esi+0BCh],ebx
 8057e5db 8b89bc000000    mov     ecx,dword ptr [ecx+0BCh]
8057e5db 8b89bc000000    mov     ecx,dword ptr [ecx+0BCh]
8057e5db 8b89bc000000    mov     ecx,dword ptr [ecx+0BCh]
8057e5db 8b89bc000000    mov     ecx,dword ptr [ecx+0BCh]
8057e5db 8b89bc000000    mov     ecx,dword ptr [ecx+0BCh]
8057e63a 83b9bc00000000  cmp     dword ptr [ecx+0BCh],0
 8057e5db 8b89bc000000    mov     ecx,dword ptr [ecx+0BCh]
8057e5db 8b89bc000000    mov     ecx,dword ptr [ecx+0BCh]
8065bfed 399fbc000000    cmp     dword ptr [edi+0BCh],ebx
 8065bffb 8987bc000000    mov     dword ptr [edi+0BCh],eax
 8065af6f 39bebc000000    cmp     dword ptr [esi+0BCh],edi
 8058fa53 399ebc000000    cmp     dword ptr [esi+0BCh],ebx
 8065b25a 8b80bc000000    mov     eax,dword ptr [eax+0BCh]
805040dd 39b8bc000000    cmp     dword ptr [eax+0BCh],edi
 8065b25a 8b80bc000000    mov     eax,dword ptr [eax+0BCh]
80588e2e 8b81bc000000    mov     eax,dword ptr [ecx+0BCh]
下面是写入
 8065bffb 8987bc000000    mov     dword ptr [edi+0BCh],eax
 */
//XP对句柄表访问处
/**
80572741 8bbec4000000    mov     edi,dword ptr [esi+0C4h]
80565f1e 8b80c4000000    mov     eax,dword ptr [eax+0C4h]
80565c0d 8b80c4000000    mov     eax,dword ptr [eax+0C4h]
8056e346 8b80c4000000    mov     eax,dword ptr [eax+0C4h]
80568881 8bbbc4000000    mov     edi,dword ptr [ebx+0C4h]
80565c0d 8b80c4000000    mov     eax,dword ptr [eax+0C4h]
805677b6 8b89c4000000    mov     ecx,dword ptr [ecx+0C4h]
句柄表的访问*/
typedef struct _HANDLE_TABLE_ENTRY_INFO {


 //
 //  The following field contains the audit mask for the handle if one
 //  exists.  The purpose of the audit mask is to record all of the accesses
 //  that may have been audited when the handle was opened in order to
 //  support "per operation" based auditing.  It is computed by walking the
 //  SACL of the object being opened and keeping a record of all of the audit
 //  ACEs that apply to the open operation going on.  Each set bit corresponds
 //  to an access that would be audited.  As each operation takes place, its
 //  corresponding access bit is removed from this mask.
 //

 ACCESS_MASK AuditMask;

} HANDLE_TABLE_ENTRY_INFO, *PHANDLE_TABLE_ENTRY_INFO;
typedef struct _HANDLE_TABLE_ENTRY {

 //
 //  The pointer to the object overloaded with three ob attributes bits in
 //  the lower order and the high bit to denote locked or unlocked entries
 //

 union {

  PVOID Object;

  ULONG ObAttributes;

  PHANDLE_TABLE_ENTRY_INFO InfoTable;

  ULONG_PTR Value;
 };

 //
 //  This field either contains the granted access mask for the handle or an
 //  ob variation that also stores the same information.  Or in the case of
 //  a free entry the field stores the index for the next free entry in the
 //  free list.  This is like a FAT chain, and is used instead of pointers
 //  to make table duplication easier, because the entries can just be
 //  copied without needing to modify pointers.
 //

 union {

  union {

   ACCESS_MASK GrantedAccess;

   struct {

    USHORT GrantedAccessIndex;
    USHORT CreatorBackTraceIndex;
   };
  };

  LONG NextFreeTableEntry;
 };

} HANDLE_TABLE_ENTRY, *PHANDLE_TABLE_ENTRY;

typedef BOOLEAN (__stdcall *EX_ENUMERATE_HANDLE_ROUTINE)(
 IN PHANDLE_TABLE_ENTRY HandleTableEntry,
 IN HANDLE Handle,
 IN PVOID EnumParameter
 );
typedef BOOLEAN
 (* ExEnumHandleTable) (
 __in PHANDLE_TABLE HandleTable,
 __in EX_ENUMERATE_HANDLE_ROUTINE EnumHandleProcedure,
 __in PVOID EnumParameter,
 __out_opt PHANDLE Handle
 );
ExEnumHandleTable XExEnumHandleTable=0;
//335是NTcreateTimer
void PageProtectOff()

{

 __asm{

  cli

   mov  eax,cr0

   and  eax,not 10000h

   mov  cr0,eax

 }

}

void PageProtectOn()

{

 __asm{

  mov  eax,cr0

   or   eax,10000h

   mov  cr0,eax

   sti

 }

}
ULONG GetAddress(ULONG uAddress,UCHAR *Signature,int flag)
{
 ULONG index;
 UCHAR *p;
 ULONG uRetAddress;

 if(uAddress==0){ return 0; }

 p = (UCHAR*)uAddress;
 for (index=0;index<0x3000;index++)
 {
  if (*p==Signature[0]&&
   *(p+1)==Signature[1]&&
   *(p+2)==Signature[2]&&
   *(p+3)==Signature[3]&&
   *(p+4)==Signature[4])
  {
   if (flag==0)
   {
    uRetAddress = (ULONG)(p+4) + *(ULONG*)(p+5) + 5;
    return uRetAddress;
   }else if (flag==1)
   {
    uRetAddress = *(ULONG*)(p+5);
    return uRetAddress;
   }else if(flag==2){
    uRetAddress = (ULONG)(p+4);
    return uRetAddress;
   }else if(flag==3){
    uRetAddress = (ULONG)(p+5);
    return uRetAddress;
   }else if(flag==4)
   {
    return (ULONG)p;
   }else{
    return 0;
   }
  }
  p++;
 }
 return 0;
}
BOOLEAN __stdcall EnumCALLback(
 IN PHANDLE_TABLE_ENTRY HandleTableEntry,
 IN HANDLE Handle,
 IN PVOID EnumParameter
 ){
  KdPrint(("OBJECT-->>>handle: %X",HandleTableEntry->Object));
//TRUE就是不遍历FALSE反之
return FALSE;
}
void EnumHndleTable(){
 //0xB73这里这个b37用作辅助搜索特征码的一个小偏移相对NtCreateTimer的一个偏移
 //UCHAR code[5]={0x90,0x90,0x90,0x90,0x8b};
 ULONG eProcess;
 HANDLE hANDLE;
 XExEnumHandleTable=(ExEnumHandleTable)(ULONG)(KeServiceDescriptorTable.ServiceTableBase[54]+0xB82);
 /**

 kd> dt 81a22d50  _EPROCESS
 ntdll!_EPROCESS
 +0x000 Pcb              : _KPROCESS
 +0x06c ProcessLock      : _EX_PUSH_LOCK
 +0x070 CreateTime       : _LARGE_INTEGER 0x01d07a70`45d66f47
 +0x078 ExitTime         : _LARGE_INTEGER 0x0
 +0x080 RundownProtect   : _EX_RUNDOWN_REF
 +0x084 UniqueProcessId  : 0x000001d0 Void
 +0x088 ActiveProcessLinks : _LIST_ENTRY [ 0x817cf0a8 - 0x81a27ad0 ]
 +0x090 QuotaUsage       : [3] 0xcd0
 +0x09c QuotaPeak        : [3] 0x1598
 +0x0a8 CommitCharge     : 0x25e
 +0x0ac PeakVirtualSize  : 0x33cf000
 +0x0b0 VirtualSize      : 0x2a76000
 +0x0b4 SessionProcessLinks : _LIST_ENTRY [ 0x817cf0d4 - 0x81a27afc ]
 +0x0bc DebugPort        : (null)
 +0x0c0 ExceptionPort    : 0xe14f7368 Void
 +0x0c4 ObjectTable      : 0xe1acc610 _HANDLE_TABLE
 +0x0c8 Token            : _EX_FAST_REF
 +0x0cc WorkingSetLock   : _FAST_MUTEX
 +0x0ec WorkingSetPage   : 0xe5b8
 +0x0f0 AddressCreationLock : _FAST_MUTEX
 +0x110 HyperSpaceLock   : 0
 +0x114 ForkInProgress   : (null)
 +0x118 HardwareTrigger  : 0
 +0x11c VadRoot          : 0x81bcbf50 Void
 +0x120 VadHint          : 0x81b90c28 Void
 +0x124 CloneRoot        : (null)
 +0x128 NumberOfPrivatePages : 0x174
 +0x12c NumberOfLockedPages : 0
 +0x130 Win32Process     : 0xe1062818 Void
 +0x134 Job              : (null)
 +0x138 SectionObject    : 0xe1d2c0f0 Void
 +0x13c SectionBaseAddress : 0x00400000 Void
 +0x140 QuotaBlock       : 0x81950590 _EPROCESS_QUOTA_BLOCK
 +0x144 WorkingSetWatch  : (null)
 +0x148 Win32WindowStation : 0x00000024 Void
 +0x14c InheritedFromUniqueProcessId : 0x00000610 Void
 +0x150 LdtInformation   : (null)
 +0x154 VadFreeHint      : (null)
 +0x158 VdmObjects       : (null)
 +0x15c DeviceMap        : 0xe1b71008 Void
 +0x160 PhysicalVadList  : _LIST_ENTRY [ 0x81a22eb0 - 0x81a22eb0 ]
 +0x168 PageDirectoryPte : _HARDWARE_PTE_X86
 +0x168 Filler           : 0
 +0x170 Session          : 0xf8fad000 Void
 +0x174 ImageFileName    : [16]  "x.exe"
 +0x184 JobLinks         : _LIST_ENTRY [ 0x0 - 0x0 ]
 +0x18c LockedPagesList  : (null)
 +0x190 ThreadListHead   : _LIST_ENTRY [ 0x81a2bc54 - 0x81a0b524 ]
 +0x198 SecurityPort     : (null)
 +0x19c PaeTop           : (null)
 +0x1a0 ActiveThreads    : 2
 +0x1a4 GrantedAccess    : 0x1f0fff
 +0x1a8 DefaultHardErrorProcessing : 0x8000
 +0x1ac LastThreadExitStatus : 0n0
 +0x1b0 Peb              : 0x7ffdf000 _PEB
 +0x1b4 PrefetchTrace    : _EX_FAST_REF
 +0x1b8 ReadOperationCount : _LARGE_INTEGER 0x53
 +0x1c0 WriteOperationCount : _LARGE_INTEGER 0x5
 +0x1c8 OtherOperationCount : _LARGE_INTEGER 0x457
 +0x1d0 ReadTransferCount : _LARGE_INTEGER 0x65cc
 +0x1d8 WriteTransferCount : _LARGE_INTEGER 0x168
 +0x1e0 OtherTransferCount : _LARGE_INTEGER 0x5944
 +0x1e8 CommitChargeLimit : 0
 +0x1ec CommitChargePeak : 0x38f
 +0x1f0 AweInfo          : (null)
 +0x1f4 SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO
 +0x1f8 Vm               : _MMSUPPORT
 +0x238 LastFaultCount   : 0
 +0x23c ModifiedPageCount : 0x413
 +0x240 NumberOfVads     : 0x52
 +0x244 JobStatus        : 0
 +0x248 Flags            : 0xd0800
 +0x248 CreateReported   : 0y0
 +0x248 NoDebugInherit   : 0y0
 +0x248 ProcessExiting   : 0y0
 +0x248 ProcessDelete    : 0y0
 +0x248 Wow64SplitPages  : 0y0
 +0x248 VmDeleted        : 0y0
 +0x248 OutswapEnabled   : 0y0
 +0x248 Outswapped       : 0y0
 +0x248 ForkFailed       : 0y0
 +0x248 HasPhysicalVad   : 0y0
 +0x248 AddressSpaceInitialized : 0y10
 +0x248 SetTimerResolution : 0y0
 +0x248 BreakOnTermination : 0y0
 +0x248 SessionCreationUnderway : 0y0
 +0x248 WriteWatch       : 0y0
 +0x248 ProcessInSession : 0y1
 +0x248 OverrideAddressSpace : 0y0
 +0x248 HasAddressSpace  : 0y1
 +0x248 LaunchPrefetched : 0y1
 +0x248 InjectInpageErrors : 0y0
 +0x248 VmTopDown        : 0y0
 +0x248 Unused3          : 0y0
 +0x248 Unused4          : 0y0
 +0x248 VdmAllowed       : 0y0
 +0x248 Unused           : 0y00000 (0)
 +0x248 Unused1          : 0y0
 +0x248 Unused2          : 0y0
 +0x24c ExitStatus       : 0n259
 +0x250 NextPageColor    : 0xe7bd
 +0x252 SubSystemMinorVersion : 0 ''
 +0x253 SubSystemMajorVersion : 0x4 ''
 +0x252 SubSystemVersion : 0x400
 +0x254 PriorityClass    : 0x4 ''
 +0x255 WorkingSetAcquiredUnsafe : 0 ''
 +0x258 Cookie           : 0x47af0476

 */
if (XExEnumHandleTable==0)
{
 KdPrint(("ExEnumHandleTable--->>>Address: %X",XExEnumHandleTable));
 return;
}

KdPrint(("ExEnumHandleTable--->>>Address: %X",XExEnumHandleTable));
 if (!NT_SUCCESS(PsLookupProcessByProcessId((HANDLE)1168,(PEPROCESS*)&eProcess)))
 {
  return;
 }
 eProcess=+0xc4;
 XExEnumHandleTable(*(PHANDLE_TABLE*)eProcess,EnumCALLback,NULL,&hANDLE);
 
 KdPrint(("ExEnumHandleTable--->>>Address: %X",*(PHANDLE_TABLE*)eProcess));
 
 
 //上面那个特征码搜索有bug需要改改加一个一字节的递增的不然 都是成倍数如果不成倍数就搜不到了,所以我这里也懒得写了 直接硬编码过去了,这个地址就是ExEnumHandleTable的地址
  //(ExEnumHandleTable)GetAddress((ULONG)KeServiceDescriptorTable.ServiceTableBase[54]+0xB73+0xE
//,code,2);
 //ExEnumHandleTable这个函数XP下 只有4个参数,WIN7加了一个 实际不必理会~~
 /**
 
 805a016f 56              push    esi
 805a0170 57              push    edi
 805a0171 64a124010000    mov     eax,dword ptr fs:[00000124h]
 805a0177 8365f800        and     dword ptr [ebp-8],0
 805a017b ff75f8          push    dword ptr [ebp-8]
 805a017e 8bf8            mov     edi,eax
 805a0180 ff7508          push    dword ptr [ebp+8]
 805a0183 ff8fd4000000    dec     dword ptr [edi+0D4h]
 805a0189 c645ff00        mov     byte ptr [ebp-1],0
 805a018d e8af59fcff      call    nt!ExpLookupHandleTableEntry (80565b41)
 805a0192 8bf0            mov     esi,eax
 805a0194 85f6            test    esi,esi
 805a0196 7420            je      nt!ExEnumHandleTable+0xaf (805a01b8)
 805a0198 53              push    ebx
 805a0199 833e00          cmp     dword ptr [esi],0
 805a019c 0f8559ffffff    jne     nt!ExEnumHandleTable+0x37 (805a00fb)
 805a01a2 8345f804        add     dword ptr [ebp-8],4
 805a01a6 ff75f8          push    dword ptr [ebp-8]
 805a01a9 ff7508          push    dword ptr [ebp+8]
 805a01ac e89059fcff      call    nt!ExpLookupHandleTableEntry (80565b41)
 805a01b1 8bf0            mov     esi,eax
 805a01b3 85f6            test    esi,esi
 805a01b5 75e2            jne     nt!ExEnumHandleTable+0x32 (805a0199)
 805a01b7 5b              pop     ebx
 805a01b8 ff87d4000000    inc     dword ptr [edi+0D4h]
 805a01be 750b            jne     nt!ExEnumHandleTable+0xca (805a01cb)
 805a01c0 8d4734          lea     eax,[edi+34h]
 805a01c3 3900            cmp     dword ptr [eax],eax
 805a01c5 0f85897f0600    jne     nt!ExEnumHandleTable+0xbe (80608154)
 805a01cb 8a45ff          mov     al,byte ptr [ebp-1]
 805a01ce 5f              pop     edi
 805a01cf 5e              pop     esi
 805a01d0 c9              leave
 805a01d1 c21000          ret     10h
 ///
 nt!ExpLookupHandleTableEntry:
 80565b41 8bff            mov     edi,edi
 80565b43 55              push    ebp
 80565b44 8bec            mov     ebp,esp
 80565b46 83650cfc        and     dword ptr [ebp+0Ch],0FFFFFFFCh
 80565b4a 8b450c          mov     eax,dword ptr [ebp+0Ch]
 80565b4d 8b4d08          mov     ecx,dword ptr [ebp+8]
 80565b50 8b550c          mov     edx,dword ptr [ebp+0Ch]
 80565b53 c1e802          shr     eax,2
 80565b56 3b5138          cmp     edx,dword ptr [ecx+38h]
 80565b59 0f8370930000    jae     nt!ExpLookupHandleTableEntry+0x1a (8056eecf)
 80565b5f 56              push    esi
 80565b60 8b31            mov     esi,dword ptr [ecx]
 80565b62 8bce            mov     ecx,esi
 80565b64 83e103          and     ecx,3
 80565b67 83e6fc          and     esi,0FFFFFFFCh
 80565b6a 83e900          sub     ecx,0
 80565b6d 0f85c90a0000    jne     nt!ExpLookupHandleTableEntry+0x2e (8056663c)
 80565b73 8d04c6          lea     eax,[esi+eax*8]
 80565b76 5e              pop     esi
 80565b77 5d              pop     ebp
 80565b78 c20800          ret     8


 */
 
 return;
}

void DriverUnolad(PDRIVER_OBJECT obj){


}
NTSTATUS DriverEntry(PDRIVER_OBJECT obj,PUNICODE_STRING regmsg){


 EnumHndleTable();



obj->DriverUnload= DriverUnolad;
return STATUS_SUCCESS;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

驱动遍历句柄表 的相关文章

  • STM32G030F6P6 CubeMX和keil5开发环境的搭建

    规格了解 封装 xff1a TSSOP 20内核 xff1a Arm 32 位 Cortex M0 43 CPU工作电源电压 xff1a 2 V to 3 6 VCPU频率 xff1a 64 MHzFlash存储器 xff1a 32KBRA
  • 卡尔曼滤波(KF)与扩展卡尔曼滤波(EKF)的一种理解思路及相应推导(1)

    前言 xff1a 从上个世纪卡尔曼滤波理论被提出 xff0c 卡尔曼滤波在控制论与信息论的连接上做出了卓越的贡献 为了得出准确的下一时刻状态真值 xff0c 我们常常使用卡尔曼滤波 扩展卡尔曼滤波 无迹卡尔曼滤波 粒子滤波等等方法 xff0
  • STM32工程文件组成结构

    STM32工程文件目录结构 以LED流水灯程序为例 1 CMSIS 内核驱动程序 包含c文件 xff0c ST公司官方提供的 xff0c 对arm内核和mcu系统的基础文件 xff0c 一般不做修改 2 LIB 内部功能的基本函数库 包含c
  • nvidia jetson xavier nx与agx xavier和tx2对比

    1 性能比AGX xavier低 xff0c 但体积更小 xff08 nx为70 x 45 mm xff0c AGX xavier为100 x 87 mm xff09 2 性能是TX2和jetson Nano的10倍 3 安装ubuntu系
  • 总结:单独标定IMU的工具包(kalibr_allan,imu_tk,imu_utils)

    目录 一 常用开源IMU标定工具包汇总 kalibr allan imu tk imu utils imu tk与imu utils的区别 二 使用kalibr allan计算imu误差 参考 xff1a 下载 xff1a 安装 xff1a
  • git使用总结

    Git使用总结 1 本地更新代码前忘记拉取 pull 最新代码 本地对代码进行了修改 xff0c 但是忘记拉取最新版本的代码 这时想要拉最新的代码时 xff0c git pull origin branch name xff0c 会提示你
  • matlab中im2bw函数的用法

    matlab中DIP工具箱函数im2bw使用阈值 xff08 threshold xff09 变换法把灰度图像 xff08 grayscale image xff09 转换成二值图像 所谓二值图像 xff0c 一般意义上是指只有纯黑 xff
  • 最优化方法总结:公式解、数值优化、求解思想

    机器学习的目标是给出一个模型 xff08 一般是映射函数 xff09 xff0c 然后定义对这个模型好坏的评价函数 xff08 目标函数 xff09 xff0c 求解目标函数的极大值或者极小值 xff0c 以确定模型的参数 xff0c 从而
  • AGV小车基础知识介绍

    AGV基础知识 一 AGV的基本概念二 AGV的基本结构硬件组成软件组成1 硬件结构2 单机结构3 主要类型4 主要引导方式介绍5 驱动方式介绍6 AGV的移载方式 三 AGV的控制系统1 AGV控制系统2 AGV安全系统3 激光导航控制系
  • ardupilot & PX4 RTK配置指南

    ardupilot amp PX4 RTK配置指南 随着无人机对于高精度位置需求越来越强烈 xff0c 同时也伴随着北斗三代导航系统正式服务全球 xff0c 国产的实时载波相位差分 xff08 RTK xff09 导航产品也正在以更优惠 更
  • 无人机ADS-B模块 (兼容Px4、ardupilot、极致飞控)拒绝黑飞,耗子尾汁!

    近年来 xff0c 无人机等低空飞行器成为很多玩家的新 玩具 xff0c 但是绝大多数飞行器都属于 黑飞 xff0c 就是没有民航管理部门的适航许可 也没有相关部门颁发的驾驶执照的 2018年2月7日 xff0c 河北省唐山市古冶区公安分局
  • RK3308 蓝牙接口测试

    BT相关接口 deviceio test bluetooth bt server open 蓝牙测试初始化 xff0c 执行蓝牙测试前 xff0c 先调用该接口 BLE的接收和数据请求回调函数的注册 注 xff1a BLE读数据是通过注册回
  • 无人机高精度导航系统GT08N——支持RTK、PPK 、双天线测向

    最近几年无人机市场可以说的上是非常火爆的 xff0c 无人机公司也是数不胜数 无人机的应用场合也是非常之多的 xff0c 农业 物流 安防 巡航 测绘 航拍等等都得到了非常好的应用 同时无人机市场也催生了许多的配套设备的发展 RTK xff
  • FreeRTOS操作系统如何设置的PendSV和SysTick优先级

    首先应该明确PendSV和SysTick的优先级应该设置为最低 xff0c 具体原因参见这一篇博客 PendSV功能 xff0c 为什么需要PendSV 设置优先级在函数port c中的xPortStartScheduler 函数中实现的
  • 自平衡小车控制(stc12+mpu6050程序)

    自平衡小车控制 xff08 stc12 43 mpu6050程序 xff09 两轮自平衡车最终版控制程序 xff08 6轴MPU6050 43 互补滤波 43 PWM电机 xff09 单片机STC12C5A60S2 晶振 xff1a 20M
  • 深度学习常见名词概念:Sota、Benchmark、Baseline、端到端模型、迁移学习等的定义

    深度学习 xff1a Sota的定义 Sota非端到端模型端到端模型Benchmark Baseline并发 并行 串行迁移学习微调进程 线程监督学习非监督学习半监督学习泛化 xff08 Generalization xff09 正则化 x
  • VINS 系统总结

  • VIO算法总结(一)

    所谓VIO xff08 visual inertial odometry xff09 就是视觉传感器 xff08 camera xff09 43 IMU xff08 inertial measurement unit xff09 一起来做自
  • 西门子1200、1500 PLC中如何将寄存器(M,D,DB)值存入到结构体变量中

    如果将MD100 QD100的值存入到结构体中 xff0c 直接存储过去是存不了的 解决方法是 xff1a 1 建立一个COPY块 xff0c 为FB FC型均可 将寄存器的值或结构体的值序列化 建立出来的库 xff0c 具体作用是结构体

随机推荐

  • windows下clion配置cmake

    1 Cmake安装 cmake官方链接 进入cmake官网下载cmake xff0c 然后一路next xff0c 傻瓜式安装 2 MinGW安装 MinGW官网安装 xff0c 或者去其他论坛找资源 然后打开桌面的快捷方式 xff0c 没
  • ubuntu18.04 安装 roboware-studio

    RoboWare Studio是一个ROS集成开发环境 与ROS匹配性比起其他IDE更好 xff0c 可以用它开发 ROS更加简单 并且在官网ros wiki中有详细的使用教程 本文主要是在Ubuntu18 04中安装RoboWare St
  • 烧录工具Android Tool的使用

    RK3308 该工具是RK的开发工具 xff0c 用于烧录用的 xff0c 不同型号的芯片对应的Android Tool中的下载镜像界面也不一样 xff0c 你像RK3308编出来的烧录文件有如下 xff1a 对应的Android Tool
  • Jetson nano i2c教程(MPU6050 + PCA9685)

    首先介绍nano板子上的i2c相关的硬件信息 xff1a 安装所需要的i2c库 sudo apt get install l y i2c tools 完成nano中io与i2c设备的硬件接线 本次案例使用的是PCA9685和MPU6050
  • ROS中发布里程计消息(Odometry)

    目录 1 首先理解里程计是什么 xff1f 2 里程计发布流程3 发布里程计TF变换2 1c 43 43 发布TF变换2 2 python发布TF变换 根据阿克曼转向结构的车辆实现里程计消息的发布 xff0c 本文参考博客如下 xff0c
  • ROS std_msgs/Header 数据含义

    std msgs Header msg消息里数据主要有一下几部分 xff1a uint32 seq time stamp string frame id 分别对这些数据做一个介绍 xff0c 如有错误 xff0c 欢迎批评指正 xff01
  • Carsim中添加路径

    目录 1 新建3D Road 数据库2 设置具体参数3 添加自定义道路信息 利用carsim和simulink联合仿真时 xff0c 需要给定参考轨迹 xff0c 具体设置如下 xff1a 1 新建3D Road 数据库 在Miscella
  • Carsim 2019 Run Now 按钮灰色

    安装carsim后 xff0c Run control with Simulink 模块中的Run Now 和Send to simulink 按钮灰色如下图所示 xff1a 解决办法 xff1a 在License Setting中 xff
  • Ubuntu 添加串口权限

    ubuntu串口添加权限方法 Ubuntu 添加串口权限前言一 添加用户组 xff0c 可长期使用二 给当前终端权限 xff08 单次有效 xff09 1 指定串口2 通用 三 修改文件 Ubuntu 添加串口权限 提示 xff1a 文章写
  • Ubuntu 虚拟机右上角网络连接符号消失

    这里写自定义目录标题 Ubuntu 虚拟机右上角网络连接符号消失解决方案 xff1a Ubuntu 虚拟机右上角网络连接符号消失 Ubuntu 虚拟机右上角网络连接符号消失 xff0c 如下图所示 解决方案 xff1a span class
  • C/C++中局部变量static用法实例

    1 普通局部变量存储于进程栈空间 xff0c 使用完毕会立即释放 xff0c 静态局部变量使用static修饰符定义 xff0c 即使在声明时未赋初值 xff0c 编译器也会把它初始化为0 xff0c 并且静态局部变量存储于进程的全局数据区
  • 嵌入式C语言经典面试题(一)

    1 用预处理指令 define 声明一个常数 xff0c 用以表明1年中有多少秒 xff08 忽略闰年问题 xff09 define SECONDS PER YEAR 60 60 24 365 UL 我在这想看到几件事情 xff1a 1 d
  • 更新Ubuntu内核到最新版本

    想起自己多年前玩Linux的时候知道了两个命令 xff1a sudo apt get update sudo apt get upgrade 以为是能够更新所有软件的 xff0c 后来发现 系统还是不能够更新的 那么 xff0c 系统应该如
  • RK3308 按键Key与LED灯

    硬件原理图 LED指示灯 麦克风阵列子板上使用12颗RGB灯作为效果指示灯 用户可以通过I2C总线配置LED灯驱动IC来是实现不同场景下的灯效 按键Key 麦克风阵列子板上集成五个控制按键 xff0c 分别为 xff1a 控制音量增减的VO
  • if选择结构

    if单选择结构 if双选择结构 if多选择结构 span class token keyword if span span class token punctuation span score span class token operat
  • Windows10下Eclipse+Python环境配置与新项目创建

    最近心血来潮 xff0c 突然想学一下python xff0c 按理说应该不用Eclipse xff0c 但是一想以后还可能会用Java xff0c 那还是装这个 xff0c 然后配置一下环境吧 xff0c 其中也有很多坑 xff0c 希望
  • 理解地址空间和逻辑地址生成

    1 1 地址空间 物理地址 xff1a 硬件 例如内存条 所支持地址空间 xff0c 地址空间的管理由硬件完成 逻辑地址 虚拟地址 xff1a 运行地址所看到的地址空间 xff0c 地址空间是一维的 xff0c 应用程序更加容易访问和管理
  • QT DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x800c000d ()

    使用QT播放音频的时候出现如下错误 DirectShowPlayerService doSetUrlSource Unresolved error code 0x800c000d 原因是url错误
  • 3种蓝牙架构实现方案(蓝牙协议栈方案)

    导言 不同的蓝牙架构可以用在不同的场景中 从而协议帧的架构方案也会不同 转载自 xff1a https www cnblogs com schips p 12293141 html 三种蓝牙架构实现方案 xff08 蓝牙协议栈方案 xff0
  • 驱动遍历句柄表

    xfeff xfeff 驱动遍历句柄表附加第二个方法的反汇编代码 其中还有对其拦截的方式的一些需要HOOK处比如伪造句柄表 因为大量使用硬编码所以此份代码通用性不强一切均在虚拟机XP3下操作 include 34 ntddk h 34 ty