开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 31225|回复: 403
收起左侧

[2022开源大赛(第七届)] 【易首发】调用CE驱动实现内存读写、映射、远程APC等功能

    [复制链接]
发表于 2022-10-28 18:15:54 | 显示全部楼层 |阅读模式   北京市北京市

前言:

  • 重要!Windows 22H2下加载CE驱动会报签名吊销。
  • 本文会详解CE某些功能的实现和调用。
  • 本文内容较多,不想看内容请直接拉到底。
  • 本程序调用CE驱动实现,仅供学习参考,禁止用于非法用途(放心,原版CE的驱动,早就是黑名单上的东西)
  • Cheat Engine源码:Cheat-Engine

如何调用CE驱动?

  • 调用CE驱动是一个比较困难的事情,主要体现在两个方面:

  • 首先是加载驱动:正常加载CE驱动时程序会读取RegistryPath下的A/B/C/D项作为“DriverString”“DeviceString”“ProcessEventString”和“ThreadEventString”

    • 大致代码:
    • 不过这部分绕过很简单,模拟CE写好注册项就好。
  • 其次的部分是最难的,不要以为驱动加载起来之后就完事大吉。

    • 当你加载好驱动,用CreateFileA创建驱动通信句柄时,却发现会创建失败。
    • 看CE代码:
    • 首先创建端口时使用了SeSinglePrivilegeCheck检测进程是否有SE_DEBUG_PRIVILEGE(调试权限),没有就返回STATUS_UNSUCCESSFUL,其次程序会使用SecurityCheck校验程序是否为CE。
    • SecurityCheck首先调用了ZwQueryInformationProcess获取进程IMAGE路径,然后使用CheckSignatureOfFile校验程序。
    • CheckSignatureOfFile部分代码:
    • 这个检测很严格,首先用CheckSignature命令检测程序数字签名是否正常,然后又使用TestProcess检测进程的.text段是否正常,总之,这两步校验在驱动层完成,用户层想要直接绕过两次校验的可能性基本为0。
    • 那么应该怎么绕过去呢?
    • 其实方法有很多,例如CE在启动的时候会加载lua53-32.dll,只要知道这点问题就很简单了。
    • 首先用易语言创建一个Dll(源码:lua注入.e),劫持掉lua53-32.dll,然后主程序启动正常CE,被劫持中的lua53-32.dll使用CreateFileA创建驱动通信句柄即可,创建好句柄后再利用DuplicateHandle函数将驱动句柄拷贝给主程序即可:
    • 测试非常成功:
    • 注意,开启x64的CE后,有可能会导致x86的CE加载失败(概率比较低,但是原因不明),所以使用CE驱动时最好不要先启动着x64的CE。

CE驱动的功能:

  • CE驱动的功能非常的多(DBVM技术,VT技术,读写什么的都有)

  • 看了一下驱动中DispatchIoctl部分的代码,大致写了一点接口出来:

  • 1.IOCTL_CE_READMEMORY:

    • 读进程数据(一次性读最多32767Byte),没什么说多的。
    • 原理:KeAttachProcess附加到进程,检测地址是否可读,检测是否读取内核数据,RtlCopyMemory读取数据,KeDetachProcess取消附加,非常简单:
    • 测试结果(读取ntoskrnl.exe的内核数据):
  • 2.IOCTL_CE_WRITEMEMORY:

    • 写进程数据(一次性读最多32767Byte),没什么说多的。
    • 原理:KeAttachProcess附加到进程,检测地址是否可写,检测是否是写入内核数据,RtlCopyMemory读取数据,KeDetachProcess取消附加
  • 3.IOCTL_CE_OPENPROCESS

    • 打开任意进程。
    • 原理:PsLookupProcessByProcessId将PID转换为EPROCESS,然后使用ObOpenObjectByPointer实现将EPROCESS打开一个引用对象,最后ObDereferenceObject函数减少一次EPROCESS的引用,将打开的对象返回给程序即可。
    • 测试结果(尝试打开进程System,成功拿到其Full Control的进程句柄):
  • 4.IOCTL_CE_OPENTHREAD

    • 打开任意线程。
    • 原理:使用内核ZwOpenThread函数
  • 5.IOCTL_CE_QUERY_VIRTUAL_MEMORY

    • 查询内存属性
    • 原理:KeAttachProcess附加到进程,将虚拟地址转换为PageIndex,直接查询Page保护属性,最后KeDetachProcess取消附加,大致的过程:
  • 6.IOCTL_CE_GETPETHREAD

  • 7.IOCTL_CE_GETPEPROCESS

  • 8.IOCTL_CE_GETPHYSICALADDRESS

  • 9.IOCTL_CE_READPHYSICALMEMORY

  • 10.IOCTL_CE_WRITEPHYSICALMEMORY

  • 11.IOCTL_CE_CREATEAPC

    • 创建线程APC
    • 原理:利用KeInitializeApc和KeInsertQueueApc函数直接实现向线程中插入APC。大致代码:
  • 12.IOCTL_CE_SUSPENDTHREAD

    • 暂停线程
    • 原理:内核暂停线程非常简单,直接给线程插一条APC,然后使用KeWaitForSingleObject去无限等待。
  • 13.IOCTL_CE_RESUMETHREAD

  • 14.IOCTL_CE_SUSPENDPROCESS

    • 暂停进程
    • 原理:PsSuspendProcess直接暂停进程。
  • 15.IOCTL_CE_RESUMEPROCESS

    • 恢复进程
    • 原理:PsResumeProcess恢复进程运行。
  • 16.IOCTL_CE_ALLOCATEMEM

  • 17.IOCTL_CE_EXECUTE_CODE

    • 运行代码
    • 原理:直接运行(注意,不能用这个操作执行任何的R3代码)。大致代码:
  • 18.IOCTL_CE_READMSR

    • 读MSR寄存器
  • 19.IOCTL_CE_WRITEMSR

    • 写MSR寄存器
  • 20.IOCTL_CE_MAP_MEMORY

    • 映射任意内存到本地内存。
    • 原理:用IoAllocateMdl给欲映射的虚拟内存分配一张MDL,用MmProbeAndLockPages使其内存驻留,最后使用MmMapLockedPagesSpecifyCache将MDL映射到指定虚拟内存地址。
    • 测试效果(将ntoskrnl.exe的内核数据映射到用户层,还可以直接任意读写,因为物理地址相同):
  • IOCTL_CE_UNMAP_MEMORY

