Windbg跟踪ACPI亮度设定

  • A+
所属分类:逆向工程
Windbg跟踪ACPI亮度设定

本文为看雪论优秀文章

看雪论坛作者ID:hyjxiaobia



公司要出货一批笔记本,对屏幕亮度上限有限定。我无意中发现可以通过控制ACPI命名空间中Method(_BCL)的行为来实现该需求,虽然事后证明这种方式是错误的,但并不影响我记下windbg跟踪ACPI的方法。

先简单介绍一下Method(_BCL)的作用,翻开ACPI Spec会看到下列定义

Windbg跟踪ACPI亮度设定

这是一个Bios提供给OS用于设置集显亮度百分比的接口(强调一下,仅设置集显,不包含外显)。对于Win10,Method(_BCL)在切换显示比列时会生效(当然点亮屏幕前也会生效),即切换下图红框处的设置:

Windbg跟踪ACPI亮度设定

一般Method(_BCL)会返回一个从0到100的数组,分别代表100种亮度比例;如果返回的是从0到50的数组,那么当你把上图绿框中的滑块拖到最右边,你会发现屏幕只有正常亮度的一半(真节能灯)!
  Method(_BCL,0)  {    //    // List of supported brightness levels in the following sequence.    // Level when machine has full power.    // Level when machine is on batteries.    // Other supported levels.    //      Return(Package(){80, 50, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ..., 95, 96, 97, 98, 99, 100})  }

好,背景交代完毕,切入正题,用windbg调试这个ACPI method。以往,AML解释器----!amli扩展命令只集成在Checked build的Acpi.sys文件中,多数调试者止步于此。现在,win10 Free build的Acpi.sys也支持该功能(但需要acpi.pdb,解决无法连接M$调试符号服务器的解决方法参考附录1)

Step1:

开启中断到amli解释器的功能,如此可以下在ASL code上下断点:

5: kd> !amli set dbgbrkon

Step2:

虽然_BCL是已知对象,但是根据ACPI spec,每个对象位于ACPI命名空间的树状结构中,所以必须要从ACPI命名空间的根节点""开始,为特定对象下断点。搜索对象在树状结构中的路径需要用到!amli find命令,找到对象后用!amli bp下断点:

6: kd> !amli find _BCL_SB.PCI0.GFX0.DD1F._BCL  6: kd> !amli bp _SB.PCI0.GFX0.DD1F._BCL

Step3:

触发中断条件,就是在Settings->System->Display->"Scale and layout"中切换显示比列,此时windbg会中断到!amli解释器中,并且,windbg "Command Line"的提示符从kd>变为Input>,这时可以直接在解释器中输入!amli的参数:

AMLI(? for help)-> lc Ctxt=ffff8e0c81c23050, ThID=ffff8e0c74c0e080, Flgs=----R----, pbOp=ffff8e0c71b292ea, Obj=_SB.PCI0.GFX0.DD1F._BCL

上面的lc用于显示ACP中断时,当前的上下文。很明显,我们已经执行了_BCL函数。

Step4:

单步调试ACPI运行是不可能了,但是有折中的办法:用!amli u反汇编ACPI函数,并在指定分支处下断点。虽然这个办法效率很低,但好在ACPI method代码量不大,还算可行。

AMLI(? for help)-> u _SB.PCI0.GFX0.DD1F._BCLffff8e0c71b292ea:[_SB.PCI0.GFX0.DD1F._BCL]ffff8e0c71b292ea : If(CondRefOf(PBCL, ))ffff8e0c71b292f4 : {ffff8e0c71b292f4 : | Return(PBCL())ffff8e0c71b292f9 : }ffff8e0c71b292f9 : Elseffff8e0c71b292fc : {...  AMLI(? for help)-> bp ffff8e0c71b292ea    AMLI(? for help)-> g

附录1 解决无法连接M$调试符号服务器的解决方法:

张银奎老师的Nano code可以下载绝大多数pdb(具体怎么使用请移步高端调试论坛),同时Nano code支持调试kernel dump。所以,比较方便的解决办法是在目标机上强行生成kernel dump,然后用Nano code加载kernel dump并下载调试符号。



Windbg跟踪ACPI亮度设定

- End -


Windbg跟踪ACPI亮度设定


看雪ID:hyjxiaobia

https://bbs.pediy.com/user-home-817607.htm

  *本文由看雪论坛 hyjxiaobia 原创,转载请注明来自看雪社区。




# 往期推荐





Windbg跟踪ACPI亮度设定
公众号ID:ikanxue
官方微博:看雪安全
商务合作:[email protected]



Windbg跟踪ACPI亮度设定

球分享

Windbg跟踪ACPI亮度设定

球点赞

Windbg跟踪ACPI亮度设定

球在看



Windbg跟踪ACPI亮度设定

点击“阅读原文”,了解更多!

本文始发于微信公众号(看雪学院):Windbg跟踪ACPI亮度设定

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: