相信来看本博文的朋友,肯定是已经玩过linux好段时间了,才能深刻理解我此番话语。
这是在Windows下的命令行接口
这是windows下的用户接口
就是它,explorer.ext,可以去尝试。把这个进程,结束,最后得到的是
相信来看本博文的朋友,肯定是已经玩过linux好段时间了,才能深刻理解我此番话语。
这是在Windows下的命令行接口
这是windows下的用户接口
就是它,explorer.ext,可以去尝试。把这个进程,结束,最后得到的是
Bios由于需要保证运行时的透明性,它只向提供该BIOS的OEM厂商开放部分接口。用户只能通过OEM提供的App/Driver读取和设置OEM Bios。另外,OEM也保留WMI接口用于设置BIOS,同样,WMI接口也对用户透明。虽然OEM企图瞒天过海,但并不意味着我们无法获取WMI接口。本文基于ThinkPad T460P提出一种获得WMI接口的方式。另外,据了解,WMI接口可能存在安全风险,所以,这可能给渗透测试者提供了新的利用BIOS方式。
Bios\Windows通过WMI相互通信需要借助MOF(经过编译后为BMF)文件,MOF描述了BIOS导出的WMI接口名字。按Windows Instrumentation: WMI and ACPI的描述,MOF可能存在于2处:
a.由HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WmiAcpi的MofImagePath指定;不过我在ThinkPad和某OEM的机器上没有找到这样的设定,所以这种方式不做讨论。
b.作为Buffer资源,将MOF资源嵌入到ACPI命名空间下;ThinkPad和某OEM都是用这种方式实现,当然这也是本文的切入点。
读到这,你可能想到用RW获得这个ACPI对象,但是联想好像特意做了驱动,不让用户读取ACPI相关内存,如下图:
但是历史规律告诉我们:真正的隔壁老王是堵不住!虽然Windows下看不到ACPI,但是,我可以U盘进入Ubuntu用pm-tools系列工具获得需要的ACPI对象:
#acpidump > acpi.out ; dump所有的ACPI表,生成ASCII文件 #acpixtract -a acpi.out ; 将acpidump输出的ASCII文件转化为二进制.dat文件(文件中包含AML机器码) #iasl -d *.dat ;反编译.dat文件(AML),生成.dsl文件(文件中包含可读的ASL源码)
下图是进过上述步骤,ThinkPad 460P的ACPI源码文件(ASL source code):
如《Windows Instrumentation: WMI and ACPI》所述,BIOS在ASL source code中需要向WMI mapper声明设备:PNP0c14和_WDG对象。另外,OEM厂商或者IBV会在声明_WDG对象时,顺带声明嵌入式MOF对象。ACPI spec没有规定嵌入式MOF对象的名字,所以各家OEM会有不同的对象名。但是这并不是问题,它是有迹可循的:
a.嵌入式MOF对象位于_WDG对象附近,并且具有形如"Name (WQxy, Buffer()){"的ACPI对象定义(定义一个包含MOF资源的Buffer,并将该Buffer命名为WQxy。前缀WQ代表这是WMI查询接口,xy是2个16进制数值,用于标识WMI查询接口);
b.最重要的,该ACPI对象定义中包含了大量的16进制Byte,并且开头4Byte是一个魔术字:FOMB,如下:
Name (WQBA, Buffer (0x089D) { /* 0000 */ 0x46, 0x4F, 0x4D, 0x42, 0x01, 0x00, 0x00, 0x00, // FOMB....
现在离获得BIOS提供的WMI接口还有一步之遥,在继续之前,需要交代一下MOF描述文件生成MOF资源的过程。
#摘自:[原创]BIOS知识点滴Follow Bini系列之---WMI ACPI, 作者:bini #http://www.ufoit.com/thread-420-1-1.html #demowmi.mof [WMI, Dynamic, Provider("WmiProv"), Locale("MS\\0x409"), Description("Events"), guid("{39142400-C6A3-40fa-BADB-8A2652834100}") ] class DemoWMIData { [key, read] string InstanceName; [read] boolean Active; [WmiDataId(1), read, write, Description("description") ] uint32 Data; };
上面是一个MOF描述文件,经过mofcomp编译生成二进制MOF资源文件。OEM提取MOF资源文件中的字节流,嵌入到ACPI命名对象中。另外,DDK工具集中还提供wmimofck工具,以MOF资源文件为输入,生成MOF所描述的WMI接口的测试脚本。下面两行命令将依次生成bmf文件(即MOF资源文件)和vbs测试脚本:
mofcomp -B:demowmi.bmf demowmi.mof wmimofck -tdemowmi.vbs demowmi.bmf
VBS脚本中高亮处就是BIOS通过MOF导出的WMI接口。通过这段插曲,我是想说只要有MOF资源文件,就有机会解析出其中的WMI接口。另外,我们又知道ACPI表中包含MOF资源文件,所以剩下的事就是生成MOF资源文件和WMI测试脚本。剩下的篇幅我来谈谈怎么生成MOF资源文件。
1.将MOF资源中的字节流转换到二进制文件中。我们看到的是保存在ASL source code中的字符串,需要进过一系列转换才能被wmimofck当做MOF资源文件读取,转换过程其实和编写shellcode相似。
a.用notepad++对字符串进行文本处理(如按住Alt选取要删除的列),左图是ASL source code,右图是转换后的Opcode:
-->
b.为Opcode定义字符串数组,并生成可执行程序:
unsigned char arry[] = {"\x46\x4F\x4D\x42\x01\x00\x00\x00\ \x28\x05\x00\x00\xAE\x18\x00\x00\ \x44\x53\x00\x01\x1A\x7D\xDA\x54\ ... \x40\x2C\x27\x88\x80\xFC\xFF\x07"}; unsigned char arryEnd[] = {"\xaa\x55\xaa\x55"}; int main() { printf("%s", arry); return 0; }
c.IDA加载生成的可执行程序,搜索并导出数组arry:
选中arry后,Edit--Export data--勾选raw bytes--Export,导出后的文件即可作为MOF资源文件。
有了bmf文件,我们就可以用wmimofck生成vbs脚本,最后来看下ThinkPad T460P的WMI接口:
On Error Resume Next Set fso = CreateObject("Scripting.FileSystemObject") Set a = fso.CreateTextFile("lenvon.log", True) Set Service = GetObject("winmgmts:{impersonationLevel=impersonate}!root/wmi") Rem Lenovo_PreloadLanguage - Preload Language Set enumSet = Service.InstancesOf ("Lenovo_PreloadLanguage") a.WriteLine("Lenovo_PreloadLanguage") for each instance in enumSet a.WriteLine(" InstanceName=" & instance.InstanceName) a.WriteLine(" instance.CurrentSetting=" & instance.CurrentSetting) next 'instance Rem Lenovo_SetPreloadLanguage - Set Preload Language Set enumSet = Service.InstancesOf ("Lenovo_SetPreloadLanguage") a.WriteLine("Lenovo_SetPreloadLanguage") for each instance in enumSet a.WriteLine(" InstanceName=" & instance.InstanceName) next 'instance Rem Lenovo_PlatformSetting - Platform Setting Set enumSet = Service.InstancesOf ("Lenovo_PlatformSetting") a.WriteLine("Lenovo_PlatformSetting") for each instance in enumSet a.WriteLine(" InstanceName=" & instance.InstanceName) a.WriteLine(" instance.CurrentSetting=" & instance.CurrentSetting) next 'instance Rem Lenovo_SetPlatformSetting - Set Platform Setting Set enumSet = Service.InstancesOf ("Lenovo_SetPlatformSetting") a.WriteLine("Lenovo_SetPlatformSetting") for each instance in enumSet a.WriteLine(" InstanceName=" & instance.InstanceName) next 'instance a.Close Wscript.Echo "lenvon Test Completed, see lenvon.log for details"
我们可以以管理员运行WMICodeCreator.exe,来验证和执行这些WMI接口:Namespace选择root\WMI,Classes可以选择Lenovo_PlatformSetting\Lenovo_SetPlatformSetting等。
参考:
windows API简介--用户接口(系列2) (转)[@more@]
用户接口:
用户接口函数可以应用软件创建和管理一个用户界面的功能.
你可以通过这些函数来控制屏幕的显示输出,提示软件用户输入
数据,还可以调用其它程序来用及时的交互响应用户的要求。
现在大多数的应用程序已经不单单是单个窗口作业了。应用软件通过窗口类和相应的处理程序定义了它们一些基本
的行为和外观.窗口类确定了一些默认的窗口性质诸如:鼠标
的点击,菜单的响应等等.而一些相应的处理程序代码则是来响
应程序的窗口行为,调用外部请求作业,和处理用户的输入等。
应用程序通过使用api中的GDI(图形设备接口)功能函数在屏幕中
输出信息,因为所有的窗口共用一个显示屏幕,应用程序不可
能拥用整个屏幕的access(控制权).系统只能将要所有要显示输
出的列队显示在相应的窗口中。应用程序在得到处理消息时可以
在窗口中作出相应的输出,当窗口的位置,大小发生改变时,系
统会向应用程序发出消息,从而重新刷新或是重置应用程序的窗
口。应用程序以消息的形式来接收鼠标和键盘的事件,操作系统将
鼠标的移动,点击和键盘的按键转换成相应的消息送到应用程
序的消息队列中去。(系统会给每个应用程序提供一个队列来
存放这些消息).然后,应用程序再调用相应的消息处理函数来
从消息队列中提取出这些消息,并将它们分派到相应的windows
处理程序中。应用程序可以直接处理鼠标和键盘的消息或是让系统通过菜单
和快捷键列表来将它放到低级命令中。你可以通过菜单显示一
列命令给用户,通过用户的选择系统作出相应的行为。快捷键
表则是将按键消息与按键一一对应起来,通过它可以和相应的
菜单选择产生同样的消息。应用程序经常会用对话框的形式来提示用户输入一些附加的住
处,一个对话框可以算作是显示信息或提示输入的一个临时的
窗口,它其中包括的一些常见控件有:按扭(buttons),以及接
收用户输入的文本输入框(Edit text),下拉框(combo box),
滚动条...等等。对话框通过处理这些控件的输入,并转化成
用用的消息送给应用程序,帮助应用程序完成一些命令。你还可以通过加入一些数据"resources"文件或是一些DLL(动
态链接库文件)来共享一些有用的资源,如位图,图标,字体
和字符串等,应用程序通过资源函数来将这些有用的资源调
入并放到内存中去。用户接口中还有一些其它的Windows功能函数,通过它们,你
可以对符号,剪贴板,光标,钩子,图标,菜单等等Windows
的对象进行方便的设置与使用。(2,未完)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-993093/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10752043/viewspace-993093/
Windows:图形化用户界面
Unix、Linux:独立的环境。
转载于:https://www.cnblogs.com/luo841997665/p/4662539.html