1. 文件夹内容变化对比脚本

这个脚本是我在研究淘宝上超低价格Steam兑换码的作用原理时写的。

⚠️不要买盗版!不要买盗版!不要买盗版⚠️

当你淘宝上购买低价兑换后,商家会让你下载一个他们的程序,然后在你电脑上运行,他们的程序会向steam客户端注入木马,从而实现虚假的兑换游戏。

‼️这种方式会导致你的steam账号泄露‼️

file_ckecker.py

import os
import hashlib
import json
import argparse
import sys
from tqdm import tqdm  # 导入进度条库

def calculate_file_hash(file_path, block_size=65536):
    """计算文件的 SHA-256 哈希值"""
    sha256 = hashlib.sha256()
    try:
        with open(file_path, 'rb') as f:
            for block in iter(lambda: f.read(block_size), b''):
                sha256.update(block)
        return sha256.hexdigest()
    except (PermissionError, FileNotFoundError):
        return None

def get_all_files(folder_path):
    """预扫描文件夹,获取所有文件列表用于初始化进度条"""
    all_files = []
    for root, _, files in os.walk(folder_path):
        for name in files:
            all_files.append(os.path.join(root, name))
    return all_files

def record_folder_state(folder_path, output_file):
    """记录文件夹状态"""
    if not os.path.isdir(folder_path):
        print(f"错误: 路径 '{folder_path}' 不是文件夹。")
        return

    print(f"正在预扫描目录结构...")
    file_list = get_all_files(folder_path)
    file_data = {}

    print(f"开始计算哈希值:")
    
    for full_path in tqdm(file_list, desc="进度", unit="file"):
        rel_path = os.path.relpath(full_path, folder_path)
        file_hash = calculate_file_hash(full_path)
        if file_hash:
            file_data[rel_path] = file_hash
    
    with open(output_file, 'w', encoding='utf-8') as f:
        json.dump(file_data, f, indent=4, ensure_ascii=False)
    print(f"\n完成!已记录 {len(file_data)} 个文件。")

def compare_folder_state(current_folder, record_file):
    """对比差异"""
    if not os.path.exists(record_file):
        print(f"错误: 找不到记录文件 '{record_file}'。")
        return

    with open(record_file, 'r', encoding='utf-8') as f:
        old_data = json.load(f)

    print(f"正在预扫描当前目录...")
    file_list = get_all_files(current_folder)
    current_data = {}

    print(f"正在分析当前文件内容:")
    for full_path in tqdm(file_list, desc="对比中", unit="file"):
        rel_path = os.path.relpath(full_path, current_folder)
        file_hash = calculate_file_hash(full_path)
        if file_hash:
            current_data[rel_path] = file_hash

    old_files = set(old_data.keys())
    new_files = set(current_data.keys())
    added = sorted(list(new_files - old_files))
    removed = sorted(list(old_files - new_files))
    common = old_files & new_files
    changed = sorted([f for f in common if old_data[f] != current_data[f]])

    print(f"\n{'='*20} 对比报告 {'='*20}")
    print(f"新增 [{len(added)}], 删除 [{len(removed)}], 变动 [{len(changed)}]")
    if added:
        print("\n新增文件:")
        for f in added: print(f"  [+] {f}")
    if removed:
        print("\n删除文件:")
        for f in removed: print(f"  [-] {f}")
    if changed:
        print("\n变动文件:")
        for f in changed: print(f"  [*] {f}")
    
    if not any([added, removed, changed]):
        print("\n结果: 没有任何变化。")
    print(f"{'='*49}\n")


def main():
    parser = argparse.ArgumentParser(description="文件夹变更检测工具")
    subparsers = parser.add_subparsers(dest="command")

    save_parser = subparsers.add_parser("save", help="记录状态")
    save_parser.add_argument("-p", "--path", required=True)
    save_parser.add_argument("-o", "--out", default="snapshot.json")

    check_parser = subparsers.add_parser("check", help="对比差异")
    check_parser.add_argument("-p", "--path", required=True)
    check_parser.add_argument("-d", "--db", required=True)

    args = parser.parse_args()
    if args.command == "save":
        record_folder_state(args.path, args.out)
    elif args.command == "check":
        compare_folder_state(args.path, args.db)
    else:
        parser.print_help()

if __name__ == "__main__":
    main()

效果

运行商家程序前的steam客户端文件

运行商家程序后的steam客户端文件

下面是我把对比报告给gemini后gemini生成的内容

你的这份对比报告非常专业,它直接揭示了这种骗局的“犯罪现场”。通过你抓取的这些文件变动,我们可以精准地还原出这类程序的运作机制:

核心元凶:xinput1_4.dll (DLL 劫持)

