【Windows内核编程】Win10/Win11通过PspCidTable取得EProcess

2023-05-16

温馨提示

本文的内容均在Windows 11 Enterprise(22000.466)版本下测试

不同版本的部分内容可能存在差异,但万变不离其中

[Upadate 20220803]经测试,本文内容目前向下兼容

正文

Part1.理论知识

PspCidTable是一个指向类型为_HANDLE_TABLE的指针

0: kd> dp Pspcidtable
fffff801`6bf195d0  ffffb10c`bd635180 ffffd087`1bec6da0
fffff801`6bf195e0  00000000`00000000 00010000`00000000
fffff801`6bf195f0  00000000`00001000 00000000`00000000
fffff801`6bf19600  00000000`00000000 0000a503`00000000
fffff801`6bf19610  00000000`00000000 00000000`00000000
fffff801`6bf19620  00000000`00000000 00000000`00000000
fffff801`6bf19630  00000000`00000000 00000000`00000000
fffff801`6bf19640  ffffd087`1bef4bc0 fffff801`6c263000

我们可以通过WinDbg查看该结构

0: kd> dt _handle_table ffffb10c`bd635180
nt!_HANDLE_TABLE
   +0x000 NextHandleNeedingPool : 0x1c00
   +0x004 ExtraInfoPages   : 0n0
   +0x008 TableCode        : 0xffffb10c`c118e001
   +0x010 QuotaProcess     : (null) 
   +0x018 HandleTableList  : _LIST_ENTRY [ 0xffffb10c`bd635198 - 0xffffb10c`bd635198 ]
   +0x028 UniqueProcessId  : 0
   +0x02c Flags            : 1
   +0x02c StrictFIFO       : 0y1
   +0x02c EnableHandleExceptions : 0y0
   +0x02c Rundown          : 0y0
   +0x02c Duplicated       : 0y0
   +0x02c RaiseUMExceptionOnInvalidHandleClose : 0y0
   +0x030 HandleContentionEvent : _EX_PUSH_LOCK
   +0x038 HandleTableLock  : _EX_PUSH_LOCK
   +0x040 FreeLists        : [1] _HANDLE_TABLE_FREE_LIST
   +0x040 ActualEntry      : [32]  ""
   +0x060 DebugInfo        : (null) 

其中,+0x8 TableCode就是我们所需的全局句柄表的地址

关于该表,有如下命名规则

满足条件含义翻译成人话
(TableCode & 3) == 0该指针所指句柄表为一级句柄表TableCode的二进制低两位都是0,遍历此表可以直接得到我们要的信息
(TableCode & 3) == 1该指针所指句柄表为二级句柄表TableCode的二进制低两位为01,此表中表项指向一级句柄表
(TableCode & 3) == 2该指针所指句柄表为三级句柄表TableCode的二进制低两位为10,此表中的表项指向二级句柄表

关于各级句柄表的关系,如图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u5RR4XLW-1659622816405)(D:\HeRuijie\Summarize\assets\image-20220803220526783.png)]

!!!更正上图!由于忘记保存EXCEL文件,口头补充说明,对于一级表每16bytes才有一次数据、有八字节空;二三级表则每隔8bytes都有一次数据!!!

关于这个句柄表,微软这个糟老头子在Win7 x32还是没有加密的

但是到Win7x64以后开始就开始加密了,我们可以通过反汇编查看PsLookUpProcessByProcessId => PspReferenceCidTableEntry函数的实现过程来解决

以22000.466为例,如下为IDA反汇编结果

