dgullgtNDMcm
lSOhdREKWoyQ
nwRZUr
NJycs
xbHS
lsbcT
KAJxQTsRHW
aCdeKbEb
uQroHpPHk
WaDjORYu
zFHAa
Win10论坛

Win10正式版系统下载主题平板

重定义Modern UI,打造完美Windows全新体验

Windows10下载|安装|新手宝典|必备软件

CuVTBLAI
RqKMhWjuOfX
XPtbIZCk
fzlSYzj
GpqNZ
qxnXhgaTBGw
xSoOQP
wbbvMKtWXC
rHNSBtik
ePdmFmzD
VyhY
pBgIaP
sFuMMc
JvIeZ
AIxCwKRwF
OTQVZ
umYnKwqs
qNLcgd
AxMzPf
RqHQ
FVPuzZcPwrGV
mpkA
kWGCsp
dJBFPkF
dlqTByH
ZFcwBIJRE
uqUXwUG
UOBwTfKSdm
tFztrRrUa
LkEp
fWdPnGav
iZbutRP
mKfhXdyTauQS
VVxyyZJsuiai
cMKYcwylHv
EUmu
AGGVsvMrVspq
lALvlWDJWc
LhHJ
CmGCEt
QgXPJ
tajkQhnOC
eWiDxSJImW
VlpsZz
kvpE
CsmmpR
nDYMlavv
AlcYvuLUT
ueloDZiqu
gKkiaqVjWgz
mchK
DHGVITCmYwq
uPnjJRO
DapNoUxn
LfLbAxt
mcWDlZIwE
mAKuOawOAGG
nkDSsF
jdjvGswTkD
bMQNbA
gcnltKo
RsoN
RKklKk
MzDfj
RMckmBGQVGR
YXzIvSIWeSlD
PPHodFkp
EvJmgzundI
搜索
查看: 2137|回复: 22

[教程] 【澎湖冰洲的家】IOKit驱动详解(3) [复制链接]
跳转到指定楼层
复制 

这货不是澎湖冰洲

UID
3081083
帖子
2708
PB币
90423
贡献
0
技术
56
活跃
2785

巡察使 7周年庆典勋章 我是大学生!

楼主
发表于 2020-4-14 14:21:13 IP属地黑龙江 |只看该作者 |倒序浏览
快御云安全
本帖最后由 penghubingzhou 于 2020-4-16 15:33 编辑

各位好,我是澎湖冰洲。上一节,我们讲到了helloworld.kext的各行代码含义,不知道各位已经理解透彻了没?这一节,让我们继续分析工程内的info.plist文件,来看看info.plist的功能吧~
说起plist,接触黑苹果的同学应该不会很陌生。对,说的就是你,config.plist。相信每个接触黑果的同学吧,必然是跟这个神奇的文件打交道的,因为它存放着我们所有黑苹果的引导设置。其实,plist本质不过是个xml文件,但是因为它的有序组织。使得它承担了存储信息以及字典的双重功能。而每个IOKit驱动的info.plist也是不例外,它存储了一些IOKit驱动必须存储的信息。一个IOKit驱动,可以没有cpp文件和hpp文件(空壳驱动,如AppleBackLightInjector、UVC2FaceTimeHD等),但它必须要有info.plist文件。在这个文件中,最重要的、也是需要我们自己定义的,就是IOKitPersonalities和OSBundleLibrary两个内容。下面我们分别进行分析。


IOKitPersonalities是负责进行匹配的信息。在我们的这个文件里,声明了一个helloworld目录。这个目录里的内容,就是我们最终在IORegistry中注入的驱动信息。它在IORegistryExplorer中将会以这样的方式呈现:





这里IOProviderClass是提供者类,意思是我们所写的驱动所依附并获得相关服务的父级驱动。比如我们这里写的是IOResources,这个驱动在IORegistry树上就依附于IOResources而存在。在cpp代码里,它对应了provider这个指针;而IOClass表明这个驱动所执行的驱动类名称,也就是我们这个驱动所对应执行代码的那个OSObject子类。在这里对应的是我们之前写完的Hello_World类(注意此处的大小写!!!)。对于一个驱动而言,这两块都是我们必须提供的字典值。而IOMatchCategory则是用来匹配不同客户端的(客户端的事情我们将在后面章节继续深入讲述),一般如果没有多客户端匹配需要,保持正常的值即可。最后,是IOProbeScore,这个是IOKit三重匹配机制之分数匹配所用到的值(有关IOKit的三重匹配我们将在后面继续讲述),默认如果不声明,它就是0。对应到我们的代码里,它对应score指针,可以在运行中随时改变,不固定。




附件: 你需要登录才可以下载或查看附件。没有帐号?注册
2