PS:

  • 为什么写那么多?
  • 可能我只是想让大家知道,驱动层没有想象的那么难,也没有想象的那么简单。
  • CE的驱动的学习价值是很大的,还有一些接口还没做,自己按照需要去玩吧

源码:


源码已经上传到蓝奏云盘:https://wwd.lanzouy.com/i1mVl0eq3h7i
153216ebdpqq9pgpqdd3p4.png

点评

6   香港特别行政区*  发表于 2023-3-1 06:45
楼主 研究这些掉了不少毛吧   浙江省金华市  发表于 2022-11-15 12:04

评分

参与人数 40好评 +37 精币 +83 收起 理由
521001040 + 1 + 2 新技能已get√
sxdx1372 + 1 + 2 YYDS~!
tangqixuang + 1 支持开源~!感谢分享
蓝色形式 + 1 + 1 开源精神必须支持~
ht5124251 + 1 + 1 开源精神必须支持~
DeHby + 1 + 2 YYDS~!
他乡遇故知 + 1 + 2 YYDS~!
dghjgg + 1 支持开源~!感谢分享
懒人定制软件 + 1 + 5 YYDS~!
1051496412 + 1 + 2 开源精神必须支持~
cated + 1 一直关注你的帖子 给我不少启发 都是干货!强势
青年的故事 + 1 + 2 开源精神必须支持~
ppppzj + 1 + 2 新技能已get√
key + 1 YYDS~!
易语言资源网 + 1 + 3 开源精神必须支持~
qq729777703 + 1 + 2 支持开源~!感谢分享
Sunnnny + 1 + 2 感谢大佬开源,学习了^.^
先锋小七 + 1 + 3 支持开源~!感谢分享
超级の赛亚人 + 1 + 2 支持开源~!感谢分享
风动鸣 + 1 + 2 支持开源~!感谢分享
小了白了兔 + 1 开源精神必须支持~
quary888 + 2 YYDS~!
chinaidc + 1 + 4 支持开源~!感谢分享
空竹 + 1 + 2 火钳刘明
意大利炮 + 1 + 1 支持开源~!感谢分享
冰棍好烫啊 + 1 + 5 支持开源~!感谢分享
万里晴空 + 1 + 2 支持开源~!感谢分享
794229345 + 1 + 2 支持开源~!感谢分享
落雪无尘 + 1 + 3 支持开源~!感谢分享
Suky + 1 + 1 精彩文章希望继续努力
jiang910615 + 1 + 2 真心厉害
fjgh + 1 + 2 支持开源~!感谢分享
fyh505099 + 1 + 3 支持开源~!感谢分享
梦寻简单 + 1 + 3 新技能已get√
冰点 + 1 + 5 感谢发布原创作品,精易因你更精彩!
远赴 + 1 + 2 新技能已get√
天雷 + 1 + 2 支持开源~!感谢分享
sinewtec + 1 + 3 支持开源~!感谢分享
luckfish45 + 1 + 1 支持开源~!感谢分享
yuan71058 + 1 + 1 支持开源~!感谢分享

查看全部评分

本帖被以下淘专辑推荐:

发表于 2024-9-16 08:07:38 高大上手机用户 | 显示全部楼层   **
哇大佬牛逼,感谢教程
回复 支持 反对

使用道具 举报

签到天数: 1 天

发表于 2024-6-23 06:12:14 | 显示全部楼层   河北省保定市
支持开源~!感谢分享
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2024-6-18 14:24:33 | 显示全部楼层   安徽省池州市
66666666666666666666
回复 支持 反对

使用道具 举报

签到天数: 19 天

发表于 2024-6-2 00:52:07 | 显示全部楼层   江苏省连云港市
支持开源~!感谢分享
回复 支持 反对

使用道具 举报

结帖率:33% (2/6)

签到天数: 17 天

发表于 2024-5-31 13:29:25 | 显示全部楼层   广东省湛江市
开源精神必须支持
回复 支持 反对

使用道具 举报

发表于 2024-5-14 08:39:02 高大上手机用户 | 显示全部楼层   江苏省泰州市
66666666
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2024-5-13 13:32:36 | 显示全部楼层   陕西省榆林市
研究这些掉了不少毛吧  ...
回复 支持 反对

使用道具 举报

结帖率:100% (3/3)

签到天数: 4 天

发表于 2024-2-18 10:52:39 | 显示全部楼层   湖南省株洲市

66666666666666666
回复 支持 反对

使用道具 举报

发表于 2024-1-8 18:55:37 高大上手机用户 | 显示全部楼层   广东省广州市
对于一个小白来说基本不懂
回复 支持 反对

使用道具 举报

发表于 2024-1-8 18:49:47 高大上手机用户 | 显示全部楼层   广东省广州市
6
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表