_BYTE *__fastcall PspReferenceCidTableEntry(__int64 a1, char a2)
{
  volatile signed __int64 *v3; // rax
  volatile signed __int64 *v4; // rsi
  __int64 v5; // r14
  signed __int64 v6; // rcx
  __int64 v7; // rdi
  unsigned __int128 v8; // rt0
  unsigned __int8 v9; // tt
  unsigned __int64 v10; // rax
  _BYTE *v11; // rdi
  int v13; // ebx
  bool v14; // zf
  signed __int64 v15; // rax
  signed __int64 v16; // rtt
  __int64 v17; // rcx
  _QWORD *v18; // rcx
  unsigned __int64 v19; // rax
  int v20[8]; // [rsp+0h] [rbp-48h] BYREF
  unsigned __int128 v21; // [rsp+20h] [rbp-28h]
  __int128 v22; // [rsp+30h] [rbp-18h]

  if ( (a1 & 0x3FC) == 0 )
    return 0i64;
  v3 = (volatile signed __int64 *)ExpLookupHandleTableEntry(PspCidTable, a1);
  v4 = v3;
  if ( !v3 )
    return 0i64;
  v5 = PspCidTable;
  _m_prefetchw((const void *)v3);
  *(_QWORD *)&v21 = *v3;
  v6 = *((_QWORD *)v3 + 1);
  *((_QWORD *)&v21 + 1) = v6;
  v7 = v21;
  if ( (v21 & 0x1FFFE) == 0 )
  {
LABEL_10:
    v13 = 0;
    if ( !(unsigned __int8)ExLockHandleTableEntry(PspCidTable, v4) )
      return 0i64;
    v11 = (_BYTE *)((*(__int64 *)v4 >> 16) & 0xFFFFFFFFFFFFFFF0ui64);
    if ( (*v11 & 0x7F) == a2 )
    {
      if ( a2 == 3 )
        v14 = (*(_DWORD *)(((*(__int64 *)v4 >> 16) & 0xFFFFFFFFFFFFFFF0ui64) + 0x464) & 0x400000C) == 0x4000000;
      else
        v14 = (*(_DWORD *)(((*(__int64 *)v4 >> 16) & 0xFFFFFFFFFFFFFFF0ui64) + 0x560) & 3) == 2;
      if ( v14 )
        v13 = ExSlowReplenishHandleTableEntry(v4);
      _m_prefetchw(v11 - 48);
      v15 = *((_QWORD *)v11 - 6);
      if ( v15 )
      {
        while ( 1 )
        {
          v16 = v15;
          v15 = _InterlockedCompareExchange64((volatile signed __int64 *)v11 - 6, (unsigned int)(v13 + 1) + v15, v15);
          if ( v16 == v15 )
            break;
          if ( !v15 )
            goto LABEL_25;
        }
        if ( ObpTraceFlags )
          ObpPushStackInfo((_DWORD)v11 - 48);
LABEL_20:
        v17 = PspCidTable;
        _InterlockedExchangeAdd64(v4, 1ui64);
        v18 = (_QWORD *)(v17 + 48);
        _InterlockedOr(v20, 0);
        if ( *v18 )
          ExfUnblockPushLock(v18, 0i64);
        return v11;
      }
LABEL_25:
      v19 = *v4 & 0xFFFFFFFFFFFE0001ui64;
      v22 = v19;
      *v4 = v19;
    }
    v11 = 0i64;
    goto LABEL_20;
  }
  while ( 1 )
  {
    if ( (v7 & 1) == 0 )
    {
      ExpBlockOnLockedHandleEntry(v5, v4, v7);
      _m_prefetchw((const void *)v4);
      v6 = *((_QWORD *)v4 + 1);
      *(_QWORD *)&v21 = *v4;
      v7 = v21;
      *((_QWORD *)&v21 + 1) = v6;
      goto LABEL_27;
    }
    *(_QWORD *)&v8 = v7;
    *((_QWORD *)&v8 + 1) = v6;
    v9 = _InterlockedCompareExchange128(v4, v6, v7 - 2, (signed __int64 *)&v8);
    v6 = v8 >> 64;
    v10 = v8;
    v7 = v8;
    v21 = v8;
    if ( v9 )
      break;
LABEL_27:
    if ( (v7 & 0x1FFFE) == 0 )
      goto LABEL_10;
  }
  if ( (unsigned __int16)(v10 >> 1) == 16 )
    v7 = ((unsigned int)v7 ^ (2 * (unsigned int)(v10 >> 1) - 2)) & 0x1FFFE ^ (unsigned __int64)v7;
  v11 = (_BYTE *)((v7 >> 16) & 0xFFFFFFFFFFFFFFF0ui64);
  if ( (*v11 & 0x7F) == a2 )
    return v11;
  ObfDereferenceObject(v11);
  return 0i64;
}

我们根据对原函数的分析,可以发现在成功的情况下应该是返回v11这个变量,通过分析代码可以分析出他的解密方式,其他系统的解密方法同理,这里在下面给出。

系统解密方式(v4是PEPROCESS*)
Win7(_BYTE *)(*(__int64 *)v4)& 0xFFFFFFFFFFFFFFF0ui64
Win8(_BYTE *)(*(__int64 *)v4 >> 19) & 0xFFFFFFFFFFFFFFF0ui64)
Win10 - Win11(截至20220803)(_BYTE *)(*(__int64 *)v4 >> 16) & 0xFFFFFFFFFFFFFFF0ui64)

