程序调用 kernel32.dll 来判断 Windows 版本,有哪些方法可以绕过? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cyc616000
V2EX    Windows

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

  •  
  •   cyc616000 2022-08-24 12:07:03 +08:00 835 次点击
    这是一个创建于 1223 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    暂时想到的两个办法:

    • 反汇编 dll 后发现这个语句的 edx 寄存器保存了允许运行的最高系统版本参数,然后不知到要怎么修改保存

    mov dword ptr [ebp+FFFFFF54h],edx

    • 制作 kernel32.dll 的 dll wrapper ,修改 VerifyVersionInfoA 的返回值(但是不想改系统文件)

    谢谢

    关键词: C++, Win32 API

    第 1 条附言    2022-08-24 15:42:03 +08:00
    后续:用 IDA Pro 直接改汇编弄好了。相关命令是 @codehz 提到的 patch program > assemble
    18 条回复    2022-08-24 14:26:56 +08:00
    ysc3839
        1
    ysc3839  
       2022-08-24 12:10:50 +08:00
    右键属性兼容性不行吗?
    kernel32.dll 里面判断版本相关的函数应该都是从 PEB (Process Environment Block) 里面读版本的,理论上不需要 hook 函数,只需要覆盖掉对应值即可。
    tool2d
        2
    tool2d  
       2022-08-24 12:17:11 +08:00   2
    你都修改了 Im800v.dll ,直接改汇编就可以了啊。

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

    这个函数直接返回判断结果,里面是黑箱操作
    https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-verifyversioninfoa
    cyc616000
        4
    cyc616000  
    OP
       2022-08-24 12:25:50 +08:00
    @tool2d 反汇编出来的 asm 可以直接 ld 吗?没接触过等下试一试
    oser
        5
    oser  
       2022-08-24 12:26:33 +08:00   1
    你可以先了解一下 Windows 可执行文件的 PE 结构,然后找到 kernel32.dll 中的导出表,从导出表找到 VerifyVersionInfoA ,然后 Hook 这个 API ,返回你想要的值就 OK 了
    codehz
        6
    codehz  
       2022-08-24 12:29:26 +08:00   1
    @cyc616000 #4 (不如用 ida 的 patch program > assemble 直接改程序*
    如果懒得弄得话也可以先把反汇编代码的 hex 弄出来在源 binary 里搜索 hex 并定位后修改
    oser
        7
    oser  
       2022-08-24 12:30:03 +08:00   1
    至于怎么内存 patch 这个 dll ,方式太多了,简单的就是用 createremotethread 开一个远程线程到你关注的目标进程运行,然后注入代码,注入 dll 等等
    cyc616000
        8
    cyc616000  
    OP
       2022-08-24 12:35:44 +08:00
    @codehz 只装了 IDA Free ,待会试试 Pro
    @oser 好方法,我先用 Cheat Engine 试一下
    ysc3839
        9
    ysc3839  
       2022-08-24 12:39:02 +08:00   1
    @cyc616000 刚才测试了一下,兼容性选项无效应该是因为程序的 manifest 里写明了兼容新的系统。
    mxT52CRuqR6o5
        10
    mxT52CRuqR6o5  
       2022-08-24 12:47:31 +08:00
    没加壳的话,ollydbg 直接改就是了
    yolee599
        11
    yolee599  
       2022-08-24 13:01:38 +08:00 via Android
    你都反汇编出来了,直接 HexEdit 改呗
    ysc3839
        12
    ysc3839  
       2022-08-24 13:16:15 +08:00   1
    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 Systm 的插件扩展名,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
        13
    a33291  
       2022-08-24 13:44:57 +08:00
    借楼问下

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

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

    ==
    修改使用 IDA Pro+patcher plugin ,
    比如 52pojie 的这个 IDA Pro 7.7.220118 (SP1) 全插件绿色版
    教程应该到处都有
    ==
    dll 劫持也是可以做,但不如直接硬改汇编可靠快捷
    32uKHwVJ179qCmPj
        18
    32uKHwVJ179qCmPj  
       2022-08-24 14:26:56 +08:00
    @a33291 在没有这个工具的情况下可以用 beyond compare 定位到 patch 的 file offset ,再在反编译工具里面定位到具体代码,不过你这个工具更方便
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3760 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 10:22 PVG 18:22 LAX 02:22 JFK 05:22
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86