本帖最后由 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证书,无法抓包。
[Python] 纯文本查看 复制代码 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[startIndex+len(start):endIndex]
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[startIndex+len(startText):endIndex]
#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[endIndex+len(endText):]
index+=1
print('补丁了第 '+str(index) +' 处,偏移为 '+str(startIndex) +' 到'+str(endIndex))
startIndex = endIndex+len(endText)
open(SoFilename,'wb').write(SoFileContent)
print('补丁完成!共补丁了'+str(index)+'处!')
ReplacePem()
replacePem.zip
(996 Bytes, 下载次数: 19)
|