为了保证正确,我们进入WinDbg选取一个表项进行测试,这里顺带说一声待会实现的时候要注意,在查询CidTableCode时低两位要抹掉零,不要问我怎么知道的,问就是看上面代码。

这一个系统的TableCode0xffffb10cc118e001,由于低两位为1可以确定为二级表,我们使用dp指令查看抹除低两位后指向内存信息

0: kd> dp 0xffffb10c`c118e000
ffffb10c`c118e000  ffffb10c`bd6b1000 ffffb10c`c118f000
ffffb10c`c118e010  ffffb10c`c1a4b000 ffffb10c`c25fe000
ffffb10c`c118e020  ffffb10c`c2fff000 ffffb10c`c16de000
ffffb10c`c118e030  ffffb10c`c40fb000 00000000`00000000
ffffb10c`c118e040  00000000`00000000 00000000`00000000
ffffb10c`c118e050  00000000`00000000 00000000`00000000
ffffb10c`c118e060  00000000`00000000 00000000`00000000
ffffb10c`c118e070  00000000`00000000 00000000`00000000

上面每八个字节的指针都指向一个一级句柄表,我们选取ffffb10cbd6b1000做测试

0: kd> dp ffffb10c`bd6b1000
ffffb10c`bd6b1000  00000000`00000000 00000000`00000000
ffffb10c`bd6b1010  d0871be5`f040f6a5 00000000`00000000
ffffb10c`bd6b1020  d0871bf9`3080ffef 00000000`00000000
ffffb10c`bd6b1030  d0871be7`f4800001 00000000`00000000
ffffb10c`bd6b1040  d0871bf7`90800001 00000000`00000000
ffffb10c`bd6b1050  d0871bf4`60800001 00000000`00000000
ffffb10c`bd6b1060  d0871bf9`b0800001 00000000`00000000
ffffb10c`bd6b1070  d0871bfc`91400001 00000000`00000000

这个便是一级表,可以发现每 16 b y t e s 16bytes 16bytes才有一次数据,按照上文提及的解密方法进行解密(这里偷懒直接扔程序算)

在这里插入图片描述

带入WinDbg进行检验