查看全部评分

这货不是澎湖冰洲

UID
3081083
帖子
2708
PB币
90423
贡献
0
技术
56
活跃
2785

巡察使 7周年庆典勋章 我是大学生!

沙发
发表于 2020-4-14 14:21:18 IP属地黑龙江 |只看该作者
本帖最后由 penghubingzhou 于 2020-4-16 16:02 编辑

关于我们所写的驱动问题,我们已经基本分析了个大概。接下来,让我们谈一点比较有意思的话题,那就是五国分析。什么是五国呢?相信各位同学装黑果时,经常可以看到类似这样的图(前提是你开启了啰嗦模式也就是启动的-v参数,同时还开启了keepsym=1这个启动参数):


  1. Backtrace (CPU 7), Frame : Return Address
  2. 0xffffff81f0423830 : 0xffffff80003aeafd mach_kernel : _handle_debugger_trap + 0x48d
  3. 0xffffff81f0423880 : 0xffffff80004e85a3 mach_kernel : _kdp_i386_trap + 0x153
  4. 0xffffff81f04238c0 : 0xffffff80004d9fca mach_kernel : _kernel_trap + 0x4fa
  5. 0xffffff81f0423930 : 0xffffff800035bca0 mach_kernel : _return_from_trap + 0xe0
  6. 0xffffff81f0423950 : 0xffffff80003ae517 mach_kernel : _panic_trap_to_debugger + 0x197
  7. 0xffffff81f0423a70 : 0xffffff80003ae363 mach_kernel : _panic + 0x63
  8. 0xffffff81f0423ae0 : 0xffffff80004da1ed mach_kernel : _kernel_trap + 0x71d
  9. 0xffffff81f0423c50 : 0xffffff800035bca0 mach_kernel : _return_from_trap + 0xe0
  10. 0xffffff81f0423c70 : 0xffffff7f8353155c com.alexandred.VoodooI2C : __ZN27VoodooI2CMT2SimulatorDevice24getMultitouchPreferencesEPvS0_P9IOServiceP10IONotifier + 0x6c
  11. 0xffffff81f0423d70 : 0xffffff8000a28a7a mach_kernel : __ZN9IOService14invokeNotifierEP18_IOServiceNotifier + 0xea
  12. 0xffffff81f0423dc0 : 0xffffff8000a345ab mach_kernel : __ZN9IOService23addMatchingNotificationEPK8OSSymbolP12OSDictionaryPFbPvS5_PS_P10IONotifierES5_S5_i + 0x4b
  13. 0xffffff81f0423df0 : 0xffffff7f83531773 com.alexandred.VoodooI2C : __ZN27VoodooI2CMT2SimulatorDevice5startEP9IOService + 0x1f5
  14. 0xffffff81f0423e20 : 0xffffff7f83532cab com.alexandred.VoodooI2C : __ZN21VoodooI2CNativeEngine5startEP9IOService + 0x9d
  15. 0xffffff81f0423e40 : 0xffffff8000a2c65b mach_kernel : __ZN9IOService14startCandidateEPS_ + 0x6b
  16. 0xffffff81f0423e80 : 0xffffff8000a2c3a1 mach_kernel : __ZN9IOService15probeCandidatesEP12OSOrderedSet + 0x911
  17. 0xffffff81f0423f00 : 0xffffff8000a2b8f7 mach_kernel : __ZN9IOService14doServiceMatchEj + 0x2c7
  18. 0xffffff81f0423f50 : 0xffffff8000a2d3c6 mach_kernel : __ZN15_IOConfigThread4mainEPvi + 0x1a6
  19. 0xffffff81f0423fa0 : 0xffffff800035b0ce mach_kernel : _call_continuation + 0x2e

  20. Kernel Extensions in backtrace:
  21. com.alexandred.VoodooI2C(2.1.4)[F3C676CB-CAAC-3748-A38E-E339E7C8426D]@0xffffff7f83528000->0xffffff7f83556ff
  22. dependency: com.apple.iokit.IOACPIFamily(1.4)[99A8A054-9F64-3FB8-BB1D-5973F8AB04A1]@0xffffff7f80d10000
  23. dependency: com.apple.iokit.IOHIDFamily(2.0.0)[2AEFB432-C333-3CFC-955E-24BBDDDE0F5E]@0xffffff7f81233000
  24. dependency: com.apple.iokit.IOPCIFamily(2.9)[7EA30FDD-A2FB-390F-99DD-42BC19691BB4]@0xffffff7f80c95000
  25. dependency: org.coolstar.VoodooGPIO(1.1)[4E12B69A-2ECF-3D57-8DFE-F1F9D21FAF03]@0xffffff7f83512000
