如何用Brida自动破解签名验证?

7 人参与

在移动端安全测试中,签名字段往往是阻断抓包改包的关键点。若能让目标程序自行完成签名运算,整个拦截流程就可以实现全自动化,这正是 Brida 与 Frida 合力的用武之地。

准备工作:工具链与环境搭建

一台 Windows 10 64 位机器上,需装好 Burp Suite、Python 2.7(Brida 0.3 仍依赖该版本)以及 Frida‑core。随后在 Burp 的 Extensions 页面加载 Brida 插件,确保插件能够通过 Pyro4 与本地的 Frida 进程通信。

定位签名实现:从静态到动态

使用 JADX 反编译目标 APK,搜索 signJNISecurity 等关键字,往往会发现类似 String sign = JNISecurity.signJava(payload) 的调用。此时可以确认签名运算被封装在 native 库中,直接逆向往往碰壁。

为绕过逆向,思路转向“让程序自己算”。只要把完整的待签名字符串喂给 signJava,返回值即为合法的 sign

编写 Brida 脚本:一次调用搞定签名

// brida_sign.js
function getSign(rawBody) {
    var timestamp = new Date().getTime();
    var payload = 'KEYKEYKEYKEYKEYKEY' + timestamp + rawBody;
    var sign;
    Java.perform(function () {
        var Sec = Java.use('com.example.app.JNISecurity');
        sign = Sec.signJava(payload);
    });
    return sign;
}

脚本的核心只有三行:构造包含固定密钥、时间戳以及原始请求体的字符串,然后调用 Java 层的 signJava 方法,最终把返回值转为十六进制供后续使用。

自定义 Burp 插件:自动注入签名

def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):
    if not messageIsRequest:
        return
    request = messageInfo.getRequest()
    info = self.helpers.analyzeRequest(request)
    body = request[info.getBodyOffset():]
    bodyStr = ''.join(map(chr, body))
    # 调用 Brida 脚本获取签名
    sign = self.calc_sign(bodyStr)
    # 替换或新增 Header
    headers = list(info.getHeaders())
    newHeaders = [h for h in headers if not h.lower().startswith('sign:')]
    newHeaders.append('Sign: %s' % sign)
    newReq = self.helpers.buildHttpMessage(newHeaders, body)
    messageInfo.setRequest(newReq)

def calc_sign(self, body):
    uri = 'PYRO:BridaServicePyro@localhost:9999'
    proxy = Pyro4.Proxy(uri)
    result = proxy.callexportfunction('getSign', [body])
    proxy._pyroRelease()
    return result

插件在拦截到请求后,先提取 Body,随后通过 Pyro4 把 Body 传递给前面的 brida_sign.js,拿到签名后重新组装 Header 并写回。整个过程对使用者透明,手动改签的繁琐瞬间消失。

实战效果:从单条到批量

把插件激活后,Intruder 的 payload 列表可以直接填入想要修改的字段,Burp 在每一次发送前自动完成签名计算。一次抓包、一次改包、一次发送,整个链路的耗时从数秒降至毫秒级,批量暴力测试也因此不再受签名瓶颈限制。

参与讨论

7 条评论
  • 渔歌晚唱

    这玩意太硬核了,看得我头皮发麻🤔

    回复
  • 悠闲的猫

    求问这个在红米上能跑吗?一直连不上frida服务

    回复
  • 灵鸦夜啼

    之前搞过类似的东西,结果每次更新app签名逻辑就变,折腾死人

    回复
  • 影蚀迷踪

    不是…这年头还有用Python 2.7的工具?太离谱了吧

    回复
  • 暖风精灵

    要是目标APP加了防调用检测这招还管用不?

    回复
  • 祁门红茶

    脚本那段直接抄走能用吗?

    回复
    1. 枫少@KillBoy (作者)

      @ 祁门红茶 直接抄可能不行,密钥和时间戳得看你目标App具体怎么算的。

      回复