目录
3.网站引导:将用户对某个网站的访问引导至一个模拟网站(钓鱼)
一、修改并理解参考代码
1.修改错误
- 提示#include "stdafx.h"找不到并且产生大量错误 ,比如HttpHeader有问题之类
解决方法:
本人使用VS2019,直接将这个头文件从网上下载了一份,放入VS的头文件目录下,在项目上右键打开选项,我的目录是D:\Windows Kits\10\Include\10.0.19041.0\um
另一点需要注意的是在VS中把源文件的后缀改为cpp而不是c
- 提示 E0546 控制传输跳过的实例化:
goto语句的问题,不能在goto语句后面还增加定义,否则会认为没有初始化而报错
解决方法:
把定义语句 HttpHeader* httpHeader = new HttpHeader(); 放在goto之前的位置即可
- 运行报错'gethostbyname': Use getaddrinfo() or GetAddrInfoW) instead or define
_WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated APl warnings
解决方法:
打开项目属性,编辑预处理器定义,增加 _WINSOCK_DEPRECATED_NO_WARNINGS,如图:
- 运行时提示错误:LNK2019无法解析的外部符号WinMain,该符号在函数"int _cdeclinvoke_main(void)" (?invoke_main@@YAHXZ)中被引用
这个问题似乎是c语言运行时找不到适当的程序入口函数,也就是主函数和当前项目不匹配的问题。
解决方法:
将主函数int _tmain(int argc, char * argv[])
直接改为int main()
并且解决方案平台一定选择x64
- VS2019输出控制台中文乱码
记事本里改为ANSI格式,因为VS2019控制台的编码是GBK,而文件可能是UTF-8格式
这里折腾了很久,是因为原来安过的一个拓展,每次强行把文件变为UTF-8,把拓展禁用就好了。
2.基本代理服务器原理
①首先初始化一个套接字(代码中的BOOL InitSocket()函数)
WSAStartup(wVersionRequested, &wsaData);
ProxyServer = socket(AF_INET, SOCK_STREAM, 0); //Socket创建套接字
bind(ProxyServer, (SOCKADDR*)&ProxyServerAddr, sizeof(SOCKADDR)
listen(ProxyServer, SOMAXCONN)
利用 bind() 函数将该套接字与服务器 host 地址绑定,host 地址设为 “127.0.0.1”;
绑定端口号(例如:“10240”)
然后,利用 listen() 函数对该端口进行监听。
②通过accept() 函数,对每个报文的到来请求进行接收和相应,为了提供效率,对每个请求都创建一个新的线程来处理。代理服务器一直循环此段代码,达到不断监听的效果
acceptSocket = accept(ProxyServer, (SOCKADDR*)&acceptAddr, NULL);
lpProxyParam = new ProxyParam;
lpProxyParam->clientSocket = acceptSocket;
//创建新线程
hThread = (HANDLE)_beginthreadex(NULL, 0, &ProxyThread, (LPVOID)lpProxyParam, 0, 0);
CloseHandle(hThread);
Sleep(200);
④接下来进入线程执行函数unsigned int __stdcall ProxyThread(LPVOID lpParameter)
利用 recv() 和 send() 函数,接收来自客户端的 HTTP 请求,并通过代理服务器将该请求转发给服务器;同时,服务器也将获得的响应发给代理服务器,然后代理服务器再