这是整场骗局的核心引擎。

  • 劫持原理: xinput1_4.dll 本是 Windows 处理手柄输入的系统组件。但是,Windows 程序在加载 DLL 时,通常会优先搜索程序当前目录。
  • 运作方式: 商家程序在 Steam 根目录下放了一个伪造的 xinput1_4.dll。当 Steam 启动时,它本想加载系统手柄驱动,结果却“错误地”加载了这颗毒药。
  • 功能: 这个伪造的 DLL 拥有 Steam 进程的所有权限。它在内存中拦截了 API 调用,修改了 Steam 对服务器返回数据的解析结果。这就是为什么你输入无效码,客户端却显示“激活成功”。

关键辅助:steam.cfg

  • 锁定版本与阻止更新: steam.cfg 是 Steam 的高级配置文件,通常用于开发调试。
  • 猫腻: 商家通过它可能强行禁用了 Steam 的某些安全校验或自动更新功能。如果不禁用更新,官方的补丁可能会导致劫持失效。

数据修改:config\appdata.vdf 和 config.vdf

  • 本地缓存欺骗: appdata.vdf 存储了本地库中游戏的配置信息。
  • 伪造入库: 商家程序通过修改这些 .vdf 文件,直接在你的本地配置文件里注入了那个游戏的 AppID 和授权信息。这让 Steam 客户端“以为”你已经拥有了这个游戏,并在 UI 界面上显示出来。

现在的潜在风险

你的这份报告证明了该程序已经深度侵入了你的 Steam 环境。即便你现在删掉这几个文件,由于它曾经以管理员权限运行并注入过进程,你仍面临以下风险:

  1. 缓存污染: logs 目录下大量文件的变动说明程序在频繁记录或拦截你的通信,你的登录令牌(Token)可能已经被记录并发送到了远程服务器。
  2. 后门隐患: xinput1_4.dll 可以执行任何代码。它可以扫描你电脑上的其他软件,甚至记录你的键盘输入。

你的这份对比报告非常专业,它直接揭示了这种骗局的“犯罪现场”。通过你抓取的这些文件变动,我们可以精准地还原出这类程序的运作机制:

核心元凶:xinput1_4.dll (DLL 劫持)

这是整场骗局的核心引擎。

  • 劫持原理: xinput1_4.dll 本是 Windows 处理手柄输入的系统组件。但是,Windows 程序在加载 DLL 时,通常会优先搜索程序当前目录。
  • 运作方式: 商家程序在 Steam 根目录下放了一个伪造的 xinput1_4.dll。当 Steam 启动时,它本想加载系统手柄驱动,结果却“错误地”加载了这颗毒药。
  • 功能: 这个伪造的 DLL 拥有 Steam 进程的所有权限。它在内存中拦截了 API 调用,修改了 Steam 对服务器返回数据的解析结果。这就是为什么你输入无效码,客户端却显示“激活成功”。

关键辅助:steam.cfg

  • 锁定版本与阻止更新: steam.cfg 是 Steam 的高级配置文件,通常用于开发调试。
  • 猫腻: 商家通过它可能强行禁用了 Steam 的某些安全校验或自动更新功能。如果不禁用更新,官方的补丁可能会导致劫持失效。

数据修改:config\appdata.vdf 和 config.vdf

  • 本地缓存欺骗: appdata.vdf 存储了本地库中游戏的配置信息。
  • 伪造入库: 商家程序通过修改这些 .vdf 文件,直接在你的本地配置文件里注入了那个游戏的 AppID 和授权信息。这让 Steam 客户端“以为”你已经拥有了这个游戏,并在 UI 界面上显示出来。

现在的潜在风险

你的这份报告证明了该程序已经深度侵入了你的 Steam 环境。即便你现在删掉这几个文件,由于它曾经以管理员权限运行并注入过进程,你仍面临以下风险:

  1. 缓存污染: logs 目录下大量文件的变动说明程序在频繁记录或拦截你的通信,你的登录令牌(Token)可能已经被记录并发送到了远程服务器。
  2. 后门隐患: xinput1_4.dll 可以执行任何代码。它可以扫描你电脑上的其他软件,甚至记录你的键盘输入。

建议操作步骤

为了确保你的账号和系统安全,建议立即按以下顺序操作:

  1. 物理清除: 立即删除 Steam 目录下的 xinput1_4.dll 和 steam.cfg。
  2. 强制校验: 删除 Steam 目录下除了 steamapps(游戏文件)和 steam.exe 以外的所有文件夹和文件,然后运行 steam.exe 让它强制重新下载官方纯净组件。
  3. 修改凭据: 在另一台安全的设备(如手机)上修改 Steam 密码,并选择“注销所有其他设备”。
  4. 全盘杀毒: 使用可靠的杀毒软件(如火绒或 Windows Defender 深度扫描)检查是否有残留的恶意程序。