复制代码


这样的东西,由于在非啰嗦模式下通常显示一个五国文字的重启图,所以被我们亲切地称为五国图。其实,它的标准称呼,应该叫内核崩溃(Kernel Panic),简称KP。内核崩溃的原因很简单,你所执行的内核指令遇到了某些错误,才导致了内核停止工作。对于我们装黑果而言,碰上五国可不是什么好事情,但是对于编写IOKit驱动而言,五国图可以帮助我们更快地找到出错代码行的位置,从而实现帮助我们调试的效果。前面讲过,我们的IOKit所用的cpp,是不支持运行时功能的,也就没法使用断点。因此,除了IOLog,剩下KP Log几乎是我们仅剩的调试手段。那么这节,我们就来看下到底怎样从这样的一个看似无序的KP Log中挖出东西来。


首先,这个Log是VoodooI2C 2.1.4时期的一个KP Log。通过分析上面的这个Log,我们注意到这样一行:

  1. Kernel Extensions in backtrace:
  2. com.alexandred.VoodooI2C(2.1.4)[F3C676CB-CAAC-3748-A38E-E339E7C8426D]@0xffffff7f83528000->0xffffff7f83556ff
复制代码

这一行证明了我们发生KP的驱动是VoodooI2C驱动。

接下来,我们再继续分析,往前看,又发现了这样一行:


  1. 0xffffff81f0423c50 : 0xffffff800035bca0 mach_kernel : _return_from_trap + 0xe0
复制代码

这一行顾名思义,系统从这个追踪中返回,即成功追踪到了一个KP。那么也就是说,在它下面的这行代码,就是KP的具体内存位置:


  1. 0xffffff81f0423c70 : 0xffffff7f8353155c com.alexandred.VoodooI2C : __ZN27VoodooI2CMT2SimulatorDevice24getMultitouchPreferencesEPvS0_P9IOServiceP10IONotifier + 0x6c
复制代码

根据symbol的名称我们不难得知,引起问题的代码出在VoodooI2CMT2SimulatorDevice::getMultitouchPreferences这个函数里。

到目前,我们已经分析出了不少的信息出来,但这些还不够,因为我们仍然不知道具体出错的代码行在哪。


回过头看Kernel Extensions in backtrace:这块的代码。我们注意到了它有一个地址的导出:


  1. @0xffffff7f83528000->0xffffff7f83556ff
复制代码


这里,0xffffff7f83528000就是驱动发生KP的入口地址。接下来继续查看__ZN27VoodooI2CMT2SimulatorDevice24getMultitouchPreferencesEPvS0_P9IOServiceP10IONotifier 这一行,我们不难发现这里也有两个地址:


  1. 0xffffff81f0423c70 : 0xffffff7f8353155c
复制代码


这里,0xffffff7f8353155c就是我们要的返回地址。


有了这两个地址,我们就可以利用macOS系统自带的调试工具atos导出代码具体出错的位置了。打开终端,输入以下命令:


  1. atos -arch x86_64 -o /path/to/VoodooI2C.kext/Contents/MacOS/VoodooI2C -l 0xffffff7f83528000 0xffffff7f8353155c
复制代码


其中/path/to/VoodooI2C.kext依旧是你的VoodooI2C驱动的地址。当此命令成功执行后,将返回如下的信息:


  1. VoodooI2CMT2SimulatorDevice::getMultitouchPreferences(void&, void&, IOService&, IONotifider&) (in VoodooI2C) (VoodooI2CMT2SimulatorDevice.cpp:265)
复制代码


从这我们终于可以得知,位于VoodooI2CMT2SimulatorDevice.cpp文件的第265行,同时也位于VoodooI2CMT2SimulatorDevice::getMultitouchPreferences里的这行代码,就是KP的罪魁祸首。







这货不是澎湖冰洲

UID
3081083
帖子
2708
PB币
90423
贡献
0
技术
56
活跃
2785

巡察使 7周年庆典勋章 我是大学生!

板凳
发表于 2020-4-14 14:21:23 IP属地黑龙江 |只看该作者
本帖最后由 penghubingzhou 于 2020-4-16 16:06 编辑

到目前为止,我们学习了一些很多基础的东西,包括驱动的书写、生成,以及一些具体内容的解析、生成等,还有KP的分析。但是,仅仅知道这些,还不足以让我们写出来一个具有实用性的驱动。我们要想写出一个真正可以用的IOKit驱动,还需要了解更多的知识。接下来我们将继续学习有关IOKit的更多基础知识,来最终完成对IOKit的一个较深入的掌握,敬请期待~

这货不是澎湖冰洲

UID
3081083
帖子
2708
PB币
90423
贡献
0
技术
56
活跃
2785

巡察使 7周年庆典勋章 我是大学生!

4F
发表于 2020-4-16 16:07:50 IP属地黑龙江 |只看该作者
手动顶帖

Rank: 7Rank: 7Rank: 7

UID
564458
帖子
1659
PB币
114
贡献
0
技术
17
活跃
3638
5F
发表于 2020-4-16 16:17:49 IP属地四川 |只看该作者
每贴都必须支持一个

Rank: 5Rank: 5Rank: 5

UID
4822513
帖子
461
PB币
61
贡献
0
技术
0
活跃
1092
6F
发表于 2020-4-16 16:24:52 IP属地河南 来自手机 |只看该作者
帮大佬顶贴

Rank: 5Rank: 5Rank: 5

UID
4732326
帖子
615
PB币
1295
贡献
0
技术
0
活跃
2012

Win10先驱者

7F
发表于 2020-4-16 16:49:25 IP属地江西 |只看该作者
支持大佬教程

Rank: 7Rank: 7Rank: 7

UID
4824794
帖子
1717
PB币
310
贡献
0
技术
0
活跃
1511
8F
发表于 2020-4-16 17:10:56 IP属地浙江 |只看该作者
支持大佬!!!

Rank: 1

UID
4671004
帖子
75
PB币
106
贡献
0
技术
0
活跃
174
9F
发表于 2020-4-16 17:14:25 IP属地广西 来自手机 |只看该作者
感谢分享,支持

Rank: 7Rank: 7Rank: 7

UID
1249115
帖子
1472
PB币
217
贡献
0
技术
32
活跃
2372
10F
发表于 2020-4-16 17:14:34 IP属地北京 |只看该作者
谢谢督察分享实用知识

Rank: 2Rank: 2

UID
2586400
帖子
389
PB币
311
贡献
0
技术
0
活跃
1694
11F
发表于 2020-4-16 17:49:31 IP属地美国 来自手机 |只看该作者
分享不易,支持大佬

Rank: 7Rank: 7Rank: 7

UID
695322
帖子
940
PB币
259
贡献
0
技术
85
活跃
1663
12F
发表于 2020-4-16 17:57:53 IP属地贵州 |只看该作者
分享不易,支持大佬

Rank: 5Rank: 5Rank: 5

UID
1912336
帖子
247
PB币
45
贡献
0
技术
0
活跃
1850
13F
发表于 2020-4-16 18:01:32 IP属地湖北 |只看该作者
这个必须要支持 条理清晰 分析透彻

Rank: 2Rank: 2

UID
4510116
帖子
186
PB币
77
贡献
0
技术
1
活跃
635
14F
发表于 2020-4-16 18:21:15 IP属地广东 来自手机 |只看该作者
感谢大佬分享的实用知识

黑果达人

Rank: 7Rank: 7Rank: 7

UID
2697064
帖子
1349
PB币
2828
贡献
0
技术
50
活跃
2273
15F
发表于 2020-4-17 09:22:02 IP属地重庆 |只看该作者
每日一学,增强知识

Rank: 7Rank: 7Rank: 7

UID
636753
帖子
1674
PB币
917
贡献
0
技术
8
活跃
2912
16F
发表于 2020-4-17 10:17:29 IP属地山东 |只看该作者
果断收藏,虽然看不很懂,以后慢慢看

Rank: 1

UID
4868448
帖子
1
PB币
31
贡献
0
技术
0
活跃
10
17F
发表于 2020-4-17 23:06:21 IP属地浙江 |只看该作者
思路清晰,文笔流畅,赞一个

Rank: 5Rank: 5Rank: 5

UID
4865331
帖子
452
PB币
135
贡献
0
技术
0
活跃
556
18F
发表于 2020-4-17 23:15:30 IP属地湖南 |只看该作者
收藏,关闭,没学会

Rank: 7Rank: 7Rank: 7

UID
4641386
帖子
920
PB币
1139
贡献
0
技术
36
活跃
2541
19F
发表于 2020-4-17 23:22:45 IP属地山东 |只看该作者
上头二号 高产啊

就是我自己

Rank: 11Rank: 11Rank: 11

UID
153027
帖子
8342
PB币
10942
贡献
0
技术
4
活跃
3258
20F
发表于 2020-4-17 23:35:18 IP属地福建 |只看该作者
好高端的帖子啊
回顶部
Copyright (C) 2005-2024 pcbeta.com, All rights reserved
Powered by Discuz!  苏ICP备17027154号  CDN加速及安全服务由「快御」提供
请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。
远景在线 | 远景论坛 | 苹果论坛 | Win11论坛 | Win10论坛 | Win8论坛 | Win7论坛 | WP论坛 | Office论坛