written by SJTU-XHW

本人学识有限,解析难免有错,恳请读者能够批评指正,本人将不胜感激!

本文如有侵权,请联系作者删除


众所周知,Fiddler 是一个无比好用的、免费的网络调试代理工具,可以方便地进行抓包、代理服务等基本操作。最近在看到一些文章介绍 Fiddler 的使用时无意间发现 Fiddler everywhere 的软件,UI 制作更加用心,而且功能更加强大,可惜的是会订阅收费。在受到 Github@msojocs(好像停更了)的指引下,我开始了对 Fiddler-Everywhere 软件的 “学习”。

声明:本文不含有实际的观点导向 或者 建议,如有侵权,请联系删除;

在尽情使用的同时,欢迎大家订阅官网正版的 Fiddler everywhere

工作环境准备

要进行 crack 实践,必然得从反编译入手;

首先了解到 Fiddler Everywhere 是使用 C# 编写的程序,所以事先必须准备关于 C# 的运行环境 和 反编译程序;

Windows 自带 .net 运行库不够用,需要下载 dotnet-sdk,再将开发包里的反编译程序 ilasmildasm 设置到环境变量中使用;当然,如果不想下载各种运行库,也可以使用 dnSpy 反编译工具;

dnSpy 解压即用:dnSpy.rar,也可上 Github 上找同名的开源项目;

Linux 用户如果觉得直接装的系统环境中没啥问题,可以使用 .net 官网的方式安装 dotnet-sdk 和 反编译工具 ilasm (ildasm)

Linux 用户如果不想 .net 直接装到系统环境里面,可以使用本人配置的 dockerfile 构建镜像,然后进去操作;(这里只是用来隔离一个环境,然而 docker 并不是这么用的,所以不上传到 docker Hub 上去了)

  1. 在 Linux 任意发行版上配置好 docker,在某个新目录下写好 Dockerfile
1
2
3
4
5
6
7
8
9
10
11
FROM alpine
WORKDIR /app
RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories \ # 这里如果在国内上网,则需要更换源
&& apk --update add --no-cache dotnet7-sdk \
&& dotnet new console -n crackFiddler \
&& mkdir fiddler && cd crackFiddler \
&& dotnet add package Microsoft.NETCore.ILAsm \
&& dotnet add package Microsoft.NETCore.ILDAsm \
&& dotnet publish -c Release --self-contained --runtime linux-x64 \
&& printf "PATH=$(pwd)/bin/Release/netcoreapp3.1/linux-x64/publish:$PATH" >> /etc/profile \
&& source /etc/profile
  1. 构建镜像:

    1
    docker build -t crackImage .

之后只需等待 Fiddler Everything 装好再修改就行;

反编译

开始前需要安装 Fiddler Everything 正版软件 4.0.1 版本(为什么是这个版本,后面介绍);

安装完成后记住安装根目录:Windows 在“快捷方式 -> 打开文件所在目录” 寻找,Linux 在安装目录寻找;

注意:进行反编译前,请注册一个 Fiddler 账户,并且打开软件、“开始试用” 再关闭,不然无法进行 crack;

后面的步骤会以 Windows 为例,需要修改的部分 linux 也相同,不过 linux 用的是 ildasm (将动态链接库反编译为 *.il 文本)和 ildasm (将 *.il 编译为 动态链接库)。语法:

1
2
3
ildasm <libFilename> --output=<outputFile>

ilasm <ilFile> --output=<libName>

下面介绍 Windows 的详细做法:

根据 Github 上的高手找到的 Fiddler Everything 授权验证的代码区域:

1
2
3
4
5
6
7
8
9
10
11
# 这是授权认证的入口处变量定义的位置
Fiddler Everywhere\resources\app\out\WebServer\ClientApp\dist\main.xxxxxx.js

# 这是 Fiddler Everything 文件校验的函数所在的动态链接库
Fiddler Everywhere\resources\app\out\WebServer\Fiddler.WebUi.dll

# 这是 Fiddler Everything 验证账户是否激活的函数所在的动态链接库
Fiddler Everywhere\resources\app\out\WebServer\FiddlerBackendSDK.dll

# 这是 Fiddler Everything 自动更新版本功能所在的 javascript 脚本
Fiddler Everywhere\resources\app\out\main.js

⚠ 本人还发现,这种方法必须是 4.0.1,官方在 4.3 以后已经移除了文件校验函数所在的 Fiddler.WebUi.Helper 命名空间中的 ScriptHelper 类;

下面是本人的详细步骤

  1. 修改授权认证的入口处变量的定义(位于 Fiddler Everything 根目录下的 resources\app\out\WebServer\ClientApp\dist\main.xxxxxx.js,这里的 “XXX” 在每一版本中都不同,需要自行在目录下确认);

    有工程经验的同学会发现,dist 文件夹一般是 javascript 源 或者 typescript 编译后所存放的目录,这里修改生成文件在 JS 开发中是不妥当的:生成代码堆砌在一起难以阅读,并且下一次生成不会保存修改;但这次是 crack,并且以后不会再编译项目,所以这么改没关系。

    如图,使用搜索工具查找到更新授权信息的函数 updateUserLicense 定义(第一个匹配才是定义,后面的都是引用):

    紧接着在函数的第一句前加上如下一段语句:

    1
    2
    3
    4
    <param>.licenseInfo.currentLicense = "Pro";
    <param>.licenseInfo.hasExpiredTrial = false;
    <param>.licenseInfo.isTrialAvailable = false;
    <param>.licenseInfo.hasValidLicense = true;

    其中 “\” 需要替换成你的文件里所看到的这个函数的参数(在上面我的图里,这个参数名叫 ve,因此把 “\” 换成 “ve”),效果如下图:

  2. 反编译 文件校验的函数所在的动态链接库(位于根目录下 resources\app\out\WebServer\Fiddler.WebUi.dll);

    打开 dnSpy C# 反编译工具,导入该动态链接库(Linux 同学这步替换为 ildasm 反编译该文件为 *.il),搜索反编译码,找到命名空间 Fiddler.WebUi.Helper,再在其中找到ScriptHelper,查看到这个类的两个方法:

    1
    2
    // Token: 0x06000943 RID: 2371 RVA: 0x0001C678 File Offset: 0x0001A878
    internal static bool TryOpenClientMainScript(out string error);
    1
    2
    // Token: 0x06000944 RID: 2372 RVA: 0x0001C8E0 File Offset: 0x0001AAE0
    internal static bool TryOpenElectronMainScript(out string error);

    将其中的 try{} catch{} 块全部删除,它们的作用是校验启动脚本的正确性,应该将其删除,最终函数将直接返回 true,如下图:

    记得将再将该库编译回去保存这个模块

    比如这是我编译出来的动态链接库:Fiddler.WebUi.dll

  3. 反编译 验证账户激活函数所在的动态链接库(位于根目录下 resources\app\out\WebServer\FiddlerBackendSDK.dll);

    继续使用 dnSpy 打开该库,找到命名空间 FiddlerBackendSDK.User,再定位到其中的一个UserClient,找到其中的方法 GetBestAccount,将函数体中的判断语句直接换为返回 true,换好后如图:

    这是我编译出来的动态链接库:FiddlerBackendSDK.dll

  4. 禁用自动更新(位于根目录下 resources\app\out\main.js);

    找到这么一行语句:

    1
    e.settingsService.get().autoUpdateSettings.disabled

    替换为:

    1
    true||e.settingsService.get().autoUpdateSettings.disabled

    如图:

到目前为止,再次打开 Fiddler Everywhere 就完成的本次实践 ~