1. 项目概述:从一张卡片到一座金矿
如果你接触过金融、门禁、SIM卡或者二代身份证,那你手里就捏着一张智能卡。大多数人把它当成一个黑盒子,插进去,输密码,交易完成。但对我们这些搞安全测试和逆向工程的人来说,这张小小的塑料片,是一座等待挖掘的信息金矿。而打开这座金矿大门的第一把钥匙,往往就是那串看似杂乱无章、在卡片插入读卡器瞬间“握手”时发出的数据——ATR。
ATR,全称Answer To Reset,中文叫“复位应答”。你可以把它想象成智能卡的“身份证”和“能力说明书”。当读卡器给卡片上电(复位)时,卡片不是闷声不响,而是会立刻回复一串字节序列,主动告诉外界:“嗨,我是谁,我能干什么,我习惯怎么沟通。”这串信息里,编码了卡片的制造商、遵循的标准、支持的通信协议、工作电压、时钟频率等核心参数。在安全测试的语境下,分析ATR不再是简单的设备识别,而是攻击链的第一步。通过它,我们可以快速对目标卡片进行“画像”,判断其类型(是银行卡、门禁卡还是某种专用安全模块),评估其可能存在的已知漏洞(比如特定芯片的缺陷),并规划后续更深入的逆向工程与渗透测试路径。这个过程,就像侦探到达案发现场,首先观察环境、收集物证,为后续的深入调查定下基调。
2. 核心需求解析:为什么安全测试必须从ATR开始?
很多刚入行的朋友可能会直奔主题,想方设法去读卡内数据、破解密钥。但经验告诉我们,鲁莽的直接攻击效率极低,且极易触发卡片的防攻击机制(如锁卡)。系统性地从ATR入手,是基于以下几个核心的、实战驱动的需求:
2.1 建立测试基线,避免“盲人摸象”
在没有ATR信息的情况下,你对目标卡片一无所知。你该用T=0还是T=1协议?电压是5V、3V还是1.8V?最高时钟频率是多少?胡乱尝试不仅可能无法通信,更可能因电气参数不匹配而损坏卡片或读卡器。ATR提供了建立安全通信所必需的所有底层参数。获取并解析ATR,意味着你成功与卡片建立了最基础的对话通道,这是所有后续高级交互(APDU命令)的前提。
2.2 快速分类与风险初筛
不同类型的智能卡,其安全架构和薄弱点天差地别。
- 金融IC卡(如银行卡):通常遵循EMV标准,ATR中会有特定的标识。其风险可能集中在应用层协议、非接支付功能或旧版标准的已知漏洞上。
- 门禁卡/一卡通:可能采用Mifare Classic、Desfire等逻辑加密卡或CPU卡。Mifare Classic的ATR有其特征,而其著名的Crypto1算法漏洞已是公开的秘密。识别出此类卡片,几乎可以直接关联到相应的破解工具链。
- SIM卡/USIM卡:ATR格式遵循ETSI/3GPP规范,用于移动通信。其测试重点在于OTA(空中下载)安全、鉴权算法(如COMP128)的强度以及Java Card平台上的小程序安全。
- 专用安全模块(如加密狗、税控卡):ATR可能包含私有的厂商标识。识别出厂商后,可以针对性搜索该厂商产品历史上披露过的安全公告或研究论文。
通过ATR进行快速分类,能让我们立即将测试资源聚焦到最可能生效的攻击面上,而不是进行大海捞针式的全协议模糊测试。
2.3 发现“异常”或“伪装”卡片
在渗透测试中,我们有时会遇到被篡改或伪造的卡片。一张声称是某品牌高安全门禁卡的设备,其ATR却可能暴露出它只是一张廉价的存储卡。或者,一张卡片的ATR中声明支持某种高级加密特性,但在后续测试中却无法实现,这可能暗示卡片固件存在缺陷或后门。ATR与卡片实际行为的不一致性,本身就是一个高风险信号。
2.4 为深度逆向工程提供切入点
ATR的历史字节(Historical Bytes)字段可能包含额外的信息,如卡片生命周期状态、预置的应用标识符(AID)甚至自定义数据。这些信息是逆向工程人员理解卡片内部应用结构的宝贵线索,可以引导我们去尝试选择(SELECT)特定的应用进行后续分析。
3. ATR的结构化拆解:每一个字节都在“说话”
一个标准的ATR序列遵循ISO/IEC 7816-3标准的结构。我们把它拆开来看,每一部分都有其明确含义。假设我们捕获到一个典型的ATR:3B 9F 96 80 1F C7 80 31 A0 73 BE 21 13 67 4D 02 04 10 90 00
3.1 初始字符TS:约定通信的“起跑线”
- 字节:
3B - 含义:TS (Initial Character) 定义了后续字节的逻辑电平约定。
- 解析:
3B(十六进制) 对应二进制0011 1011。其最高位为0,表示采用正向约定,即后续字节中‘1’由高电平(H)表示,‘0’由低电平(L)表示。这是最常见的情况。如果是3F,则表示反向约定。 - 安全测试关联:几乎所有通用读卡器和分析工具都默认处理正向约定。如果遇到反向约定的卡片(较少见),需要确保你的工具链支持,否则解码会全部错误。
3.2 格式字符T0:后续信息的“目录”
- 字节:
9F - 含义:T0 是一个复合字节,其高4位(Y1)指示TA1, TB1, TC1, TD1四个接口字节是否存在,低4位(K)表示历史字节的长度。
- 解析:
9F二进制为1001 1111。- 高4位
1001:表示 TD1 存在(bit3=1),TC1存在(bit2=1),TB1不存在(bit1=0),TA1存在(bit0=1)。所以接口字节的顺序将是 TA1, TC1, TD1。 - 低4位
1111:十进制为15,表示历史字节有15个。
- 高4位
- 实操要点:解析ATR必须从T0开始动态计算后续结构。Y1的每一位(从低到高)对应TA1到TD1的存在性。TD1的存在意味着后面还有更多的接口字节(TA2/TB2...)。
3.3 接口字节TA1/TB1/TC1/TD1...:电气与协议“规格书”
这些字节定义了卡片与读卡器之间的物理和链路层参数。
- TA1 (
96):定义F(时钟速率转换因子)和D(比特速率调整因子)。96(二进制1001 0110) 表示 F=512, D=16。这决定了通信的时钟频率关系。在测试中,如果读卡器不支持卡片声明的极高F值,可能导致通信不稳定。 - TB1:本例中T0指示TB1不存在。如果存在,它通常定义编程电压P(对于可编程存储器卡重要)。
- TC1 (
80):定义额外保护时间N(字符间等待时间)。80十进制128,表示N=128个etu(基本时间单元)。这个值设置不当,在高速通信时容易造成字节丢失。 - TD1 (
1F):指示下一个接口字节组(TA2/TB2/TC2/TD2)的存在性,以及本阶段使用的协议T。1F(二进制0001 1111) 表示高4位Y2=0001(即TA2存在),低4位T=1111?等等,这里有个关键点:T值用低4位表示,但只有0-14是有效协议号,15是保留值。实际上,标准中T=15表示后续字节使用特定编码。更常见的解读是,TD1的低半字节指明了当前阶段的协议。我们需要看完整的序列。实际上,1F的二进制是0001 1111,低4位是1111即15,这通常意味着第一个协议阶段是T=15(特定或未定义),但结合后续TD2来看,这可能是为了引入第二个协议阶段。让我们继续看。
紧随TD1(1F)之后,根据TA1存在,下一个字节是TA2?不,根据T0的Y1=1001,顺序是TA1(96), TC1(80), TD1(1F)。所以1F之后,根据TD1的Y2=0001(TA2存在),下一个字节是TA2。
- TA2 (
C7):TA2如果存在,通常用于定义特定的工作模式(如协商模式)。需要查表解析。 - 后续TD2 (
80):80二进制1000 0000,高4位Y3=1000(表示TB3存在),低4位T=0000。这里T=0,表示最终选择的协议是T=0(字符传输协议)。这是非常常见的协议。 - TB3 (
31):定义Vpp(编程电压)相关参数。 - TC2 (
A0):如果存在,通常定义特定协议下的额外等待时间。
注意:ATR的解析是逐级递进的,每个TD字节都像是一个指针,告诉你后面还有没有更多的接口字节(通过Y位),以及当前阶段使用什么协议(通过T位)。实际解析时,必须写一个小脚本或使用现成工具(如
pcsc_scan,ATR_analysis工具)来避免人工错误。上面示例的完整解析可能更复杂,这里旨在展示解析逻辑。
3.4 历史字节:卡片的“自述文件”
- 内容:本例中历史字节为
73 BE 21 13 67 4D 02 04 10 90 00(共11个?前面T0说K=15,这里需要15个,可能后面还有4个,示例可能截断了)。历史字节的格式由卡片自行定义,但通常遵循TLV(标签-长度-值)格式或特定标准。 - 关键标签:
73:通常是一个标签,表示后面跟的是目录数据。80:常见于金融卡,后面跟发卡行标识。- 应用标识符(AID):可能包含在历史字节中,是选择卡片应用的直接入口点。
- 安全测试价值:这是富信息层。你可能在这里直接发现卡片的用途(AID)、发卡方信息、甚至未公开的标签。在逆向工程中,对这些自定义标签值的猜测和测试,是探索卡片非标准功能的重要途径。
3.5 校验字节TCK:数据的“封印”
- 字节:最后一个字节(如果协议T=0,则没有TCK;如果T=1或T=14等,则有TCK)。它是从T0到TCK之前所有字节的异或校验和。
- 作用:确保ATR在传输过程中没有出错。在测试中,如果捕获的ATR校验失败,说明通信过程受到干扰或捕获有误,此ATR不可信。
4. 实操:捕获、解析与利用ATR的完整流程
理论需要落地。下面是一个从硬件准备到分析利用的完整操作链。
4.1 工具准备:硬件与软件栈
硬件:
- 通用智能卡读卡器:推荐ACS、Identiv、SCM等品牌的通用型USB读卡器。确保其支持ISO 7816标准,并能提供稳定的电源和时钟。
- 目标智能卡:你需要测试的卡片。
- (可选)逻辑分析仪或示波器:用于在物理层捕获和分析复位时序与信号,进行最底层的安全审计和异常检测。
软件:
- PC/SC中间件:这是操作系统与读卡器通信的基础。Windows通常自带,Linux安装
pcsc-lite和pcsc-tools。# Ubuntu/Debian sudo apt-get install pcscd pcsc-tools # 启动服务 sudo service pcscd start - ATR捕获与卡片探测工具:
pcsc_scan(Linux):最常用的工具,插入卡片即连续扫描并显示ATR及卡片信息。ATR_analysis:专门的ATR解析工具,提供图形化或命令行深度解析。- Python +
pyscard库:提供最大的灵活性,可以编程方式获取ATR并进行自定义分析。from smartcard.System import readers from smartcard.util import toHexString # 获取所有读卡器 r = readers() if not r: print("未检测到读卡器") exit() connection = r[0].createConnection() try: connection.connect() atr = connection.getATR() print(f"ATR: {toHexString(atr)}") except Exception as e: print(f"连接失败: {e}")
- 数据库与参考资料:
- 智能卡ATR列表网站:如
smartcard-atr.appspot.com,拥有庞大的ATR数据库,可以上传你的ATR进行比对识别。 - ISO/IEC 7816-3 标准文档:终极参考手册。
- 厂商芯片手册:如果ATR中识别出特定芯片(如NXP的标识),去找对应的芯片数据手册,里面会有该芯片ATR的详细解释和可能的后门指令。
- 智能卡ATR列表网站:如
4.2 步骤详解:从插入卡片到生成报告
步骤1:物理连接与捕获将读卡器连接电脑并安装好驱动。插入目标卡片。在Linux终端直接运行pcsc_scan。你会看到类似下面的实时输出:
Using reader plug'n play mechanism Scanning present readers... 0: Identiv Identiv uTrust 4701 F Dual Interface Reader [uTrust 4701 F DI CL Reader] (xxxxxxxx) 01 00 Wed May 15 10:00:00 2024 Reader 0: Identiv Identiv uTrust 4701 F Dual Interface Reader [uTrust 4701 F DI CL Reader] (xxxxxxxx) 01 00 Event number: 0 Card state: Card inserted, ATR: 3B 9F 96 80 1F C7 80 31 A0 73 BE 21 13 67 4D 02 04 10 90 00 ATR: 3B 9F 96 80 1F C7 80 31 A0 73 BE 21 13 67 4D 02 04 10 90 00 + TS = 3B --> Direct Convention + T0 = 9F, Y(1): 1001, K: 15 (historical bytes) TA(1) = 96 --> Fi=512, Di=16, 16 cycles/ETU (f max for this Fi: 8 MHz => f: 8 MHz, ETU: 2 us) TC(1) = 80 --> Extra guard time: 128 TD(1) = 1F --> Y(2): 0001, Protocol: T=15 - NOT ASSIGNED TA(2) = C7 --> (specific mode indication) TD(2) = 80 --> Y(3): 1000, Protocol: T=0 TB(3) = 31 --> VPP: 0 V, P: 0, I: 0 + Historical bytes: 73 BE 21 13 67 4D 02 04 10 90 00 Category indicator byte: 73 (proprietary format) + TCK = 00 (correct checksum) Possibly identified card (using /usr/share/pcsc/smartcard_list.txt): 3B 9F 96 80 1F C7 80 31 A0 73 BE 21 13 67 4D 02 04 10 90 00 NXP JCOP (Java Card) v2.4.2看,pcsc_scan不仅给出了ATR,还自动进行了初步解析,并利用本地数据库猜测这是NXP JCOP Java Card。这是一个极强的线索!
步骤2:深度解析与比对将捕获的ATR字符串复制,粘贴到smartcard-atr.appspot.com的查询框中。网站会返回更详细的结构化解析,并显示全球其他用户提交的匹配结果,告诉你这可能是哪种类型的卡(例如“某银行VISA卡”、“某公司门禁系统”等)。这一步能极大丰富你的“卡片画像”。
步骤3:协议与参数适配根据解析出的TA1(F/D值)、TC1(N值)和最终协议(T=0/T=1),在你的测试脚本或工具中配置相应的通信参数。例如,使用Pythonpyscard时,需要在connect()方法中指定协议:
connection.connect(protocol=smartcard.scard.SCARD_PROTOCOL_T0) # 或 T1如果参数不匹配,通信会失败或出错。
步骤4:基于ATR信息规划测试策略现在你知道了:
- 卡片类型:疑似NXP JCOP Java Card(一个广泛使用的Java卡平台)。
- 协议:T=0。
- 历史字节:包含专有数据 (
73开头)。
你的测试策略可以立即聚焦:
- Java Card攻击面:尝试SELECT标准的Java Card AID(如
A0 00 00 00 62 01 01),探索卡上安装的小程序(Applet)。 - 搜索已知漏洞:搜索“NXP JCOP 漏洞”、“Java Card 安全公告”。历史上Java Card虚拟机(JCVM)、APDU防火墙、字节码验证器都曾曝出过漏洞。
- 分析历史字节:尝试解析
73 BE 21 ...这串数据。73后面的内容可能包含卡片的实例标识符、平台版本信息。这可能是后续构造特定攻击载荷的输入。 - 协议级测试:针对T=0协议,可以测试异常APDU处理、边信道攻击(如功耗分析)的可行性,因为T=0是半双工、基于字节的协议,其特性与T=1(块传输协议)不同。
4.3 自动化脚本示例:ATR捕获与初步分类
你可以编写一个简单的Python脚本,将上述过程自动化,并集成一些简单的规则引擎。
import subprocess import re from smartcard.System import readers from smartcard.util import toHexString def get_atr_via_pcsc_scan(): """使用pcsc_scan命令捕获ATR""" try: result = subprocess.run(['pcsc_scan', '-n'], capture_output=True, text=True, timeout=5) output = result.stdout # 使用正则表达式匹配ATR行 atr_match = re.search(r'ATR:\s*([0-9A-Fa-f\s]+)', output) if atr_match: atr_str = atr_match.group(1).strip().replace(' ', '') return bytes.fromhex(atr_str) except FileNotFoundError: print("未找到pcsc_scan命令,请安装pcsc-tools。") except subprocess.TimeoutExpired: print("pcsc_scan超时,可能无卡片插入。") return None def analyze_atr_manual(atr_bytes): """简单的手动ATR解析(示例,不完整)""" if not atr_bytes or len(atr_bytes) < 2: return "无效ATR" ts = atr_bytes[0] t0 = atr_bytes[1] convention = "正向" if ts == 0x3B else "反向" if ts == 0x3F else "未知" historical_len = t0 & 0x0F print(f"[+] TS: 0x{ts:02X} -> {convention}约定") print(f"[+] T0: 0x{t0:02X} -> 历史字节长度: {historical_len}") # 这里可以添加更多解析逻辑... # 简单规则匹配 atr_hex = toHexString(atr_bytes).replace(' ', '') if '3B9F9680' in atr_hex: print("[!] 疑似 NXP JCOP 系列 Java 卡") elif '3B8F8001' in atr_hex: print("[!] 疑似 Mifare Classic 系列逻辑加密卡") elif '3B9F9580' in atr_hex: print("[!] 疑似金融IC卡 (EMV)") else: print("[?] 未匹配到常见类型,需进一步分析。") if __name__ == '__main__': print("=== 智能卡ATR快速分析工具 ===") atr = get_atr_via_pcsc_scan() if atr: print(f"捕获到ATR: {toHexString(atr)}") analyze_atr_manual(atr) else: print("未捕获到ATR,请检查读卡器与卡片。")5. 潜在风险识别与攻击面映射
解析ATR本身不构成攻击,但它是指引攻击方向的“地图”。以下是基于ATR信息可以推导出的主要风险维度:
5.1 基于卡片类型的已知漏洞利用
这是最直接的路径。一旦识别出卡片类型/芯片平台,应立即进行关联漏洞搜索。
| 卡片类型 (通过ATR特征推断) | 潜在风险/已知漏洞举例 | 测试工具/方法 |
|---|---|---|
| Mifare Classic (MF1) | Crypto1流密码算法被完全破解,可克隆、可破解密钥。 | mfoc,mfcuk,Proxmark3 |
| Mifare DESFire (MF3) | 早期版本(EV1)存在基于PRNG的漏洞,可恢复密钥。某些配置存在权限提升问题。 | libfreefare, 自定义脚本分析认证流程 |
| Java Card (JCOP, J3Axxx) | JCVM漏洞(如类型混淆)、APDU防火墙绕过、旧版字节码验证器漏洞、敏感数据泄露。 | JCardTest,GlobalPlatformPro结合模糊测试 |
| 特定银行IC卡 (EMV) | 旧版qVSDC协议漏洞、非接中继攻击(Relay Attack)、卡片克隆(特定条件下)。 | 专用EMV测试工具、非接嗅探设备 |
| 某品牌门禁CPU卡 | 厂商自定义命令可能存在缓冲区溢出、认证逻辑缺陷。 | 基于APDU的模糊测试、逆向分析专有指令 |
实操心得:不要只依赖一两个在线数据库的识别结果。最好将ATR与后续的
SELECT命令响应、卡片支持的指令集(通过GET PROCESSING OPTIONS等命令)结合起来进行交叉验证。有时,一张卡片可能被重新个性化,其ATR指向的底层平台才是漏洞的真正来源。
5.2 协议与参数配置缺陷
ATR声明的参数如果配置不当,或读卡器/卡片实现有误,可能引入风险。
- 过长的额外保护时间 (TC1过大):可能被用于时序攻击(Timing Attack),通过精确测量响应延迟来推断内部操作。
- 非标准协议T值:如果ATR声明使用一个非标准的协议(如T=14),而测试工具链不支持,可能会迫使测试人员使用更底层的、可能安全性较差的直接IO控制方式与卡片通信,这本身可能暴露新的攻击面。
- 电压与频率协商 (TA1, TB1):如果卡片支持宽电压范围(如1.8V-5V),攻击者可能在电压切换的瞬间进行故障注入(Glitching),使卡片进入非正常状态,从而执行未授权操作。
5.3 历史字节信息泄露
历史字节可能泄露敏感信息,成为社会工程学攻击或针对性攻击的素材。
- 发卡行标识:暴露卡片所属机构。
- 卡片序列号/唯一标识符:可能被用于跟踪或与其他泄露数据关联。
- 应用标识符 (AID):直接暴露卡内应用,攻击者可以尝试用已知的、存在漏洞的AID进行选择并攻击。
- 生命周期状态:指示卡片是处于开发、个人化还是运营状态。开发状态的卡片可能留有调试后门。
6. 常见问题与排查技巧实录
在实际操作中,你会遇到各种坑。以下是一些典型问题及解决方法。
6.1 问题:pcsc_scan检测不到读卡器或卡片
- 可能原因1:PC/SC服务未运行。
- 排查:Linux下运行
sudo service pcscd status。Windows下检查“智能卡服务”是否启动。 - 解决:Linux:
sudo service pcscd start。Windows: 在服务管理器中启动“Smart Card”服务。
- 排查:Linux下运行
- 可能原因2:驱动问题。
- 排查:读卡器指示灯是否正常?设备管理器中是否有未知设备或感叹号?
- 解决:访问读卡器厂商官网下载最新驱动。Linux下通用读卡器通常由
libccid驱动,确保已安装sudo apt-get install libccid。
- 可能原因3:权限不足。
- 排查:Linux下当前用户是否在
scard组? - 解决:将用户加入组:
sudo usermod -aG scard $USER,然后注销重新登录。
- 排查:Linux下当前用户是否在
6.2 问题:捕获到的ATR不稳定,每次插入都不同
- 可能原因1:卡片电源接触不良。
- 解决:清洁卡片芯片触点,确保读卡器插槽接触良好。尝试稍微按压卡片。
- 可能原因2:卡片支持“冷复位”和“暖复位”,ATR可能不同。
- 解释:ISO标准定义了冷复位(首次上电)和暖复位(在已上电状态下触发)。有些卡片对两者返回的ATR略有差异(如历史字节)。
- 解决:这是正常现象。记录两种复位方式的ATR,都进行分析。在测试工具中,可以尝试主动发送复位指令来触发暖复位。
6.3 问题:在线ATR数据库查不到匹配结果
- 可能原因1:卡片较新或非常专用。
- 解决:不要灰心。专注于解析其结构(TS, T0, 接口字节)。关注历史字节,尝试解码其中的TLV结构。这可能是你发现一个新品类卡片的机会。
- 可能原因2:ATR被自定义或混淆。
- 解决:对比接口字节(TA1/TB1等)与标准值,看其声明的电气参数是否合理。不合理的参数(如极高的时钟频率)可能是一种简单的反分析手段。尝试用标准参数(如F=372, D=1)强制与卡片通信。
6.4 问题:知道卡片类型,但不知如何进行下一步测试
- 解决思路:
- 建立通信:使用正确协议(T=0/T=1)连接卡片。
- 枚举应用:发送
SELECT命令,AID先尝试00 A4 04 00 00(选择MF),然后尝试从历史字节中提取的AID,或已知的通用AID(如Java Card的A0 00 00 00 62 01 01)。 - 获取数据:发送
GET DATA、READ BINARY等基本命令,看卡片响应。注意先尝试不需要认证的命令。 - 模糊测试:使用像
APDUfuzz这样的工具,或自己编写脚本,向卡片发送畸形、超长、格式错误的APDU命令,观察其响应(是否崩溃、返回错误信息、状态字是否异常)。这是发现未知漏洞的常用方法。 - 侧信道准备:如果ATR显示卡片是CPU卡且涉及加密操作,可以考虑进行功耗分析(PA)或电磁分析(EMA)攻击。这需要更专业的设备(如 oscilloscope, ChipWhisperer)。
6.5 高级技巧:利用ATR进行“指纹识别”与资产梳理
在大型企业安全评估中,你可能需要快速清点所有门禁卡、工卡的类型。可以编写一个脚本,批量读取所有收集到的卡片的ATR,并自动分类。
# 伪代码思路 import csv def batch_atr_scan(readers_list): results = [] for reader in readers_list: for card in card_pool: atr = read_atr(reader, card) card_type = lookup_database(atr) # 调用本地或在线DB results.append({'Reader': reader, 'Card_ID': card.id, 'ATR': atr, 'Type': card_type}) # 生成报告,统计各类型卡片数量,标记可疑卡片(如已识别存在漏洞的类型) generate_report(results)这样,你可以迅速生成一份资产风险报告:“发现50张Mifare Classic卡(已知高风险),建议逐步更换为Mifare DESFire或CPU卡”。
ATR分析是智能卡安全测试中成本最低、信息回报率最高的第一步。它不需要破解任何密钥,却能为你勾勒出完整的攻击轮廓。花时间精通ATR的解析,建立自己的知识库和工具链,就像熟练的工匠熟悉他的工具一样,能让后续所有复杂的逆向工程与渗透测试工作事半功倍。记住,在智能卡的世界里,沉默的卡片在复位瞬间的“第一句话”,往往就包含了关于它自身秘密的最多线索。