开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 2742|回复: 79
收起左侧

[其它源码] (内核级)修改物理虚拟网卡MAC地址

  [复制链接]
发表于 2024-4-16 05:38:51 | 显示全部楼层 |阅读模式   广西壮族自治区柳州市
分享源码
界面截图:
是否带模块: 纯源码
备注说明: -
本帖最后由 雨过天晴 于 2024-4-16 23:25 编辑

首先,不要问我有什么用这个问题很无聊。开发语言实现原理
通过对内核层ndis,netio 的虚函数HOOK 实现的最接近底层获取实现的劫持。
技术解释
r3层要获取mac无论使用什么方法最终进入内核态只有NtDeviceIoControlFile函数。
其中微软封装的获取mac函数只有iphlpapi模块,另外也可以通过NtDeviceIoControlFile 的
IOCTL_NDIS_QUERY_GLOBAL_STATS操作码得到mac。
在NtDeviceIoControlFile 进入内核态后会通过irp派遣执行nsiproxy-netio-ndis,最终由ndis从已经加载在内核的网卡驱动设备列表枚举出已经开系统启动时加载到内存的mac值,最后依次返回到应用层。
这里要说明的是IOCTL_NDIS_QUERY_GLOBAL_STATS 可以返回的是  8字节的mac地址 和 0x104字节的mac 地址和一些网卡信息
通过irphook很好实现对IOCTL_NDIS_QUERY_GLOBAL_STATS 获取的内容篡改。
而iphlpapi获取的有两种,一种是SendARP ,另外一种 GetAdaptersInfo。GetAdaptersInfo进入irp后也是经过nsiproxy-netio-ndis最后去调用ndisNsiEnumerateAllInterfaceInformation内核函数。
它是一次性完成的,ndisNsiEnumerateAllInterfaceInformation会返回所有网卡的所有信息。

开发起因
之前分析过一个某大厂的驱动文件,其后来使用的内核HOOK技术,堪称神龙不见首尾。排除使用虚拟化技术后,几乎把整个内核翻烂了都看不见他挂钩的痕迹,并且在它有可能执行的函数完全没有发现它的任何调用,我很郁闷,研究了有2个多月。在研究过程中发现内核很多可以挂钩的地方,现在开源的就是其中一种。除了ntoskrnl灯下黑较少之外,其他相关对硬件操作(如网卡 硬盘 等外设驱动)几乎到处可以HOOK,当然,这些核心驱动也是在PG的监视下的,但是他们有很多空间可以对其进行魔改。在我上诉困扰的研究期间,光对文件系统的HOOK 在内核层中都发现了不下十处不被PG监视的可挂钩区域。

使用方法
易语言的调用源码、驱动源码和成品都打包在压缩包中,安装驱动后点修改即可。
特殊说明
由于是从完整工程里面临时拆分出来的,所以源码比较乱。
在win10测试正常,7系统可能需要修改wdk重新编译驱动

在对IOCTL_NDIS_QUERY_GLOBAL_STATS处理部分,之前上传的,这一部分代码是从吾爱破解论坛开源的代码申引过来的,源码中和原贴也有注明该部分是转载,但是没想到原贴作者很不大度,于是将其部分完全删除!
开源的原因纯属知识共享,因此,我花了五分钟时间找了个更加优秀简单的HOOK位置,让使用易语言的朋友也能了解这一部分实现过程,以下详细解析上述2种挂钩位置的摸索经过。

