HOSTS式钓鱼拦截源码
利用HOSTS来拦截SMTP,再次提醒搭建小心钓鱼软件,对于未知的程序尽量在虚拟机里使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
|
.版本 2 .支持库 shell .程序集 窗口程序集1 .程序集变量 IP, 文本型 .程序集变量 host路径, 文本型 .程序集变量 原hosts是否存在, 逻辑型 .程序集变量 客户, 文本型 .程序集变量 是否为账号, 逻辑型 .程序集变量 是否为密码, 逻辑型 .程序集变量 账号, 文本型 .程序集变量 密码, 文本型 .子程序 列表框_加入提示 .参数 提示, 文本型 列表框_状态.加入项目 (提示, ) 列表框_状态.现行选中项 = 列表框_状态.取项目数 () - 1 处理事件 () .子程序 _按钮_监听_被单击 IP = “” 原hosts是否存在 = 真 账号 = “” 密码 = “” 是否为账号 = 假 是否为密码 = 假 连续赋值 (真, 编辑框_服务器端口.禁止, 编辑框_服务器地址.禁止, 单选框1.禁止, 单选框2.禁止) 列表框_状态.清空 () 处理事件 () 列表框_加入提示 (“正在访问网络获取指定邮箱服务器的IP地址...”) IP = 转换为IP地址 (编辑框_服务器地址.内容) .如果真 (IP = “”) 列表框_加入提示 (“查询IP失败!请检查邮箱服务器地址拼写。”) 返回 () .如果真结束 列表框_加入提示 (“查询结果: 地址[” + 编辑框_服务器地址.内容 + “]对应IP地址[” + IP + “]”) host路径 = 取特定目录 (#Windows系统目录) + “Drivers\etc\hosts” ' 备份原hosts文件 列表框_加入提示 (“正在备份原hosts文件...”) .如果真 (复制文件 (host路径, “.\hosts.bak”) = 假) 原hosts是否存在 = 假 .如果真结束 列表框_加入提示 (“正在修改hosts文件...”) .如果真 (写到文件 (host路径, 到字节集 (“127.0.0.1 ” + 编辑框_服务器地址.内容 + #换行符)) = 假) 列表框_加入提示 (“hosts文件修改失败!请使用管理员身份运行,并且不要拦截。”) 返回 () .如果真结束 服务器1.端口 = 到整数 (编辑框_服务器端口.内容) 列表框_加入提示 (“已开始监控...请务必关闭监控后再退出本工具,以便还原hosts”) 按钮_监听.禁止 = 真 按钮_终止.禁止 = 假 .子程序 __启动窗口_可否被关闭, 逻辑型 .如果真 (按钮_监听.禁止 = 真) 信息框 (“请先关闭监控在退出软件!否则无法还原备份的hosts文件!”, 0, ) 返回 (假) .如果真结束 返回 (真) .子程序 _按钮_终止_被单击 服务器1.端口 = 0 列表框_状态.清空 () 列表框_状态.加入项目 (“正在还原被修改的hosts文件...”, ) .如果 (原hosts是否存在 = 假) .如果真 (删除文件 (host路径) = 假) 列表框_状态.加入项目 (“还原hosts失败!请不要用杀毒软件拦截。”, ) 返回 () .如果真结束 .否则 .如果真 (写到文件 (host路径, 读入文件 (“.\hosts”)) = 假) 列表框_状态.加入项目 (“还原hosts失败!请不要用杀毒软件拦截。”, ) 返回 () .如果真结束 .如果结束 列表框_加入提示 (“监控已关闭!”) 按钮_终止.禁止 = 真 按钮_监听.禁止 = 假 连续赋值 (假, 编辑框_服务器端口.禁止, 编辑框_服务器地址.禁止, 单选框1.禁止, 单选框2.禁止) .子程序 __启动窗口_创建完毕 服务器1.端口 = 0 .子程序 _服务器1_客户进入 客户 = 服务器1.取回客户 () 列表框_加入提示 (“客户进入:” + 客户) .如果真 (单选框2.选中 = 真) 服务器1.发送数据 (客户, “220 smtp.qq.com Esmtp QQ Mail Server” + #换行符, ) 返回 () .如果真结束 客户1.连接 (IP, 到整数 (编辑框_服务器端口.内容)) .子程序 _服务器1_客户离开 客户 = 服务器1.取回客户 () 列表框_加入提示 (“客户离开:” + 客户) 客户1.断开连接 () _按钮_重置_被单击 () .子程序 _服务器1_数据到达 .局部变量 数据, 字节集 .局部变量 不输出列表, 逻辑型 数据 = 服务器1.取回数据 () .如果真 (单选框2.选中 = 真) ' 如果是这样则当本软件为虚拟SMTP服务器,返回数据给钓鱼软件骗取密码 列表框_加入提示 (“发送数据:” + 到文本 (数据)) .如果真 (寻找字节集 (数据, 到字节集 (“HELO”), ) ≠ -1 或 寻找字节集 (数据, 到字节集 (“EHLO”), ) ≠ -1) 服务器1.发送数据 (客户, “250-smtp.qq.com” + #换行符 + “250-PIPELINING” + #换行符 + “250-SIZE 52428800” + #换行符 + “250-AUTH LOGIN PLAIN” + #换行符 + “250-AUTH=LOGIN” + #换行符 + “250-MAILCOMPRESS” + #换行符 + “250 8BITMIME” + #换行符, ) 列表框_加入提示 (“返回数据:250-smtp.qq.com250-PIPELINING250-SIZE 5242880”) 返回 () .如果真结束 .如果真 (数据 = 到字节集 (“AUTH LOGIN” + #换行符)) 服务器1.发送数据 (客户, “334 VXNlcm5hbWU6” + #换行符, ) 列表框_加入提示 (“返回数据:334 VXNlcm5hbWU6”) 是否为账号 = 真 返回 () .如果真结束 .如果真 (是否为账号 = 真) 服务器1.发送数据 (客户, “334 UGFzc3dvcmQ6” + #换行符, ) 列表框_加入提示 (“返回数据:334 UGFzc3dvcmQ6”) 账号 = 到文本 (BASE64解码 (到文本 (数据))) 列表框_加入提示 (“拦截到账号:” + 账号) 是否为账号 = 假 是否为密码 = 真 返回 () .如果真结束 .如果真 (是否为密码 = 真) 服务器1.发送数据 (客户, “235 Authentication successful” + #换行符, ) 列表框_加入提示 (“返回数据:235 Authentication successful”) 密码 = 到文本 (BASE64解码 (到文本 (数据))) 列表框_加入提示 (“拦截到密码:” + 密码) 是否为密码 = 假 返回 () .如果真结束 .如果真 (数据 = 到字节集 (“QUIT” + #换行符)) 服务器1.断开客户 (客户) 返回 () .如果真结束 .如果真结束 .如果真 (是否为密码 = 真) ' 说明这次拦截的数据是邮箱密码 密码 = 到文本 (BASE64解码 (到文本 (数据))) 列表框_加入提示 (“拦截到密码:” + 密码) 是否为密码 = 假 不输出列表 = 真 .如果真结束 .如果真 (是否为账号 = 真) 账号 = 到文本 (BASE64解码 (到文本 (数据))) 列表框_加入提示 (“拦截到账号:” + 账号) 是否为账号 = 假 是否为密码 = 真 不输出列表 = 真 .如果真结束 .如果真 (不输出列表 = 假) 列表框_加入提示 (“发送数据:” + 到文本 (数据)) .如果真结束 .如果真 (数据 = 到字节集 (“AUTH LOGIN” + #换行符)) ' 这意味着拦截到AUTH LOGIN 是否为账号 = 真 .如果真结束 客户1.发送数据 (数据) .子程序 BASE64解码, 字节集 .参数 编码文本, 文本型, 参考 .局部变量 文本长度 .局部变量 整倍数 .局部变量 三字节组, 字节型, , "3" .局部变量 四字节组, 字节型, , "4" .局部变量 编码值 .局部变量 X .局部变量 n .局部变量 二进制数据, 字节集 .局部变量 指针 .局部变量 字节数组, 字节型, , "0" 编码文本 = 删全部空 (编码文本) 编码文本 = 子文本替换 (编码文本, #换行符, , , , 真) 文本长度 = 取文本长度 (编码文本) 整倍数 = 文本长度 \ 4 .如果真 (文本长度 % 4 ≠ 0) 整倍数 = 整倍数 + 1 .如果真结束 重定义数组 (字节数组, 假, 整倍数 × 3) ' 开辟缓冲区大小 指针 = 1 .计次循环首 (整倍数, X) .计次循环首 (4, n) 四字节组 [n] = 取代码 (编码文本, (X - 1) × 4 + n) 编码值 = 寻找文本 (“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”, 字符 (四字节组 [n]), , 假) .如果真 (编码值 = -1) 跳出循环 () .如果真结束 四字节组 [n] = 编码值 - 1 .计次循环尾 () 字节数组 [指针] = 位或 (四字节组 [1] × 4, 四字节组 [2] ÷ 16) 字节数组 [指针 + 1] = 位或 (四字节组 [2] × 16, 四字节组 [3] ÷ 4) 字节数组 [指针 + 2] = 位或 (四字节组 [3] × 64, 四字节组 [4]) 指针 = 指针 + 3 .计次循环尾 () 二进制数据 = 到字节集 (字节数组) .如果真 (n < 5) ' 最后一组4字符是提前退出的,截取字节集 n = 5 - n 二进制数据 = 取字节集左边 (二进制数据, 取字节集长度 (二进制数据) - n) .如果真结束 返回 (二进制数据) .子程序 _客户1_连接断开 服务器1.断开客户 (客户) 列表框_加入提示 (“客户被强制离开。”) .子程序 _客户1_数据到达 .局部变量 数据, 字节集 数据 = 客户1.取回数据 () 服务器1.发送数据 (客户, 数据, ) 列表框_加入提示 (“返回数据:” + 到文本 (数据)) .子程序 _按钮_结果_被单击 .局部变量 输出文本, 文本型 输出文本 = “账号:” .如果 (账号 = “”) 输出文本 = 输出文本 + “未拦截到” .否则 输出文本 = 输出文本 + 账号 .如果结束 输出文本 = 输出文本 + #换行符 + “密码:” .如果 (密码 = “”) 输出文本 = 输出文本 + “未拦截到” .否则 输出文本 = 输出文本 + 密码 .如果结束 信息框 (输出文本, 0, ) .子程序 _按钮_重置_被单击 是否为账号 = 假 是否为密码 = 假 列表框_加入提示 (“重置完毕。”) |
运行结果:
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对服务器之家的支持。如果你想了解更多相关内容请查看下面相关链接