怎样判定应用程序自身运行在“兼容模式”下?

摘要:
这导致了两个问题:1。如何确定当前程序(本身)是否以兼容模式运行?您还可以保护此注册表位置,使其不受以兼容模式运行程序的其他人的影响。360还具有兼容性模式检测功能。我去看了它的实现,它还不错。

     P.S.话说有很多天很多天没有写东东了啊,因为实在太忙了,还是恢复至少一个月两篇的状态吧。

      我们的程序有时候需要精确的判定当前运行在哪个系统下面,也就是说程序的某个功能可能需要知道当前运行在哪个真正的操作系统下,而操作系统提供了一个兼容模式功能,就是用户可以设置某个程序运行在某个模拟的更低的版本的操作系统下面,这是有好处的,因为某些程序在某些更高版本的操作系统下面可能发生兼容性问题而无法运行。在设置兼容模式运行后,程序里面调用ring3层的GetVersionEx得到的将是模拟的的操作系统版本,而不是真正的操作系统版本。

怎样判定应用程序自身运行在“兼容模式”下?第1张

      由此而引发两个问题:

      1、怎么判定当前程序(自己)运行在兼容模式下了呢?

      2、如果有一个需求,在安装时,怎么设置一个程序运行在某个低版本的操作系统兼容模式下呢?

     

      先看下第2个问题,首先看一下在设置了兼容模式运行后,系统做了些什么事情?很容易做到,使用注册表工具对explorer.exe进行监控,在设置兼容模式应用或者确定后,发现系统在注册表 [HKCU/Software/Microsoft/Windows NT/CurrentVersion/AppCompatFlags/Layers] 写下了如下一些东东:

怎样判定应用程序自身运行在“兼容模式”下?第2张

      系统把需要进行兼容模式运行的程序路径记录在这个下面,具体兼容哪个环境则由属性的值来确定,譬如WIN2000, NT4SP5, WIN95, WIN98, WINXPSP2, WINXPSP3, WINSRV03SP1, WINSRV08SP1, VISTARTM, VISTASP1, VISTASP2等等(不要在低版本的操作系统下兼容更高版本的操作系统,不会出问题,而是毫无意义,系统直接忽略)。有了这个就可以做到把某个程序写入兼容模式运行中。也可以保护这个注册表位置防止别人来使用兼容模式运行你的程序。

      再看看第一个问题,研究下了微软实现兼容模式的原理,网上的资料很少,但是大概就是使用HOOK的原理,windows发现该程序需要进行兼容模式运行(通过查注册表啦,还有一些系统默认以兼容模式运行的程序,应该是记录在其他地方,没有深究),就会加载一些不同的系统DLL(在win32下一个应用程序想跑起来,是需要很多系统的DLL的)来进行程序的运行,大概情况如下,左边是非兼容模式运行时加载的一些DLL,右边是运行在兼容模式环境下后加载的一些DLL:

怎样判定应用程序自身运行在“兼容模式”下?第3张

      这是否就给了我们一些思路?可以检测当前程序加载的模块,如果有这些AcGenral.dll之类的模块存在,就认为是运行在兼容模式下呢?这个我没有去试过,但是我觉得可行。o(∩_∩)o

      另外一种方法是从原理是来绕过,GetVersionEx这个API来之kernel32.dll,而kernel32.dll又调用了ntdll.dll里面的RtlGetVersion这个函数,如果我们直接调用呢?试了下也是有一定可行性的。不过悲剧的是,这个方法在vista及以上系统就无效了,可能是因为微软在实现兼容模式时,hook得更加深了。

怎样判定应用程序自身运行在“兼容模式”下?第4张

      360也有个兼容模式检测功能,去看了下他的实现,还不错。

怎样判定应用程序自身运行在“兼容模式”下?第5张

      然后去研究了下,发现很有道理,360的方式是先调用 GetVersionEx 得到一个版本号,譬如是5.0(2000系统),然后算出一个值50(5*10 + 0);然后调用文件版本API,取出文件ntoskrnl.exe的版本号,譬如是5.1.2600.5938,然后算出一个值52(5*10 + 1),对比前后两个值,如果不相等则认为自身运行在兼容模式下。具体分析可以见调试结果(call 0042980是去取ntoskrnl.exe是版本)。

怎样判定应用程序自身运行在“兼容模式”下?第6张     

      下面是IDA反编译的结果:

怎样判定应用程序自身运行在“兼容模式”下?第7张

      还不错哦。

      [END]

https://passport.csdn.net/account/login?ref=toolbar

免责声明:文章转载自《怎样判定应用程序自身运行在“兼容模式”下?》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SQL CE 3.0 与SQL CE 3.5区别git 的安装以及使用:是一个开源的分布式版本控制系统,可以对项目进行版本管理。 早期是linux之父用来管理linux系统源代码的(linux是和windows一样操作系统 开源免费的操作下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

css动画延迟好像有点怪

项目需要使用动画Css。自定义时,会发现设置动画延迟和动画持续时间的总时间不正确,这将导致动画丢失。例如,bounceInLeft动画从左侧出现,然后抖动。当初始动画延迟为0时,动画持续时间为1s,动画已完成,但如果设置该值,动画延迟为1s且动画持续时间是2s,则动画未完成。具体的动画是从左侧出现,然后在1s延迟后直接到达终点,但没有抖动。然后我用w3c写了...

WPF知识点全攻略13- 绘图

行<线条X1=“10”Y1=“100”X2=“260”Y2=“100“Stroke=“黑色”StrokeDashArray=“5”StrokeThickness=“2”>线冲程>矩形<矩形边距=“5”笔划=“黑色”高度=“100”宽度=“100“><&书信电报,...

图论介绍(Graph Theory)

G-v具有比G更多的连通分支,因此v被称为G的截断点G-e具有比G多的连通分支。定理:连通图G,其中e是桥e不属于G的任何环有顶点u,v,使得任何路径u-v都通过e连通图G;而w是存储在顶点u,v处的割点,使得任意路径u-v通过w定义:顶点之间的距离x-y:所有x-y路径的最小长度。...

nginx重启

方法二:在启动命令-c前加-t2、重启Nginx服务方法一:进入nginx可执行目录sbin下,输入命令./nginx-sreload即可方法二:查找当前nginx进程号,然后输入命令:kill-HUP进程号实现重启nginx服务...

easyexcel导出两种方式response返回文件流下载和保存到服务器返回下载链接

1、response方式返回excel文件流@GetMapping("/exportExcel")publicvoidexportExcel(@RequestParam(value="menu")Stringmenu,@RequestParam(value="dwflglId")intdwflglId,@RequestParam(value="qjCode"...

【译】颜色空间 REC.709 vs sRGB的

但转换函数(gamma)不同。让我们先定义颜色空间。颜色模型和颜色空间非常混乱。RGB颜色模型表示所有颜色都可以通过RGB的线性组合获得,而颜色空间是指能够解析数值的颜色模型。颜色空间的定义包含以下信息。颜色空间可以基于RGB模型检测颜色,因此使用三原色来表示所有颜色似乎是合理的。三原色的颜色坐标与sRGB相同。...