关于进程间的访问权限等进程间控制资料收集

2023-05-16

http://www.vckbase.com/

DUPLICATEHANDLE函数可以实现将同步内核对象被拷贝并且将原内核对象关闭, 从而达到可以自由控制内核对象的目的, 这可以实现使得只能单一启用的进程成为多启用的进程的目的。

实现方法:

只要用钩子WH_GETMESSAGE挂钩并实现如下代码即可

LRESULT HookProc(int code, WPARAM wParam, LPARAM lParam)    
{   
  STARTUPINFO startUpInfo;
 GetStartupInfo(&startUpInfo);

 char str[MAX_PATH];
 LPSTR lpStr = startUpInfo.lpTitle;
 if (!g_bFounded)
 {
  if (lpStr != NULL)
  {
   _splitpath(lpStr,NULL, NULL, str, NULL);

   DWORD iStrLen = MAX_PATH;
   DWORD dwRegType = 0;
   RegQueryValueExA(HKEY_CURRENT_USER, "PeHook//HookedProcessName", NULL, &dwRegType, (LPBYTE)g_strAppName, &iStrLen);
   if (strcmp(str,/*"wmplayer"*/g_strAppName) == 0)
   {
    HANDLE hToken;
    TOKEN_PRIVILEGES tp;
    DWORD rl;
    BOOL Result = FALSE;

    //打开进程令牌环
    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);

    //获得进程本地唯一ID
    if (LookupPrivilegeValueA(NULL, "SeDebugPrivilege", &tp.Privileges[0].Luid) )
    {
     tp.PrivilegeCount = 1;
     tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
     //调整权限
     Result = AdjustTokenPrivileges(hToken, false, &tp, sizeof(tp), NULL, &rl);
    }

    if (Result)
    {
     char  buffer[200];
     HANDLE hSrcProc = GetCurrentProcess();
     DWORD dwError = GetLastError();
     HANDLE hSrcHandle = (HANDLE)0x38;
     HANDLE hCurProc= GetCurrentProcess();
     HANDLE hTargetHandle = 0;
     BOOL bRet = DuplicateHandle(hSrcProc, hSrcHandle, hCurProc, &hTargetHandle, DUPLICATE_SAME_ACCESS, FALSE, DUPLICATE_CLOSE_SOURCE);
     
     if (bRet)
     {
      CloseHandle(hTargetHandle);
      g_bFounded = TRUE;
     }

}

}
 return CallNextHookEx(glhHook,code,wParam,lParam);
}
/

资料:

CSDN: http://cache.baidu.com/c?m=9f65cb4a8c8507ed4fece76310408a23450add306ac0d0622e95c51484642c1d1020fefa7a65505584d87f6001ad4356e8e4732f77552fa0edca9f3caaace22238f92123716c913164c46da5dc3624d651e14de8df0e97bfe74392b9a3a4c82520dd52756df1fa9c290a03bb1be76246&p=8e6ed55f86cc4bf30be2943848&user=baidu

CSDN:  http://cache.baidu.com/c?m=9f65cb4a8c8507ed4fece7631046893b4c4380146d96864968d4e414c4224627003ab8f12422141980852d3d5aeb1e41eaf234762a0022aa98cb9549dcba902f2b8e3034074fc70358c75cf28b102a9660d007a9b81897adf74684afa2808e05048b12127bf0e78c2e1715ba39a7486ab4f08e48640252edb17225a2082068de&p=c933891985cc44f508e2937c505d&user=baidu

 

简单算法遍历PspCidTable句柄表

ULONG GetPspCidTable()
{
  ULONG PspCidTable=0;
  ULONG FuncAddr=NULL;
  UNICODE_STRING FuncName={0};
  
  RtlInitUnicodeString(&FuncName,L"PsLookupProcessByProcessId");
  FuncAddr=(ULONG)MmGetSystemRoutineAddress(&FuncName);
  for (;;FuncAddr++)
  {
    if ((0x35ff==(*(PUSHORT)FuncAddr)) && (0xe8==(*(PUCHAR)(FuncAddr+6))))
    {  
      PspCidTable=*(PULONG)(FuncAddr+2);
      break;
    }  
    
  }
  return PspCidTable;
}

#define OBJECT_BODY_TO_TYPE 0x10
//从3级表开始遍历
ULONG BrowseTableL3(ULONG TableAddr)
{
  ULONG Object=0;
  ULONG ItemCount=511;

  do 
  {
    TableAddr+=8;
    Object=*(PULONG)TableAddr;
    Object&=0xfffffff8;
    
    if (Object==0)
    {
      continue;
    }
    if ((*PsProcessType)==(*(PULONG)(Object-OBJECT_BODY_TO_TYPE)))
    {
      KdPrint(("%s",PsGetProcessImageFileName((PEPROCESS)Object)));
    }    
  } while (--ItemCount>0);
  
  return 0;
}

//从二级表开始遍历
ULONG BrowseTableL2(ULONG TableAddr)
{
  do 
  {
    BrowseTableL3(*(PULONG)TableAddr);
    TableAddr+=4;
  } while ((*(PULONG)TableAddr)!=0);

  return 0;
}

//从1级表开始遍历
ULONG BrowseTableL1(ULONG TableAddr)
{
  do 
  {
    BrowseTableL2(*(PULONG)TableAddr);
    TableAddr+=4;
  } while ((*(PULONG)TableAddr)!=0);

  return 0;
}

VOID RefreshProcessByPspCidTable()
{
  ULONG PspCidTable=0;
  ULONG HandleTable=0;
  ULONG TableCode=0;
  ULONG flag=0;

  PspCidTable=GetPspCidTable();
  HandleTable=*(PULONG)PspCidTable;
  TableCode=*(PULONG)HandleTable;
  flag=TableCode&3;
  TableCode&=0xfffffffc;  
  
  switch (flag)
  {
  case 0:
    BrowseTableL3(TableCode);
    break;
  case 1:
    BrowseTableL2(TableCode);
    break;
  case 2:
    BrowseTableL1(TableCode);
    break;    
  }
  
  
}

劫持内核句柄

2009-06-17 10:42:42  www.hackbase.com  来源: 看雪
  Sysnap 2009,6  为什么需要 句柄?   句柄只是对对像的引用,当我们进入 内核时,获取 对象显然是很简单,但为什么还需要 句柄  呢? 应该说我们需要 句柄做为参数调用API. 因为直接操作 对象,可能会涉及到许多的 ...
  Sysnap 2009,6
  为什么需要 句柄?
   句柄只是对对像的引用,当我们进入 内核时,获取 对象显然是很简单,但为什么还需要 句柄
  呢? 应该说我们需要 句柄做为参数调用API. 因为直接操作 对象,可能会涉及到许多的未导
  出的东西,如果自己实现的话是不大现实,而调用标准的 内核API又很多时候依赖于 句柄,但
  又很多时候因为种种原因,我们得不到 句柄,这里我们将探讨下怎样获取一个有用的 句柄.
  任何问题欢迎指正: http://hi.baidu.com/sysnap/blog
  1 句柄的创建
  ObpCreateHandle 这个函数会判断AccessMode,如果是用户态的,那PVOID ObjectTable;
  ObjectTable = PsGetCurrentProcess()->ObjectTable
  如果是在驱动中打开 句柄,则ObjectTable = ObpKernelHandleTable;
  ObpKernelHandleTable是一个指向HANDLE_TABLE的指针,在系统中并没有导出
  接着便会ATTACH 到SYSTEM进程..
  调用ObpIncrementHandleCount增添Object引用数,这个地方我们慢点再考虑有没必要做一
  些工作.
  调用ExCreateHandle 创建 句柄,ExCreateHandle中调用
   分配一个HANDLE_TABLE_ENTRY和一个 句柄,这个 句柄的值的产生是在
  ///ExpAllocateHandleTableEntry中完成的.
  ExpAllocateHandleTableEntry 是 句柄分配的核心,也涉及到了相关的数据结构.但这里我
  们可以不用管它.
  我们只需要知道ObpCreateHandle会给我们返回一和 句柄,并且会在ObjectTable新添加一
  个HANDLE_TABLE_ENTRY
  lkd> dt _HANDLE_TABLE_ENTRY
  nt!_HANDLE_TABLE_ENTRY
  +0x000 Object           : Ptr32 Void
  HANDLE_TABLE_ENTRY 就包含有我们的Object了.
  2 句柄到OBJECT的映射
  这里涉及到了 句柄表的格式,关于 句柄表,网上已经有相关的文章讨论了,这里将不再说
  typedef struct _EXHANDLE
  {
  union
  {
  struct
  {
  ULONG TagBits : 02;
  ULONG Index   : 30;
  };
  HANDLE GenericHandleOverlay;
  };
  } EXHANDLE, *PEXHANDLE;
  可以看出,一个类型为HANDLE的,其实分为俩部分,TagBits和Index,具体干什么,请看下面
  的函数
  PHANDLE_TABLE_ENTRY
  LookupHandleTableEntry(
  IN PXP_HANDLE_TABLE HandleTable,
  IN EXHANDLE         Handle
  )
  {
  ULONG i, j, k;
  PHANDLE_TABLE_ENTRY Entry = NULL;
  ULONG TableCode = HandleTable->TableCode& ~TABLE_LEVEL_MASK;
  i = (Handle.Index >> 17) &0x1FF;
  j = (Handle.Index >> 9)  &0x1FF;
  k = (Handle.Index)       &0x1FF;
  switch (HandleTable->TableCode &TABLE_LEVEL_MASK)
  {
  case 0 :
  Entry = &((PHANDLE_TABLE_ENTRY)TableCode)[k];
  break;
  case 1 :
  if (((PVOID *)TableCode)[j])
  {
  Entry = &((PHANDLE_TABLE_ENTRY *)TableCode)[j][k];
  }
  break;
  case 2 :
  if (((PVOID *)TableCode)[i])
  if (((PVOID **)TableCode)[i][j])
  {
  Entry = &((PHANDLE_TABLE_ENTRY **)TableCode)[i][j][k];
  }
  break;
  }
  return Entry;
  }
  这样的话我们就可以根据HANDLE..获取到HANDLE_TABLE_ENTRY从而得到Object
  上面的函数只适合XP和2003
  3 句柄的权限
  如果我们想修改某个 句柄的权限,可以通过HANDLE_TABLE_ENTRY::GrantedAccess
  4ObOpenObjectByPointer
  ObReferenceObjectByPointer添加计数
  ObpCreateHandle 句柄的创建
  5怎样伪造.
  比如我们想伪造一个XX.EXE进程的 句柄.
  1首先我们需要确定 ObpKernelHandleTable
  DWORD dwObpKernelHandleTable = 0;
  PVOID lpPsSystemObject = (PVOID)PsGetCurrentProcess();
  dwObpKernelHandleTable = *(DWORD*)((DWORD)lpPsSystemObject +
  gdwObjectTableOffset);
  2 ObOpenObjectByPointer 打开explorer.exe (这里随便找个没保护的进程就可以)
  获取 句柄 hProcess
  3 用某些办法获取XX.EXE 的进程 对象EPROCESS
  4 用hProcess为参数调用,LookupHandleTableEntry得到一个指向PHANDLE_TABLE_ENTRY的
  指针pEntry
  这个时候pEntry->Object应该就是 explorer.exe的EPRCESS
  5 修改pEntry->Object = XX.EXE的EPROCESS
  这样我们就完成了HANDLE和OBJECT的劫持..
  这都是主要步骤,其中有些细节问题需要注意,比如增加 对象句柄数啊等等.
  6 有效果吗?
  我们知道大部分 内核API都会以一个HANDLE做为参数的,其内部基本都是调用了
  ObReferenceObjectByHandle来定位 对象,我们分析下ObReferenceObjectByHandle就知道
  我们的劫持是否有用了.
  很显然ObReferenceObjectByHandle是根据 HANDLE_TABLE来把 句柄转化为 对象,过程简单
  为 handle--->> pEntry->Object
  所以劫持是成功的.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于进程间的访问权限等进程间控制资料收集 的相关文章

  • 有了这份程序员面试指南,你离大厂Offer还远吗?| 附推荐书籍

    点击上方蓝色字体 xff0c 关注我 一个在阿里云打工的清华学渣 图by 石头 64 长白山 关于作者 xff1a 程序猿石头 ID tangleithu xff0c 现任阿里巴巴技术专家 xff0c 清华学渣 xff0c 前大疆后端 Le
  • 记录一次harbor的镜像扫描和更新

    前提 已经部署好harbor 192 168 14 16 项目名称 harbor 1 在harbor服务器拉取centos源镜像 root localhost docker pull centos Using default tag lat
  • 关于pixhawk硬件IMU和compass那点事儿

    文章目录 前言一 IMU和compass是什么 xff1f 二 导航坐标系与机体坐标系三 安装IMU xff0c compasss四 hwdef中设置IMU xff0c compass朝向总结 前言 继上一篇讲解了pixhawk的硬件组成
  • ubuntu下ardupilot编译环境搭建与仿真

    文章目录 前言一 ardupilot 源码下载二 编译环境建立仿真经验教训坑1坑2 参考 前言 虽然怒飞老师给出了详细的windows下的开发环境的搭建教程 但是对于开发者而言 xff0c 最好的系统环境还是在Linux系统下 xff0c
  • Ubuntu下MissionPlanner的安装

    文章目录 前言一 安装mono二 下载并使用MissionPlanner三 创建快捷脚本 前言 众所周知 xff0c QGC地面站外观更加好看 xff0c 开发上也是采用跨平台的Qt 在ubuntu上安装十分方便 但是我还是更喜欢用Miss
  • Nmap详解

    Nmap简介 Nmap也就是Network Mapper xff0c 网络发现 xff08 Network Discovery xff09 和安全审计 xff0c 是一款网络连接端扫描软件 xff0c 用来扫描网上电脑开放的网络连接端 确定
  • PX4 自定义bootloader生成

    本文主要是记录一下自己在这方面的学习 xff0c 方便以后回顾 xff0c 也希望对其他朋友有用 本着不重复造轮子的精神 xff0c 这里引文不在复制粘贴 xff0c 直接给出链接 生成bootloader的两种方式 以STM32H7作为主
  • PX4开发中遇到的一些问题和解决方法

    文章目录 前言正文1 仿真出现 FCU Preflight Fail Accel 0 uncalibrated等错误2 添加mavlink数据发送or提高数据发送频率3 PX4在不同硬件下的RC输入4 PX4 参数自定义5 电机输出顺序6
  • PX4自定义混控器

    文章目录 前言混控器简介混控器的启动自定义混控器参考 xff1a 前言 上一篇我对PX4的控制和输出的全流程都进行了较为详尽的分析 xff0c 本来想着之后的研究主要在四旋翼控制算法上 xff0c 不会定义啥新机型 xff0c 混控器的部分
  • 运行VINS,相机模型与参数的准备

    相机模型与参数 对于VINS来说 xff0c 相机的内参的准确是万分重要的 如果参数不对 xff0c 那么100 跑飞 xff0c 没商量 要想VINS可以很好的工作 xff0c 给出良好的相机内参是必须的 对于realsense系列的相机
  • MTF模块 PX4 光流模块详细配置

    对于研究无人机的新手 xff0c 直接飞手动模式 xff0c 可能过于困难 在室内测试时 xff0c 又没有GPS可用 为了安全和方便起见 xff0c 可以考虑选用光流模块 xff0c 降低入手难度 这里我们选择微空科技出品的MTF 01模
  • GNSS系列(3)------GNSS定位漂移讨论

    由于工作需要 xff0c 最近开启了GNSS系列文章的撰写工作 xff0c 发布于公司官网 xff0c 现将其同步至CSDN 原文链接 xff1a http onemo10086 com school article 196 小伙伴们 xf
  • ML302 OpenCPU系列(5)---Log工具的使用

    ML302 OpenCPU系列 xff08 5 xff09 Log工具的使用 一 使用串口助手抓取Log二 使用Coolwatcher抓取AP Log三 查看死机现场 工欲善其事 xff0c 必先利其器 Log是嵌入式开发中最重要的调试手段
  • 2017--就业分享之IT校招现状和面试经历

    在介绍自己整个春季和夏季实习求职经历之前 xff0c 先给大家公布一则新闻 2017届互联网校招薪酬报告 xff1a 先说下对 16 年 17 届校招的总体看法 xff1a 本该是个不大不小的年 xff0c 结果被华为一己之力搞成了个大年
  • Shell判断字符串是否相等,=两边需要有空格

    custom span class token operator 61 span span class token string 34 34 span span class token keyword if span span class
  • 学嵌入式系统设计的人应不应该看模拟电路基础

    我学嵌入式系统设计是首先从数字电路看起的 由于数字电路这门课程在大一的时候就学过 xff0c 所以觉得略看就能看懂 xff0c 也算是把这门课复习了一遍 但是当我看到存储器和可编程控件这一章时 xff0c 里面讲到存储单元主要是由半导体组成
  • 使用Python爬取淘宝两千款套套

    各位同学们 xff0c 好久没写原创技术文章了 xff0c 最近有些忙 xff0c 所以进度很慢 xff0c 给大家道个歉 gt 警告 xff1a 本教程仅用作学习交流 xff0c 请勿用作商业盈利 xff0c 违者后果自负 xff01 如
  • ​揭秘国内首个进入Apache的高校顶级项目——Apache IoTDB

    本文约4200字 xff0c 建议阅读10 43 分钟 本文与你分享有关开源数据库项目成长 开源社区治理 加速赋能企业等方面的观点与见解 近年来 xff0c 随着人工智能 物联网的兴起 xff0c 大数据成为重要的生产资料 xff0c 而时
  • 收藏 | 一张地图带你玩转机器学习(附资源)

    本文来自AI学习与实践平台SigAI 本文共16965字 xff0c 建议阅读20 43 分钟 本文对常用的机器学习和深度学习算法进行了总结 xff0c 整理出它们之间的关系 xff0c 以及每种算法的核心点 xff0c 各种算法之间的比较
  • python代码获取远程电脑IP

    实时的使用邮箱发送IP地址到指定邮箱 使用python代码封装好的软件 xff1a 链接 xff1a https pan baidu com s 1Flz7HHtZM0w3HGDeF 4BhQ pwd 61 yxy2 提取码 xff1a y

随机推荐

  • win11旗舰版安装WSL子系统和环境-3Ubuntu换源

    Wsl2开启 Ubuntu换源 https blog csdn net WPwalter article details 101508601 这个blog是进行系统安装WSL2 的 Linux 第一步 xff1a 启用虚拟机平台和 Linu
  • win11旗舰版安装WSL子系统和环境-12配置SSH(Win远程连接)

    配置SSH Win远程连接 https blog csdn net weixin 43897590 article details 109446339 utm medium 61 distribute pc relevant downloa
  • win11旗舰版安装WSL子系统和环境-17Xshell连接wsl子系统的ssh

    https blog csdn net w4187402 article details 85992013 那么问题找到了 出现这样的问题只能是ip冲突 xff0c 其他同事的服务器占用了我当前服务器的ip地址 xff0c 我现在连接的服务
  • 超好用的word插件-工作和科研

    Word精灵7 0版 可以很好地处理图片 xff0c 转换 xff0c 以及各种批量处理操作 GrammarlyAddInSetup 可以很好地校对英文错误 xff0c 单词以及语法错误 xff0c 但被动语态不太行 链接 xff1a ht
  • Adobe Premiere Pro 2023 SP(未完成)

    需要添加
  • 一个程序员所应该具备的精神

    所谓障碍都是主观上的 如果你想研发什么新的技术 xff0c 只需要在冰箱里放满食物和饮料 xff0c 再有一台便宜的计算机 xff0c 和以之献身的决心 xff0c 你即可拥有任何你想拥有的编程深度 xff01 John Carmack
  • ROS中的多线程

    ROS中的多线程 ROS多线程消息回调处理函数多线程MultiThreadedSpinnerAsyncSpinner callback传参timertimer加参数 C 43 43 中的多线程Python中的多线程 ROS使用master管
  • Linux系统下磁盘分区

    计算机的磁盘分区信息是计算机引导操作系统必须的信息 xff0c 根据引导方式的不同 xff0c 一般分别保存在MBR或者GPT中 其中 xff0c BIOS引导会读取MBR xff08 Main Boot Record xff09 中的磁盘
  • ROS中的tf发布读取转换

    ROS tf 基础使用查看tf信息1 创建link关系图2 在rqt中查看link关系图3 终端中输出tf变换关系4 rviz中查看 程序中使用TransformerTransformBroadcasterTransformListener
  • linux下shell脚本启动其他可执行程序

    linux下shell脚本启动其他可执行程序 零 前言一 C 43 43 代码二 shell脚本三 shell运行效果 零 前言 linux下的项目中经常需要使用shell脚本去启动其他程序的操作 xff0c 下面是自己编写的测试程序 xf
  • 嵌入式面试常见问题

    1 什么是嵌入式 以应用为中心 xff0c 以计算机技术为基础 xff0c 软硬件可裁剪 xff0c 适用于应用系统对功能 可靠性 成本 体积 功耗有严格要求的专用计算机系统 2 字符设备和块设备的区别 xff1f Linux里设备类型分
  • 步进电机和伺服电机的区别你知道吗?

    在许多领域都需要各种电机 xff0c 包括知名的步进电机和伺服电机 但是 xff0c 对于许多用户而言 xff0c 他们不了解这两种电机的主要区别 xff0c 因此他们始终不知道如何选择 那么 xff0c 步进电机和伺服电机之间的主要区别是
  • 独轮车成功站立

    真是废了不少力 卡了这么久首要原因就是过于青睐串级PID 串级PID可以自主寻找机械中位的特性实在是太优雅了 但动量轮这种对即使性要求极高的系统似乎不能用串级PID实现 昨天沉下心把串级PID推掉换成并联 xff0c 波形一下就朝着正常的方
  • 字节序:大端字节序(Big Endian) & 小端字节序(Little Endian)

    一 什么是字节序 xff1f 多字节数据存储在存储器中的顺序就叫做字节序 字节序又分为俩种 xff0c 一种叫做小端字节序 xff1b 另外一种叫做大端字节序 二 大端字节序 xff08 Big Endian xff09 amp 小端字节序
  • Google doc

    https docs google com spreadsheets d 1lOtc072A0QaJAXormoUeiaqZu5 20BR1ikh0YZe65PI edit gid 61 0
  • Boot Loader启动过程分析

    一 Boot Loader的概念和功能 1 嵌入式Linux软件结构与分布在一般情况下嵌入式Linux系统中的软件主要分为以下及部分 xff1a xff08 1 xff09 引导加载程序 xff1a 其中包括内部ROM中的固化启动代码和Bo
  • eclipse:解决Ctrl+S 无法保存问题

    解决Ctrl 43 S 无法保存问题 工作中有一个同事的eclipse中无法使用Ctrl 43 S保存文件 xff0c 尝试了各种方法 xff0c 禁用了所有其他软件的快捷键 xff0c 依然无法解决 xff0c 最终发现是eclipse自
  • windbg学习笔记 FOR 内核调试(三) --进程句柄表HANDLE_TABLE

    windbg学习笔记 FOR 内核调试 三 进程句柄表HANDLE TABLE 想当年 初学核编 阅读第三章的内核对象的时候跟看天书没什么感觉 死命在想到底内核对象 句柄是个什么东西 干嘛用的 于是我们工作室的老大就对我说 这篇看过就过了
  • tx2 上 安装nvidia Isaac安装记录

    Isaac的功能挺多 xff0c 但是只支持最新的版本 xff0c 所以没办法 xff0c 只能装最新的了 下面就记录一下这个过程 安装环境真是很麻烦 xff0c 不是下载失败就是下载慢 一天基本安装不完 第一步安装1804 因为只支持18
  • 关于进程间的访问权限等进程间控制资料收集

    http www vckbase com DUPLICATEHANDLE函数可以实现将同步内核对象被拷贝并且将原内核对象关闭 xff0c 从而达到可以自由控制内核对象的目的 xff0c 这可以实现使得只能单一启用的进程成为多启用的进程的目的