程序调用 kernel32.dll 来判断 Windows 版本,有哪些方法可以绕过?

2022-08-24 12:07:03 +08:00
 cyc616000

正版 Label Matrix 限制了可运行的 Windows 版本;在 Win11 上运行提示系统版本过高,要求升级软件

用 Api Monitor 分析后发现程序的 lm800v.dll 调用了系统的 kernel32.dll!VerifyVersionInfoA 函数来判断系统版本,修改参数后成功绕过系统限制。

现在想制作一个可以绕过限制的 dll ,因缺乏相关经验求高人指点😶‍🌫️

暂时想到的两个办法:

mov dword ptr [ebp+FFFFFF54h],edx

谢谢😊

关键词: C++, Win32 API

2307 次点击
所在节点    Windows
18 条回复
ysc3839
2022-08-24 12:10:50 +08:00
右键属性兼容性不行吗?
kernel32.dll 里面判断版本相关的函数应该都是从 PEB (Process Environment Block) 里面读版本的,理论上不需要 hook 函数,只需要覆盖掉对应值即可。
tool2d
2022-08-24 12:17:11 +08:00
你都修改了 Im800v.dll ,直接改汇编就可以了啊。

魔改 kernel32.dll 肯定不合适,你又没签名。极其容易被鉴定为病毒。
cyc616000
2022-08-24 12:20:00 +08:00
@ysc3839 兼容性运行没效果

这个函数直接返回判断结果,里面是黑箱操作
https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-verifyversioninfoa
cyc616000
2022-08-24 12:25:50 +08:00
@tool2d 反汇编出来的 asm 可以直接 ld 吗?没接触过等下试一试
oser
2022-08-24 12:26:33 +08:00
你可以先了解一下 Windows 可执行文件的 PE 结构,然后找到 kernel32.dll 中的导出表,从导出表找到 VerifyVersionInfoA ,然后 Hook 这个 API ,返回你想要的值就 OK 了
codehz
2022-08-24 12:29:26 +08:00
@cyc616000 #4 (不如用 ida 的 patch program > assemble 直接改程序*
如果懒得弄得话也可以先把反汇编代码的 hex 弄出来在源 binary 里搜索 hex 并定位后修改
oser
2022-08-24 12:30:03 +08:00
至于怎么内存 patch 这个 dll ,方式太多了,简单的就是用 createremotethread 开一个远程线程到你关注的目标进程运行,然后注入代码,注入 dll 等等
cyc616000
2022-08-24 12:35:44 +08:00
@codehz 只装了 IDA Free ,待会试试 Pro
@oser 好方法,我先用 Cheat Engine 试一下
ysc3839
2022-08-24 12:39:02 +08:00
@cyc616000 刚才测试了一下,兼容性选项无效应该是因为程序的 manifest 里写明了兼容新的系统。
mxT52CRuqR6o5
2022-08-24 12:47:31 +08:00
没加壳的话,ollydbg 直接改就是了
yolee599
2022-08-24 13:01:38 +08:00
你都反汇编出来了,直接 HexEdit 改呗
ysc3839
2022-08-24 13:16:15 +08:00
https://gist.github.com/ysc3839/1f9c505796ec930e7810a86c3255d037
顺手写了一个改 PEB 中版本号的 asi ,需要配合 Ultimate-ASI-Loader 注入 https://github.com/ThirteenAG/Ultimate-ASI-Loader
你可能想问 asi 是什么:asi 就是一个 dll ,Ultimate-ASI-Loader 会加载这个 dll 。原本 asi 是 Miles Sound System 的插件扩展名,Miles Sound System 会自动加载扩展名为.asi 的 dll 。曾经许多游戏使用了 Miles Sound System ,于是大家就利用这个特性来注入 DLL 来实现游戏 Mod 。但是后来出现的许多新游戏没有使用 Miles Sound System 了,于是就有了 Ultimate-ASI-Loader 这个项目,它是利用 DLL 劫持来加载自身,然后再加载 asi 。
我没测试过 asi 注入后是否有效,不过上面的链接还附带了一个 exe 的测试代码,相同的代码是有效的。自行编译 exe 的话,需要带上 manifest ,声明支持 Windows 10 ,否则 VerifyVersionInfo 或 GetVersion 等都会当成 Win8(版本号 6.2)处理,无法看到效果。
a33291
2022-08-24 13:44:57 +08:00
借楼问下

是否有可以直接从 dll 或 exe 等 pe 格式直接反汇编后并进行对比的工具?对比功能类似 Beyond Compare.
.net 的话有 https://www.telerik.com/justassembly,我想找一个支持原生程序且功能类似的工具.
podel
2022-08-24 13:52:54 +08:00
找 JMP 之类的 条件转移点。不管成功还是失败都跳到成功的后续地址就行了。
7v9TEc53
2022-08-24 14:00:35 +08:00
@a33291 为什么需要这种工具,同一段代码重新编译不能保证编译出来的汇编是一样的
a33291
2022-08-24 14:19:03 +08:00
@7v9TEc53 主要用来进行分析用,比如微软打了补丁,那么就可以分析他前后的改动来反推修复的问题.
还有比如有时候不放心一些第三方的 patch 工具,此时在虚拟机运行 patch 后,然后需要对比 patch 版本和原版的差异来分析是否可能有恶意代码.

工具找到了,https://github.com/joxeankoret/diaphora
inframe
2022-08-24 14:25:06 +08:00
mov dword ptr [ebp+FFFFFF54h],edx
这个填个大一点符合范围立即数
mov dword ptr [ebp+FFFFFF54h],9999h 这种;

==
修改使用 IDA Pro+patcher plugin ,
比如 52pojie 的这个 IDA Pro 7.7.220118 (SP1) 全插件绿色版
教程应该到处都有
==
dll 劫持也是可以做,但不如直接硬改汇编可靠快捷
7v9TEc53
2022-08-24 14:26:56 +08:00
@a33291 在没有这个工具的情况下可以用 beyond compare 定位到 patch 的 file offset ,再在反编译工具里面定位到具体代码,不过你这个工具更方便

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/875026

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX