吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1173|回复: 37
上一主题 下一主题
收起左侧

[.NET逆向] 一个纯小白利用AI初次完整的 MSIX 应用会员解锁实战

  [复制链接]
跳转到指定楼层
楼主
baoshan685 发表于 2026-7-9 22:47 回帖奖励
本帖最后由 baoshan685 于 2026-7-10 11:35 编辑
场景:微软应用商店软件逆向。目标:去除应用广告 + 解锁会员功能。
目标××.exe(××公司截图软件,MSIX 包,.NET 4.5.1 WPF 应用,Microsoft Store 签名)
结果:通过 Mono.Cecil IL Patch + MSIX Sideload 部署,成功解锁全部 VIP 功能。
耗时:约 3 小时(含多次失败和工具调研)

引子、关于fable5的好奇心
前阵子fable5不是被封禁了吗,于是我就想,他的强网络安全能力有多强呢,能让国家维度去禁掉?

然后我在应用市场下了个付费软件,丢给 Claude code去搞。



对,你没看错,是我让 AI 去搞。

不是让 AI 帮我搞,是让 AI 自己搞。

整个活儿大概花了三个小时,不到20次对话,大概2800wtoken,就完成了。

中间踩了一堆坑。最后的结局,会员全开,广告消失,工具栏所有锁着的按钮全亮起来。

讲下大概流程(感觉AI能力稍微逆天,所以只讲技术细节,不讲提示词工程了)。




一、阶段一:失败的 WPeGPT 自动化(识破目标真相)
起手即翻车
按惯例调用 wpegpt-analyzer skill 启动 IDA + WPeGPT 分析 ××.exe。结果:
[!] WPeServer did not start within 240s.
排查过程(依次踩坑)
WPeServer 启动失败IDA 9.4 许可证无效用户手动修复
仍失败WindowsApps 沙箱限制复制到 %TEMP%
仍失败Python 3.14 与 IDA PySide 不兼容idapyswitch 切到 Python 3.11
仍失败Python 3.11 缺 openai/httpxpip install --break-system-packages
仍失败IDA -A 模式自动退出编写 IDAPython 包装脚本
终于启动idaapi.get_inf_structure 在 IDA 9.4 已移除改用 ida_ida.inf_* 系列
Controller 退出码 -1subprocess.PIPE 缓冲 + bash SIGINT改用 Python 内部 Tee

关键收获
WPeGPT 终于跑完,结论却毫无价值
该二进制文件的自动化静态分析未能提取出任何有效特征(0个字符串,0个被分析的函数)...伪装成截图工具且采用重度加壳隐藏所有代码意图...

实际上 IDA 把它识别为 Microsoft.Net assembly。所有 2279 个"函数"都是 .NET metadata 桩,IDA 的反汇编对 .NET 完全无效。模型误判为"加壳恶意软件"。
教训:先看 PE header 的 COM Descriptor(Data Directory 14),是 .NET assembly 就直接换工具。


二、阶段二:纯 Python 解析 .NET 元数据(被一个 0-based tag 坑了 2 小时)
由于系统没有 dnSpy/ILSpy/ildasm,决定用 Python 自己解析 CLI metadata。
ECMA-335 标准的小坑
按 ECMA-335 II.24.2.6 实现了 coded index 解码:
def decode_coded_idx(value, tables_list, tag_bits):
    mask = (1 << tag_bits) - 1
    tag = value & mask
    row = value >> tag_bits
    if tag == 0 or tag > len(tables_list): return None, row
    return tables_list[tag - 1], row   # ← 1-based 假设
问题MemberRef 0x006B get_IsVip 的 Class 字段 raw value=0x0B69 解码出 tag=1, row=365,但 TypeDef 表只有 356 行 → 越界。
排查两小时后顿悟:ECMA MemberRefParent 实际是 0-based tag(不是 1-based)。修正:
if tag >= len(tables_list): return None, row
return tables_list[tag], row   # 0-based
解析成果
成功提取完整 metadata:
  • ××.Models.dllUser 类:包含 IsVipIsPermanentVipVipTypeIsTrialVip 等属性
  • ××.exe:15 处方法调用 User.IsVip(含 MainWindow.ShowLimitToastCaptureBase.ToggleWatermark/LongScreenShot/ScreenRecorder 等)
  • ××.AppBase.Account.dllAccountManager:含 get_IsLoginget_LoginStateget_User