0: kd> dt _eprocess ffffd0871be5f040
nt!_EPROCESS
   +0x000 Pcb              : _KPROCESS
   +0x438 ProcessLock      : _EX_PUSH_LOCK
   +0x440 UniqueProcessId  : 0x00000000`00000004 Void
   +0x448 ActiveProcessLinks : _LIST_ENTRY [ 0xffffd087`1bed74c8 - 0xfffff801`6be3af60 ]
   +0x458 RundownProtect   : _EX_RUNDOWN_REF
   +0x460 Flags2           : 0xd000
   +0x460 JobNotReallyActive : 0y0
   +0x460 AccountingFolded : 0y0
   +0x460 NewProcessReported : 0y0
   +0x460 ExitProcessReported : 0y0
   +0x460 ReportCommitChanges : 0y0
   +0x460 LastReportMemory : 0y0
       ...

可以发现解密是正确的,此地址正是System进程的ERPCOESS对象

Part2.实现

Part2.1 查找PspCidTable表

众所周知,微软为提升系统稳定性,对于这种内核API的基函数、变量都是不导出的,但是我们通过刚才的反编译可以看到系统在PspReferenceCidTableEntry函数中引用了PspCidTable但是很遗憾他也不导出,但是PsLookupProcessByProcessId他导出!所以我们可以枚举该函数的内存,跟随第一个call访问到PspReferenceCidTableEntry中再寻找PspCidTable即可

Part2.2实现代码
#include"stdafx.h"
#include"Proc.h"
DWORD TargetPID;
ULONG64 ret = 0;
ULONG64 cidTableAddr = 0; 
BOOLEAN found;
BOOLEAN GetPspCidTable(ULONG64* tableAddr)
{
	UNICODE_STRING uc_funcName;
	RtlInitUnicodeString(&uc_funcName, L"PsLookupProcessByProcessId");
	ULONG64 func = MmGetSystemRoutineAddress(&uc_funcName);
	if (func == NULL)
		return FALSE;
	ULONG64 Psp_func = 0;
	for (int i = 0; i < 47; i++) //The origin jmp address in 22000.466 is PsLook...+ 27
		if (*(PUCHAR)(func + i) == 0xE8) { // The First Call
			Psp_func = func + i;
			break;
		}
	if (Psp_func != 0)
	{
		int i_callCode = *(int*)(Psp_func + 1);
		ULONG64 ul_callJmp = Psp_func + i_callCode + 5;
		for (int i = 0; i < 0x3A; i++) // The origin jmp code in 22000.466 is 0x1A 
		{
			if (*(PUCHAR)(ul_callJmp + i) == 0x48 &&
				*(PUCHAR)(ul_callJmp + i + 1) == 0x8b &&
				*(PUCHAR)(ul_callJmp + i + 2) == 0x05)
			{
				int i_movCode = *(int*)(ul_callJmp + i + 3);
				ULONG64 ul_movJmp = ul_callJmp + i + i_movCode + 7;
				*tableAddr = ul_movJmp;
				return TRUE;
			}
		}
	}
	return FALSE;
}
//枚举表的操作很简单自己打吧
}

Part3.应用

可以用来遍历部分病毒/勒索程序 隐藏的进程来实现ARK
当然还有更多其他的功能

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

【Windows内核编程】Win10/Win11通过PspCidTable取得EProcess 的相关文章

  • Shell ❀ 正则表达式

    文章目录 七 正则表达式1 普通字符2 非打印字符3 特殊字符4 限定字符5 常用的正则表达式5 1 校验数字的表达式5 2 校验字符的表达式5 3 特殊需求表达式 七 正则表达式 正则表达式 Regular Expression xff1
  • Shell ❀ 三剑客 - Grep + Sed + Awk

    文章目录 八 三剑客 Grep 43 Sed 43 Awk1 Grep 过滤1 1 常用grep参数1 2 使用方法 2 Sed 行匹配2 1 执行原理2 2 常见语法2 3 使用方法2 3 1 地址边界的设定2 3 2 基础编辑命令2 3
  • Shell ❀ 学习笔记与知识点梳理

    基础知识概述基础变量类别与引用条件测试语句条件判断语句循环语句函数与数组正则表达式三剑客 Grep 43 Sed 43 Awk
  • 使用 Schema xsd 文件校验 xml 文件格式

    本文是实例代码工具类 xff1a span class token keyword import span span class token namespace org span class token punctuation span x
  • Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍

    nbsp Linux 查看磁盘分区 文件系统 使用情况的命令和相关工具介绍 提要 Linux 磁盘分区表 文件系统的查看 统计的工具很多 有些工具是多功
  • MiddleWare ❀ Elasticsearch请求详解

    文章目录 Elasticsearch请求详解 Elasticsearch请求详解 span class token comment 创建索引 重复创建报错 span span class token function curl span s
  • 树莓派自带VNC黑屏(灰屏)个人解决办法

    最近购买了树莓派 xff14 xff22 看来许多教程 xff0c 但VNC第一次还正常显示 xff0c 后来就黑屏 xff0c 还有什么现在不能显示桌面什么的 xff0c 下面给大家说下vnc黑屏我的解决办法 xff0c 我发现是vncv
  • Openmv色块追踪

    Openmv 拿到后第一次进行开发 xff08 颜色追踪 xff09 Openmv本身是具有很多的内置函数的 xff0c 基本都是别人给我们写好了 xff0c 需要我们自己去调用 xff0c 并给函数传递参数以实现我们需要的效果 但是很多初
  • XTDrone中roslaunch px4 indoor1.launch

    logging to home luyu ros log f8336262 666f 11ec ad21 4287fcc6d992 roslaunch luyu Lenovo 32405 log Checking log directory
  • Git的基本使用方法(0基础小白也能看懂)详细教程(含视频讲解)

    git指令介绍 xff0c 下面有详解指令可以先跳过直接看下面的详解 mkdir learngit 创建一个learngit文件夹 cd learngit 进入learngit文件夹 pwd 用于显示当前目录 git init 把这个目录变
  • 2020/05/25 Prometheus监控k8s企业级应用 1

    2 2 课程介绍及课程大纲 普罗米修斯的配置很难 2 3 Prometheus监控软件概述 prometheus是一名google的前员工写的 xff0c 也是go语言写的 xff0c K8S是第一个托管的项目 xff0c promethe
  • 现代信号处理——自适应滤波器(卡尔曼滤波)

    一 Kalman滤波的过程方程和观测方程 假设某系统n时刻的状态变量为x n 过程方程 xff1a x n 43 1 61 F n 43 1 xff0c n x n 43 v1 n 观测方程 xff1a y n 61 C n x n 43
  • 联想SR590服务器管理界面配置

    1 连接登录远程管理界面 将笔记本和服务器的管理口用网线连接 xff0c 配置笔记本的ip地址 xff0c 改成192 168 70 XXX xff0c 255 255 255 0 xff0c 如下图 xff1a 改完ip地址ping一下服
  • Qt鼠标点击不响应QMouseEvent事件的解决办法

    最近在写程序在和同事合完代码后发现一个问题 项目是使用qt开发一个程序 有一个功能是要实现地图的标记功能 我需要在一个label控件上显示地图 然后再选中标记按钮后点击地图 会在鼠标点击的位置放置一个标记的图标并储存备注信息 那么实现这个功
  • 匿名飞控程序整理

    主程序框图如下 xff0c 接下来我会将各个模块全部单独整理出来 xff0c 一是分享 xff0c 也是给自己留个便于查阅 主函数main c int main void flag start ok 61 All Init 进行所有设备的初
  • ORB_SLAM2 运行TUM RGBD数据集过程记录

    一 编译代码 这里是用ubuntu20 04 opencv4安装orbslam2的一点记录 报错信息经过搜索找到了对应的解决办法 xff0c 在这里做一个笔记 报错1 xff1a FATAL ERROR 34 OpenCV gt 2 4 3
  • 匿名飞控设备初始化All_Init()函数代码整理

    目录 初始化All Init 1 Para Data Init 参数初始化 2 Remote Control Init 遥控器输入类型 3 PWM Out Init 电调输出的初始化 4 spi 2初始化 xff0c 用于读取飞控板上所有传
  • 匿名飞控线程初始化和调度是怎么实现的

    目录 一 线程初始化 先看下Scheduler Setup xff08 xff09 函数 xff0c 二 任务调度器 函数在文件Ano Scheduler c中 xff0c Scheduler Setup xff08 xff09 初始化后
  • QGC编译报错error C2220: 警告被视为错误 最佳解决方法

    前面搜了一下 xff0c 试过各种方法依然报错 xff0c 先整理别人的解决方法 目录 一 重新保存文件 二 xff0c 更改编码方式 三 最终解决方案 xff1a 修改配置文件 一 重新保存文件 注意这里的配置 Wx WX 二 xff0c
  • 整理px4飞控校准机制和qgc校准机制

    用qgc执行 px4飞控传感器校准时 的步骤确实很麻烦 xff0c 磁罗盘需要转6个面 xff0c 加速度计也需要6个面 大疆无人机的校准很简单 xff0c 加速度计需要静置一会 xff0c 磁罗盘校准也就转一个面就行了 xff0c 就算学

随机推荐

  • mavros操作飞机时方向位置改为机体坐标系下指令

    前面试了很多 xff0c 看官网里的说明 用 mavros setpoint raw local 34 里的frame id改为 34 base link 34 不行 又直接发mavros msgs PositionTarget 修改里面的
  • px4室内飞行通过SLAM发送位置消息

    先按照官方的教程设置好飞控参数 http docs px4 io master zh computer vision visual inertial odometry html 下载源码学习 xff1a https github com A
  • MCUXpresso调试FreeRTOS时显示多线程

    多线程程序调试起来确实麻烦 xff0c 在调试过程中默认只能看到当前线程 按照以下配置即可在程序暂停时查看多线程的状态 xff1a 在debug配置中选中下图所示 xff1a 配置完成后再调试程序即可显示多线程
  • px4 编译生成msg消息机制及将其移植方法

    目录 一 在px4中添加新的Topic 二 px4生成msg生成的结构体优势 三 msg生成工具及移植方法 一 在px4中添加新的Topic 在px4中是通过uorb进行消息的传递 xff0c 通过根目录下的msg文件可以添加自定义的消息
  • px4传感器数据sensor模块整理

    涉及传感器数据的流程 xff0c 大致整理如下图 传感器的数据从drivers中调用lib中dirvers对应的对象更新数据并发布出去 xff0c sensor模块通过订阅原始数据和校准参数 xff0c 对数据滤波并更正 xff0c 然后再
  • C#实现程序一次打开两个窗口,两个窗口分别放置在两个屏幕

    这是本人在编程中碰到的一个问题 xff0c 寻找了其他案例 xff0c 都只是同时打开两窗口 xff0c 但不能实现在拥有两块显示屏时候 xff0c 分别将两个不同的窗口显示在两个单独的屏幕 源代码https download csdn n
  • 探寻C#事件本质

    我最先在学习C 事件的时候 xff0c 阅读了许多书籍 xff0c 但总是不能对事件建立起一个比较清晰的概念 xff0c 对其内部机制和原理也是似是而非 xff0c 因为这些书籍在描述事件的时候总是夹杂许多其他不能理解的抽象术语 xff0c
  • C#chart绘折线图动态添加数据

    C 入门基础 xff0c 实现chart控件动态添加数据 源程序https download csdn net download qq 42237381 10742048 目录 一 效果示意 二 原理说明 三 代码参考 一 效果示意 最终程
  • C#Winform程序制作仿真地平仪,磁罗盘飞行仪表盘

    因为项目需要做一个电子飞行仪表盘包括地平仪和磁罗盘 xff0c 网上找了很久 xff0c 没有找到一个合适的控件 xff0c 就学习了一些图形处理的开源代码做一个简陋的仪表盘来使用 xff0c 希望对其他人有帮助 xff0c 如果有好的建议
  • pixhawk学习

    原文转载至https blog csdn net u013181595 article details 80976610 1硬件架构分析 Pixhawk是一款基于ARM芯片的32位开源飞控 xff0c 由ETH的computer visio
  • 由浅入深对卡尔曼滤波的学习

    原文来自http shequ dimianzhan com articles 337 extended kalman filter course from shallow to deep 搬运过来好好学习 本篇译文翻译自 The Exten
  • px4中mixer_multirotor.cpp混控程序解读

    目录 一 函数说明 二 具体步骤 1 简单混控无边界 无边界输出 不混合偏航 2 限幅 3 加入比例缩放和偏航 使输出范围限制在 0 1 4 融合怠速处理 一 函数说明 混控函数在MIX函数 MultirotorMixer mix floa
  • pixhawk飞控板基于px4程序中串口调试打印数据的方法

    px4程序模块化非常的清晰 但程序也是非常的庞大 不同于一般程序员的编程惯例 所谓程序入参出参直白明显 px4的程序大多采用全局变量 而且使用UORB的通讯 使程序调用非常方便 但是使程序的可读性降低了很多 没有花一定的时间去研读很难看懂程
  • 安装win10和Ubuntu双系统开机启动项问题总结

    补充一下 xff0c 前面这是几年前刚开始用双系统的写的博客 xff0c 经验少 xff0c 但也适用于新电脑安装快 xff0c 在老电脑上装ubuntu不用这么麻烦了直接看后面的 目录 新电脑 xff08 系统没啥东西 xff09 自动分
  • pixhawk飞控板添加额外pwm输出通道控制开伞或舵机转动实现功能

    学习大佬的文章 xff0c 贴图来用 https blog csdn net dai93 article details 89852241 这是输出流的大致示意 如果在飞控需要控制单独的舵机 xff0c 可以自定义一个pwm通道输出 xff
  • px4 实现发送自定义mavlink协议消息解锁飞控板以及切换飞行模式

    原理 xff1a 通过mavlink控制台可以执行命令 xff0c 在循环中调用控制台指令的函数就行了 查阅commander文件下 所有模式切换都在commder main函数 int commander main int argc ch
  • pixhawk配置垂直起降无人机

    我使用的版本里面没有找到 43 型尾座式垂直起降无人机 就先用x型无人机了 查看代码 发现在init d目录下id号为13003 待续
  • 关于def __init__(self)

    首先说明一下 xff0c def init self 是用于初始化类 但是我们实际程序阅读过程中会发现 xff0c 这部分经常有两种状况 1 def init self xff0c 不带参数 xff0c 此处借鉴另一位博主的程序做一下分析
  • 《机器学习》周志华 集成学习

    8 1个体集成 个体学习器可以由 C4 5决策树算法 BP神经网络等 来训练 个体学习器 同质 gt 叫基学习器 也叫弱学习器 指泛化性能略优于随机猜测的学习器 xff0c 如二分类问题上精度略高于50 的分类器 相应的算法叫做 基学习算法
  • 【Windows内核编程】Win10/Win11通过PspCidTable取得EProcess

    温馨提示 本文的内容均在Windows 11 Enterprise 22000 466 版本下测试 不同版本的部分内容可能存在差异 xff0c 但万变不离其中 Upadate 20220803 经测试 xff0c 本文内容目前向下兼容 正文