Light紫星 发表于 2023-10-11 14:27

记录某app难忘的抓包之旅

本帖最后由 Light紫星 于 2024-1-8 17:18 编辑

今天群友发了个app,问我可不可以抓包,app是水星WiFi的app,我本着天下还能有抓不到的包的想法,折腾了三个小时,抓包成功,在此记录一下本次难忘的抓包之旅。

首先,拿到app,发现无壳,无签名校验,然后直接lsp模块打开justtrustme,然后小黄鸟尝试抓包,发现app会提示网络错误。

然后全局搜索https字样,全部替换成了http,由于目标app是rn写的,所以把index.bound的js里面的https也都替换了,再次尝试,还是抓不到包,黄鸟提示app不信任系统证书,要你去替换app内部的证书。

现在目标清晰了,寻找app内部的证书,看到目标app的内部有几个pem文件,寻思直接替换呗,发现无用。

最后全局搜索了一下.pem,发现了一个so,名称为libRouterAppContextJNI.so,ida打开一看,别有一番天地,里面各种证书绑定啥的,操作了半天,最后用16进制编辑器替换掉了他原来的pem证书(这里的证书长度和黄鸟的长度不一样,怎么办呢,尾部补空格呗)

最后打开app,发现提示无网络,这是正常的,因为pem被替换了,他不信任原本的证书了,打开黄鸟代{过}{滤}理,发现可以正常抓包,至此,抓包成功,本帖结束。

【2024-01-08更新】

最近看到有人不会替换so里面的证书文件,所以单独写一下教程:
去小黄鸟的设置里选择 ”导出HttpCanary 根证书“,然后选择pem格式,会看到提示导出成功,这时候把pem文件发送到电脑上备用。

然后安装010editor或者其他16进制编辑器(可以在爱盘下载)

然后用010editor打开 libRouterAppContextJNI.so 文件,然后搜索 “-----BEGIN CERTIFICATE-----” 关键字,会找到多处,这个时候,复制 pem文件中的base64部分的数据,替换掉原来的数据(这里因为要对齐数据,所以后面我会提供一个python脚本操作)

把so和pem放到脚本同目录,运行如下脚本,执行替换操作,然后替换so,先打开黄鸟开启抓包,再打开对应的软件,可能 会提示app使用了自签名证书,这时候右上角导入就行了,如果没替换so,会提示下图的 目标应用使用了非系统的CA证书,无法抓包。

import os
PemFilename='HttpCanary.pem'
SoFilename='libRouterAppContextJNI.so'
SoBakFilename='libRouterAppContextJNI_bak.so'

ReplaceContentStart='-----BEGIN CERTIFICATE-----'
ReplaceContentEnd='-----END CERTIFICATE-----'

def FindMid(text,start,end):
    startIndex=text.find(start)
    endIndex=text.find(end,startIndex+len(start))
    return text
   
def PadPem(pemdata,length):
    if(length<len(pemdata)):
      return
    padlen = length - len(pemdata)
    return ReplaceContentStart.encode()+pemdata +ReplaceContentEnd.encode()+ b'\x00'*padlen
   
def ReplacePem():
    if(os.path.exists(SoBakFilename)):
      print('可能已经补丁过'+SoFilename)
      return
    PemContent = open(PemFilename,'r',encoding='u8').read()
    PemBase64Content=FindMid(PemContent,ReplaceContentStart,ReplaceContentEnd).encode()
    #print(PemBase64Content)
    SoFileContent = open(SoFilename,'rb').read()
    open(SoBakFilename,'wb').write(SoFileContent)
    print('源文件已经备份为:'+SoBakFilename)
   
    startText = ReplaceContentStart.encode()
    endText = ReplaceContentEnd.encode()
    startIndex=0
    index = 0
    while(1):
      startIndex = SoFileContent.find(startText,startIndex)
      if(startIndex==-1):
            break
      endIndex = SoFileContent.find(endText,startIndex+len(startText))
      rawPem = SoFileContent
      #if(rawPem.find(b'MIIGaDCCBFCgAwIBAgIJ')==-1):
      #    startIndex = endIndex+len(endText)
      #    continue
      if(len(rawPem)<len(PemBase64Content)):
            print(str(startIndex)+" 处补丁失败,长度超过了要补丁的pem长度!")
            startIndex = endIndex+len(endText)
            continue
      PadPemData = PadPem(PemBase64Content,len(rawPem))
      
      SoFileContent = SoFileContent[:startIndex]+PadPemData+SoFileContent
      
      index+=1
      print('补丁了第 '+str(index) +' 处,偏移为 '+str(startIndex) +' 到'+str(endIndex))
      startIndex = endIndex+len(endText)
      
    open(SoFilename,'wb').write(SoFileContent)
   
    print('补丁完成!共补丁了'+str(index)+'处!')

ReplacePem()
















孤狼微博 发表于 2023-10-12 00:01

纳尼,一般遇到这种我直接卸载秒完成,世上无难事只要肯放弃

laos 发表于 2023-10-11 15:32

现在抓包不学深一点都搞不了{:301_998:}

前段时间遇到一个很黄的app, 应该是双向认证的, 可证书导出来还是无法抓包,

g188666 发表于 2023-10-11 15:58

看着666啊

一只大菜猫 发表于 2023-10-11 14:34

现在很多APP越来越难抓了

slslsl 发表于 2023-10-11 14:48

直接虚拟机装一手安卓7以下版本来抓应该比较容易一些

Monklamn 发表于 2023-10-11 14:56

slslsl 发表于 2023-10-11 14:48
直接虚拟机装一手安卓7以下版本来抓应该比较容易一些

lsp 有一个模块已经把证书移到根目录,这样就可以抓包了

xxlq123 发表于 2023-10-11 15:16

有没有万能抓包的?

liuwujun521 发表于 2023-10-11 15:43

看着好6的样子

半杯不倒 发表于 2023-10-11 16:02

你很6666

currentdirect 发表于 2023-10-11 16:48

学习了学习了
页: [1] 2 3 4 5 6 7
查看完整版本: 记录某app难忘的抓包之旅