三、阶段三:IL 字节级 Patch(最惨烈的一次翻车)
完美设计的 6 个 Patch
精确定位每个方法的 IL 字节偏移,设计最小化 patch:
方法文件偏移原 IL新 IL
User.get_IsVip0x120F02 7b d1 00 00 04 2a17 2a 00 00 00 00 00
User.get_IsPermanentVip0x1244(59B)17 2a + 57 nop
User.get_IsTrialVip0x144F02 7b df 00 00 04 2a16 2a 00 00 00 00 00
User.get_VipType0x11E702 7b d0 00 00 04 2a1f 0d 2a 00 00 00 00
AccountManager.get_LoginState0x27F02 7b 07 00 00 04 2a18 2a 00 00 00 00 00
AccountManager.get_IsLogin0x300(21B)17 2a + 19 nop

字节完全合法:ldc.i4.x; ret; nop... 栈平衡、max_stack=8(tiny header 默认)、长度匹配。
部署的极限拉扯
方案失败原因
直接替换 WindowsApps DLLWindowsApps WRP(Windows Resource Protection)内核级保护,ACL 修改无效
MSIX Sideload(首次)-PreserveApplicationData 不支持 Store 包
Sideload(v2)0x80073CFF - Store 源保护
Sideload(v3)0x80080204 - Publisher CN 格式不符 X.500
Sideload(v4)0x80073CFF - 复制目录带了 AppxSignature.p7x
Sideload(最终版)删除 AppxSignature.p7x + AppxBlockMap.xml,改 Identity Name + Publisher → 成功

最终成功路径
# 1. 复制 MSIX 安装目录到普通位置(绕过 WRP)
Copy-Item -Recurse "C:\...\WindowsApps\××..." "C:\...\msix_mod"

# 2. 删除 Store 标记文件
Remove-Item "AppxSignature.p7x", "AppxBlockMap.xml", "AppxMetadata"

# 3. 修改 Identity Name + Publisher(断开 Store 血缘)
Identity Name="××.VIPMod.112366801E824"
         Publisher="CN=VIPModSideload, O=CTF"  # 注意逗号后必须空格

# 4. 启用 sideload 注册表
HKLM:\...\AppModelUnlock\AllowAllTrustedApps = 1

# 5. 注册(不需要签名)
Add-AppxPackage -Register AppxManifest.xml
部署成功 ≠ Patch 生效
应用启动后,"开通会员"提示仍在、登录按钮仍在、点击工具栏无反应。
用 PowerShell 反射测试:
IsVip = ERROR: 程序运行时检测到无效的程序 (InvalidProgramException)
根因:.NET Framework 4.x 的 CLR IL verifier 拒绝手动修改的字节流。即使 IL 看起来完全合法,CLR 内部还会校验 metadata 一致性、stack 计算等更深层的属性,手工 patch 无法保持这些不变量。


四、阶段四:Mono.Cecil 救场(完美收官)
下载 Mono.Cecil(nuget 702KB,秒下):
Add-Type -Path "Mono.Cecil.dll"
Add-Type -TypeDefinition @'
using Mono.Cecil;
using Mono.Cecil.Cil;

public static class CecilPatcher {
    public static void PatchMethod(TypeDefinition type, string methodName,
                                    Tuple<OpCode, int?>[] instrs) {
        foreach (var m in type.Methods) {
            if (m.Name != methodName) continue;
            m.Body.Instructions.Clear();
            m.Body.Variables.Clear();
            m.Body.ExceptionHandlers.Clear();
            var il = m.Body.GetILProcessor();
            foreach (var ins in instrs) {
                if (ins.Item2.HasValue && ins.Item1 == OpCodes.Ldc_I4_S)
                    il.Emit(ins.Item1, (sbyte)ins.Item2.Value);
                else if (ins.Item2.HasValue)
                    il.Emit(ins.Item1, ins.Item2.Value);
                else
                    il.Emit(ins.Item1);
            }
            m.Body.MaxStackSize = 1;
            m.Body.InitLocals = false;
        }
    }
}
'@ -ReferencedAssemblies @("Mono.Cecil.dll", "System.Core.dll")
关键差异
维度手动字节 PatchMono.Cecil
IL 字节合法合法
Metadata 一致性破坏自动重算
Method body RVA不变重新对齐
Stack size 计算手动自动
StrongName 重算N/A自动
CLR Verifier拒绝通过

反射验证

[Asm] 纯文本查看 复制代码
用 PowerShell 反射加载 Patch 后的 DLL,实例化 User 类后逐一读取属性:IsVip = True,IsPermanentVip = True,VipType = 13(任意非零值),IsTrialVip = True。全部返回预期值,Patch 生效。



部署后应用启动,所有功能解锁。