1.ndisNsiEnumerateAllInterfaceInformation
这一部分底层函数主要是由iphlpapi模块调用,最终进入内核过程是nsiproxy-netio-ndis,本源码中对netio模块进行hook,挂钩其虚函数。
在跟踪这一系列签派时发现,最终实现是从netio进入 NsiEnumerateObjectsAllParametersEx进入的ndis模块,而netio是最后一给拥有虚函数指针的模块,所有我们将在这里挂钩。
我们在使用IDA 分析的时候,发现函数首中有一段NsiNmpList,网卡设备列表的数据结构数组
-1.jpg
并且向下跟踪后,会发现是从  v81 = (*((__int64 (__fastcall **)(__int128 *))v23 + 8))(v102); 这里进入实现call(这里便是我提到的虚函数。

-2.jpg

于是我们只需要获取到NsiNmpList这个指针地址,如同伪代码一样枚举,而后修改这个函数的指针便能实现HOOK,详情源码所示。
在这个函数的回调过程中会得到一个
                struct iphl
                {
                        ULONG64 x3;
                        ULONG64 x4;
                        ULONG64 x5;
                        ULONG64 x6;
                        ULONG64 x7;
                        ULONG64 x8;
                        ULONG64 x9;
                        PCHAR  macData;
                        SIZE_T  macBuffsize;
                        PCHAR  NetData;
                        SIZE_T  NetBuffsize;
                        SIZE_T  Count;
                };
如此结构的数组,依次遍历修改macData 便可实现修改效果。

2.IOCTL_NDIS_QUERY_GLOBAL_STATS
由于借鉴的原作者这一部分不允许引用他的代码否则会发生诉讼,所以我重新找了一份更加简单的挂钩方法,代码量只有原来的十分之一。
我们在ida对ndis进行反编译 ,直接搜索IOCTL_NDIS_QUERY_GLOBAL_STATS操作码0x170002后会到达如下代码段。


2.jpg
3.jpg

在单步跟踪后我们发现,mac是由ndisQueryDeviceOid这个函数返回出来的,我们在ndisQueryDeviceOid这个函数,对返回的地址下写入硬件断点,最终达到如下位置。
5.jpg



我返回上一层地址,发现这里是一个虚函数,那么操作空间就来了

1.jpg

在我们自己手打计算出这个虚函数地址 回调函数直接复制原函数的伪代码便能实现IOCTL_NDIS_QUERY_GLOBAL_STATS操作码的HOOK
4.jpg


IOCTL_NDIS_QUERY_GLOBAL_STATS 一般是用于DeviceIoControl主动通讯获取mac 或者wmi的获取mac会在这里实现,在我的测试源码中易语言也写有这部分。
mac.rar (1.95 MB, 下载次数: 202)



点评

打包版本编译好的驱动使用的是免费的吊销驱动签名,所以在更新了最新补丁的系统上可能会出现加载失败,   广西壮族自治区柳州市  发表于 3 天前
楼主坚持不懈的精神值得我们学习。   湖北省荆门市  发表于 2024-4-16 08:12

评分

参与人数 34好评 +16 精币 +53 收起 理由
北城美男子 + 1 换了兼容的驱动签名 在win11 某些加载成功 但是没有实际效果
ppppzj + 1 + 2 支持开源~!感谢分享
keyi5566 + 1 感谢分享,很给力!~
ewake + 1 感谢分享,很给力!~
ican8 + 1 感谢分享,很给力!~
爲妳執著 + 1 + 2 开源精神必须支持~
YzZA + 1 感谢分享,很给力!~
南风知意 + 1 + 2 牛逼
亿意亦易 + 1 + 3 开源精神必须支持~
无尘666 + 1 感谢分享,很给力!~
pj小黑屋 + 1 感谢分享,很给力!~
t176 + 1 感谢分享,很给力!~
望尘莫及 + 1 感谢分享,很给力!~
qweipuq + 1 感谢分享,很给力!~
1828902364 + 1 感谢分享,很给力!~
小芬子 + 1 + 2 开源精神必须支持~
风雨3137 + 1 感谢分享,很给力!~
XXGL2005 + 1 感谢分享,很给力!~
※逍遥游※ + 1 感谢分享,很给力!~
qiyuer + 1 感谢分享,很给力!~
聿聿 + 1 感谢分享,很给力!~
Zźh926 + 1 感谢分享,很给力!~
涛哥娱乐网 + 1 + 3 再搞一个hook 硬盘序列号的就更好了
虚无の世界 + 1 + 2 YYDS~!
龍貓 + 1 + 1 新技能已get√
財財 + 1 感谢分享,很给力!~
yujiekuxiao + 1 + 2 支持开源~!感谢分享
2017浮影 + 1 + 2 支持开源~!感谢分享
inat + 1 + 2 支持开源~!感谢分享
学而容易 + 1 + 2 支持开源~!感谢分享
Bszk + 1 + 3 开源精神必须支持~
猪滴寳貝哝 + 1 + 2 开源精神必须支持~
齐恩 + 1 + 2 开源精神必须支持~
李泽勇2 + 1 + 3 开源精神必须支持~

查看全部评分


本帖被以下淘专辑推荐:

结帖率:87% (60/69)

签到天数: 7 天

发表于 前天 13:04 | 显示全部楼层   新疆维吾尔自治区伊犁哈萨克自治州
win11 没有效果
回复 支持 反对

使用道具 举报

结帖率:0% (0/5)

签到天数: 7 天

发表于 3 天前 | 显示全部楼层   广东省江门市
学习一下
回复 支持 反对

使用道具 举报

签到天数: 1 天

发表于 3 天前 | 显示全部楼层   河北省沧州市
精神值得我们学习
回复 支持 反对

使用道具 举报

签到天数: 1 天

发表于 3 天前 | 显示全部楼层   河北省沧州市
这是好东西啊,谢谢
回复 支持 反对

使用道具 举报

结帖率:50% (2/4)

签到天数: 20 天

发表于 5 天前 | 显示全部楼层   陕西省西安市
楼主坚持不懈的精神值得我们学习。   
回复 支持 反对

使用道具 举报

签到天数: 10 天

发表于 5 天前 | 显示全部楼层   广东省茂名市
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

签到天数: 13 天

发表于 6 天前 | 显示全部楼层   广东省河源市
谢谢分享
回复 支持 反对

使用道具 举报

签到天数: 8 天

发表于 2024-4-22 17:07:38 | 显示全部楼层   湖北省黄冈市
太复杂了,学不会啊。
回复 支持 反对

使用道具 举报

结帖率:82% (9/11)

签到天数: 9 天

发表于 2024-4-22 10:28:44 | 显示全部楼层   湖北省武汉市
        感谢分享,很给力!~
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

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

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

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