Paddle文件修改通杀

0x00 原理

通过之前的文章《Paddle激活类Mac应用通杀》知道了paddle激活和调用的相关api,也知道只要有符合的返回值就可激活通过,由此可以创建fake_server进行模拟激活服务。

通过《Surge修改试用判断方法达到无限试用》中可以了解到通过二进制编辑器(Hex Fiend)可以修改文件,然后使用codesign进行自签名使之运行。

0x01 fake_server

使用python的flask框架编写一个简单的web应用,针对激活和验证api进行mock,其他的请求进行反代,即服务请求之后返回对应的内容。

import flask
import requests
import argparse

app = flask.Flask(__name__)

if __name__ == '__main__':
    # 解析启动命令
    parser = argparse.ArgumentParser()
    parser.add_argument('--host', type=str, default='127.0.0.1')
    parser.add_argument('--port', type=int, default=10010)
    parser.add_argument('--debug', action='store_true', default=False)
    parser.add_argument('--prefix', type=str, default='/3.2', help="自定义前缀")
    args = parser.parse_args()
    prefix = args.prefix
    @app.route(f'{prefix}/license/activate',methods=['POST'])
    def activate():
        # 获取请求参数
        product_id = ''
        vendor_id = ''
        req_datas = flask.request.get_data().decode('utf-8').split('&')
        print(req_datas)
        for param in req_datas:
            k_v = param.split('=')
            if k_v[0] == 'product_id':
                product_id = k_v[1]
            if k_v[0] =='vendor_id':
                vendor_id = k_v[1]
        # 解析参数
        print(product_id)
        return {
            "success": True,
            "response": {
                "product_id": product_id,
                "activation_id": vendor_id,
                "type": "personal",
                "expires": 1,
                "expiry_date": 1999999999999
            }
        }

    @app.route(f'{prefix}/license/verify',methods=['POST'])
    def verify():
        return {
            "success": True,
            "response": {
                "activation_id": "admin",
                "type": "personal",
                "expires": 1,
                "expiry_date": 1999999999999
            }
        }

    @app.route(f'{prefix}/<path:subpath>',methods=['POST','GET'])
    def reverse_proxy(subpath):
        # 反向代理
        url = f'https://v3.paddleapi.com/3.2/{subpath}'
        method = flask.request.method
        headers = dict(flask.request.headers)
        headers['Host'] = 'v3.paddleapi.com'
        data = flask.request.get_data().decode('utf-8')
        # print(url, data, method, headers)
        if method == 'GET':
            req = requests.get(url, headers=headers, data=data, verify=False)
        else:
            req = requests.post(url, headers=headers, data=data, verify=False)
        # 创建response
        # print(req.status_code,req.content)
        response = flask.make_response(req.content)
        response.status_code = req.status_code
        return response
    # 启动服务
    app.run(host=args.host,port=args.port,debug=args.debug)

直接使用命令运行即可,这个prefix实际上是为了后面修改留一个缓冲空间。

0x02 文件修改

Paddle的文件一般在/Applications/<application>.app/Contents/Frameworks/Paddle.framework/Versions/A/Paddle,直接用Hex Fiend打开,使用Text模式搜索https://v3.paddleapi.com/3.2/,然后将其替换成你的fake_server访问地址即可,注意字符串的字节数最好保持一致,上面程序中的prefix就是缓冲的空间,可以自己调节,下面是一个举例

https://v3.paddleapi.com/3.2/
http://127.0.0.1:10010/f/3.2/ -> prefix是/f/3.2
https://paddle.example.com/c/ -> prefix是/c

image-20240123171214989

codesign -f -s "codesign_by_soft98" Paddle

然后Paddle程序就做好了,启动你的fake_server,然后打开你的应用程序去激活就可以了,激活码可以使用B7EE3D3C-B7EE3D3C-B7EE3D3C-B7EE3D3C-B7EE3D3C

0x03 展示

当然这只是建立与程序只使用paddle激活,并且没有其他暗桩的情况下,所以有些程序还是会检测到程序并没有被激活,暗桩之类的就需要自行解决了。这个修改Paddle的方式,是一种破解维持的方法,而且修改后的Paddle程序可以替换其他同类激活软件中的Paddle,就不用二次修改了。

image-20240123171817647

0x04 参考