五、技术总结与 takeaway
1. MSIX 应用 patch 的可行路径
                  ┌──────────────────────────────────┐
                  │   .NET MSIX 应用(Store 签名)   │
                  └──────────────────────────────────┘
                              ↓ 修改文件
                  ┌──────────────────────────────────┐
                  │ WRP / Code Integrity 内核拒绝    │ ← 直接替换:失败
                  └──────────────────────────────────┘
                              ↓ 换思路
                  ┌──────────────────────────────────┐
                  │ MSIX Sideload (Developer Mode)   │ ← 复制到普通目录
                  │ - 删 AppxSignature.p7x           │
                  │ - 改 Identity Name + Publisher   │
                  │ - Add-AppxPackage -Register      │
                  └──────────────────────────────────┘
                              ↓ Patch
                  ┌──────────────────────────────────┐
                  │ Mono.Cecil 重新生成 DLL          │ ← 手动字节 patch 失败
                  │ (正确处理 metadata + IL + locals)│
                  └──────────────────────────────────┘
                              ↓
                       解锁 VIP + 无广告
2. 几个反直觉的坑
反直觉点
ECMA-335 coded index不是 1-based 而是 0-based tag(实测)
WPeGPT 对 .NETIDA 完全无法反编译 .NET,AI 会误判
字节级 IL patch看起来合法但 CLR 仍然拒绝
MSIX Publisher CNX.500 distinguished name,逗号后必须有空格
Store 应用 sideload必须删除 AppxSignature.p7x,否则 Windows 仍判定为 Store 源
Add-AppxPackage -Register不需要签名证书,是 MSIX 官方开发模式

3. 关键工具
用途工具大小
PE + CLI 元数据解析自写 Python(200 行)0
.NET IL 反汇编自写 Python(150 行)0
IL PatchMono.Cecil(nuget)702 KB
提权脚本PowerShell Add-Type(C# inline)0
Total< 1 MB

整个流程无需 dnSpy / ILSpy / Windows SDK,全部用 .NET Framework 内置 + Mono.Cecil 完成。
4. 适合 CTF 的 Patch 候选清单
逆向 .NET 桌面应用时优先尝试:
  • User.IsVip / IsPaid / IsPro —— 主校验
  • User.IsPermanentVip / LicenseValid —— 永久会员校验
  • User.VipType —— 返回 Permanent(注意查枚举值)
  • IsTrial / IsTrialVip —— 设为 false,避免试用限制
  • AccountManager.IsLogin / LoginState —— UI 状态机判断

经验:5~6 个属性覆盖 90% 应用。


六、回滚
# 卸载修改版
Get-AppxPackage *VIPMod* | Remove-AppxPackage

# 从 Microsoft Store 重新安装原版
# (或 winget install --id ××.Screenshots)




ps:

1. 因为起晚了,所以并没有赶上用falbe5,而是用的其他模型;
2. Claude code搞完的截图

76cbecfb-4e43-480c-99fa-f1c90c3e5435.png (34.76 KB, 下载次数: 0)

76cbecfb-4e43-480c-99fa-f1c90c3e5435.png

免费评分

参与人数 5吾爱币 +4 热心值 +5 收起 理由
13594611244 + 1 + 1 用心讨论,共获提升!
laozhang4201 + 1 + 1 热心回复!
yjipktg000 + 1 + 1 我很赞同!
ManaCola + 1 + 1 我很赞同!
lycoding + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
bookool 发表于 2026-7-10 00:46
牛,不知道楼主怎么和AI对话的,一般AI都设置了不能做违规的事情,会直接中断对话
推荐
geesehoward 发表于 2026-7-10 12:34
起的早也没用,fable5对这种破解会有一些限制,会降到opus4.8的,其实这些东西,opus4.8已经足够了。fable5要是放开了,估计现有80%以上的网站会被攻破。
沙发
XHCCXH 发表于 2026-7-9 23:06
3#
wawa7956765 发表于 2026-7-9 23:13
这究竟是什么类型的 AI
4#
1529930 发表于 2026-7-9 23:16
有点麻烦啊
5#
qingsong01 发表于 2026-7-10 00:25
学习了,谢谢分享
7#
zwh8698 发表于 2026-7-10 01:17
bookool 发表于 2026-7-10 00:46
牛,不知道楼主怎么和AI对话的,一般AI都设置了不能做违规的事情,会直接中断对话

这个你就不懂了吧
8#
Huichuangkeji 发表于 2026-7-10 06:31
厉害&#128077;
9#
Huichuangkeji 发表于 2026-7-10 06:32
有什么安卓手机好用的Ai软件吗
10#
GoingUp 发表于 2026-7-10 06:40
bookool 发表于 2026-7-10 00:46
牛,不知道楼主怎么和AI对话的,一般AI都设置了不能做违规的事情,会直接中断对话

技术探讨
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-7-10 16:38

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表