Skip to main content
  1. 所有文章/

Windhawk 的简单逆向

·859 words·2 mins
文章摘要
加载中...
此内容根据文章生成,并经过人工审核,仅用于文章内容的解释与总结 投诉

在使用 Windhawk1 的时候对它产生了好奇,于是就有了这篇文章

Windhawk 的源码是完全开源的,可以在 ramensoftware/windhawk 中查看源码

进入它的目录,我们可以看到结构如下

image-20240606145629659

很好理解

{
    "meanings": {
        "Compiler": "编译器",
        "Engine": "引擎(Windhawk 功能的核心)",
        "UI": "Windhawk 的 GUI",
        "windhawk.exe": "Windhawk 的主程序"
    },
    "functions": {
        "Compiler": "对编写好的功能模块进行编译",
        "Engine": "用于将编译好的模块注入进目标程序的引擎",
        "UI": "安装、编写模组",
        "windhawk.exe": "驻留后台、拉起 GUI 进程"
    }
}

UI 界面的简单逆向 #

打开任务管理器(GUI 打开时),会发现在前台进程中出现了 VSCodium

image-20240606150518346

右键打开文件所在位置,会发现进入了 WindhawkUI 目录

其中,VSCodium.exe 就是 WindhawkUI 程序

双击运行,我们会发现直接进入了 VSCodium 的主界面

image-20240606150655653

同时,右下角出现了提示。提示的大概意思是说,我们用了错误的方式打开了 UI 进程(VSCode 直接启动了)

于是,我写了个 Rust 来查看它的启动参数,代码如下

use std::env;
use std::io;
use std::io::prelude::*;

fn main() {
    let args: Vec<String> = env::args().collect();
    println!("接收到的命令行参数:{:?}", args);

    let command_line = format!("{}", args.join(" "));
    println!("命令行调用方式:{}", command_line);

    println!("按任意键退出...");
    let _ = io::stdout().flush();
    io::stdin().read(&mut [0u8]).unwrap();
}

我们将其放入 UI 目录并将名字改为 VSCodium.exe(记得备份原程序)然后再次唤起 UI 进程,发现命令行调用如下

image-20240606151107349

也就是说,这个程序是通过 C:\Program Files\Windhawk\UI\VSCodium.exe C:\ProgramData\Windhawk\EditorWorkspace --locale=en --no-sandbox --disable-gpu-sandbox 启动的

我们在终端中通过这个命令启动

image-20240606151257436

?为什么还是报VSCode 直接启动了 :thinking_face_color:

简单分析一下,这个 UI 进程是通过 windhawk.exe 拉起的,也许需要我们伪装一下?不过在我的测试中要么是无法启动,要么是报错

前端架构 #

通过在 WindhawkUI 进程中使用公开方法打开 Developer Tools,我们发现,UI 使用的是 Ant Design

image-20240606155704306

顺带提一嘴,第一行的注释内容如下 :rolling_on_the_floor_laughing_color:

<!-- Copyright (C) Microsoft Corporation. All rights reserved. -->

Engine 的简单逆向 #

通过对 windhawk.dll 的反编译,我们了解到,这个动态链接库是 Windhawk 需要使用的一些钩子

image-20240606160315337

当然啦,这个动态链接库是不能通过 rundll32 启动(main entry)的


  1. Windows 下的自定义功能模组平台 ↩︎