V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cyc616000
V2EX  ›  Windows

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

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

    正版 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 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
        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   ·   实用小工具   ·   982 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 22:56 · PVG 06:56 · LAX 14:56 · JFK 17:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.