Metadata Fixer 分析历程
仅供学术参考,不鼓励非法使用
🔍 第一阶段:初始侦察
目标识别:Google Photos Metadata Fixer - 一个声称能恢复Google Takeout元数据的付费工具
初步分析:使用IDA Pro对exe进行反编译
发现:32位NSIS安装程序,包含临时目录创建和文件解压逻辑
🎯 第二阶段:架构理解
关键发现:在另一个代码片段中识别出Electron框架特征
electron::fuses::IsRunAsNodeEnabled
64位程序,与安装程序分离
架构确认:传统安装程序 + Electron应用的组合
📦 第三阶段:深入挖掘
ASAR解包:成功提取app.asar文件
意外发现:
软件套壳了GPL协议的ExifTool
包含未删除的changelog
代码经过webpack打包和混淆
🔐 第四阶段:验证机制分析
关键代码定位:
javascript
const Ue = "https://license.metadatafixer.com"
// 客户端验证逻辑
弱点识别:
客户端验证
Redux状态管理未加密
IPC通信可拦截
✅ 第五阶段:成功破解
实施:修改验证逻辑
结果:程序成功运行,成功不付费处理文件
📊 技术收获
多层封装:PE → Electron → ASAR → Minified JS
安全反模式:客户端验证的典型案例
道德讽刺:付费软件违规使用开源工具
🎓价值
现代应用架构分析的完整流程
多层混淆突破的实践经验
软件许可验证机制的安全性研究素材
开源协议违规检测的真实案例
💡 感悟
"客户端逻辑基本是完全不可防范的,毕竟连IDA都能被破解”
2025.8.4 1129
惊人的发现他的校验有点高级,导致需要写个假的服务器,懒得逆向了
from flask import Flask, jsonify, request
import uuid
app = Flask(__name__)
@app.route('/redeem', methods=['POST'])
def redeem():
# Always return the same response regardless of request content
response = {
"error": None, # In Python, None is equivalent to null in JSON
"data": {
"email": "user@example.com",
"licenseKey": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
return jsonify(response)
# Handle other methods on /redeem endpoint
@app.route('/redeem', methods=['GET', 'PUT', 'DELETE'])
def redeem_method_not_allowed():
return jsonify({"error": "Method not allowed"}), 405
@app.route('/is-valid', methods=['GET'])
def is_valid():
# Always return empty object regardless of query parameters
# Query parameters like licenseKey and email are ignored
return jsonify({})
# Optional: Add a simple health check endpoint
@app.route('/', methods=['GET'])
def health_check():
return jsonify({"status": "running"})
if __name__ == '__main__':
# Run the server on 127.0.0.1:5000 by default
app.run(host='127.0.0.1', port=5000, debug=True)