这批归档里时间最晚、体积最大的一个工程:ARP攻击-易语言版.e,2019-08-03,1,136,159 字节。
读 .e 容器的方法在上一篇里讲透了,这篇直接用。
窗体记录 = 一张完整的操作面板
.e 开头 10 KB 是窗体定义区,每个控件一条记录。把这一区的标题字段按顺序拉出来,就是这个工具的全部输入项:
选择网卡 标签EX7 / 编辑框EX7
本机MAC 标签EX9 / 编辑框EX9
路由器MAC 标签EX11 / 编辑框EX11
路由器IP 标签EX6 / 编辑框EX6
被欺骗MAC 标签EX8 / 编辑框EX8
发送间隔 标签EX10 / 编辑框EX10
因特发送MAC 标签EX12 / 编辑框EX13
接收者MAC ← 后面还有
接收者IP
发送者MAC
发送者IP
扫描 按钮EX2
发送 按钮EX3
应用区 分组框EX2
ARP欺骗小工具 是它的窗口标题(存在偏移 264812,扫描时首字节被上一条记录吃掉,显示成 貯RP欺骗小工具 —— 这类缺一字的串是错位读取的正常结果,不要当成原文)。
不需要读一行逻辑,输入输出就已经确定了。 选网卡 → 填网关 MAC/IP → 填目标 MAC → 设发包间隔 → 扫描 → 发送。标准的 ARP 中间人:伪造 ARP 应答,让目标以为"我就是网关",同时让网关以为"我就是目标"。
三处依赖,各自暴露一件事
1. WinPcap
扫到一句提示原文:
为了正常使用ARP协议的命令,请先安装WinPcap 3.1驱动。
我手上那个安装包还在:WinPcap_4_1_2.exe,915,920 字节,Riverbank 官方。提示写 3.1、实际带 4.1.2,是因为 WinPcap 4.x 向后兼容 3.x 的 API。
发二层以太网帧必须绕过协议栈,Windows 上只能靠这个驱动。这个安装包是闭源第三方,我没有收录,仓库 README 里写清了需要自己去取。
2. IPHLPAPI 的 SendARP
容器里有两条"外部命令声明"记录(易语言把 DLL 名 / 函数名 / 参数名 成对存着),扫出来是:
API_SendARP IPHLPAPI.DLL SendARP
参数:目标IP、本机IP、MAC缓冲
(另一处) ws2_32.dll inet_ntoa
参数:IP
SendARP 是 Windows 自带的 ARP 探测 API —— 发一个 ARP 请求,把回复的 MAC 读回来。所以它的"扫描"按钮不是自己拼的包,走的是系统调用;真正伪造应答(发出去那部分)才需要 WinPcap。
inet_ntoa 用来把字节数组形式的 IP 转成点分文本,配合界面上那些 本机IP 路由器IP 编辑框。
3. 自己定义的结构体
扫到两个类型名以及它们的字段:
以太网头
ARP头
操作类型
发送端IP地址
发送端以太网地址
目标
前缀
ARP数据
ARP头.操作类型 = 1 是 ARP 请求(2 是应答)。也就是说它把帧和包都手写了 —— 从二层以太网头一路拼到 ARP 字段。这是整个项目里我最想留下的部分:不是为了攻击,是为了搞明白一个 ARP 包在字节层面到底长什么样。
一次归因翻车
在偏移 957719 附近,我捞到三条长得像源码的语句:
ARP头.操作类型 = 1
ARP头.发送端IP地址 = “192.168.43.149”
ARP头.发送端以太网地址 = “CC-AF-78-78-2A-0C”
第一反应是:我的调试残留,把当时手机热点的 IP 和网卡 MAC 写死了。 192.168.43.x 正是安卓热点的默认网段,这个理由看起来太顺了。
准备把它写进博客之前我核对了一下位置。这三条在 954k–958k,而窗体定义在 0–6k。中间从 31k 开始全是第三方模块的文档串和 API 表(驱动模拟类、内存_偏移量10、数据库权限_只读、SQLite 常量、一整张 ADO 字段类型表……)。也就是说这些语句落在模块区,不在我的代码区。
再看同一段里挨着的两句:
加入调试文本 (“结果:” + 到文本 (ARP欺骗 ()))
加入调试文本 (“攻击目标:” + 目标 + “ 结果:” + 到文本 (ARP欺骗 ()))
加入调试文本 是易语言调试输出,变量叫 目标 —— 是模块作者写给自己例程用的变量名。我的界面里那个字段叫被欺骗MAC。
所以最可能的结论:这是该 ARP 模块自带的例程源码,那个 IP/MAC 是模块作者的,不是我的。
我没法证死。参照物是另一个工程里那行真源码 —— 如果 (客户1.连接 (#IP, 20930) = 假),里面带着我自己的控件名 客户1,那种才算。这里对不上,所以我不声称它是我写的。
这才是这篇真正想留的东西:字节扫描能给你文本,但不给你归属。看到一段"像自己代码"的文本,先看它在文件里的哪个区、变量名对不对得上你的界面 —— 对上才算,对不上就承认读不出来。把模块例程当成自己的调试残留写进文章,就是一次自我造假。
(顺带说,ARP 这个文件里 15 条"语句形态"命中,逐条查完,能归到我的:0 条。)
三个版本,说明它被反复改过
三个编译产物:
ARP欺骗.exe 2,021,903 2019-08-03
ARP欺骗_version 2.0.exe 2,034,191
ARP.exe 2,021,903
一代和"最新版"同尺寸,2 代大了 12 KB。.e 只有一个(2019-08 这份),所以我只能确定它是最后一版,不能确定它是哪一代。
编译出的 exe 一律不收录 —— 能直接跑的二进制没发的必要,源码在仓库里。
容器里那个编译目标名叫 主程序.exe,而真正留下来的三个产物分别叫 ARP欺骗.exe / ARP.exe —— 说明交付前改过输出名。这类"容器里存的目标名"和"实际文件名"对不上的情况,在旧归档里很常见,它比文件时间戳更早,记的是第一次编译那一刻。
为什么发出来
2019 年的 ARP 欺骗,工具层面人尽皆知:arpspoof、Cain、ettercap,教程满地都是,这个没有任何独家内容,也没有任何别人做不到的东西。原理我也不在这里讲,网上比我知道得多。
发它的唯一理由是它是我自己写的,是我从"做聊天软件"走到"想知道网络底层到底怎么走"的那一步。而且这个工程是这堆归档里唯一一个我用字节扫描读到了自己定义的结构体字段名的 —— 那个"窗体即文档 + 结构体字段可枚举"的读法,比工具本身有用。
仓库
https://cnb.cool/t1mmoc/tspace/eyuyan/lp-arp-spoof
内含脱敏后的 .e 容器本体,以及依赖说明。不含 WinPcap 安装包、不含 exe。