Skip to content

Commit 5e28ae2

Browse files
committed
=
1 parent b396a0c commit 5e28ae2

4 files changed

Lines changed: 142 additions & 20 deletions

File tree

doc/gdb-guide.txt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
https://web.stanford.edu/class/archive/cs/cs107/cs107.1202/resources/gdb
2+
https://www-users.cse.umn.edu/~kauffman/tutorials/gdb
3+
https://beej.us/guide/bggdb/
4+
https://web.stanford.edu/class/archive/cs/cs107/cs107.1234/resources/gdb_refcard.pdf
5+
https://sourceware.org/gdb/current/onlinedocs/gdb.html/TUI.html
6+
7+
gdb基本命令行
8+
up
9+
当你出现段错误时,一般程序会停住,停住的位置常常是在其他库的源码中,特别是标准库
10+
例如,std::string,这样的报错信息对我们没多大用,可以使用up,来向上跳出当前栈,进而跳到我们的代码处
11+
https://discover.cs.ucsb.edu/commonerrors/tutorial/gdbtutorial.html
12+
print <name>
13+
打印变量值,print this print *this 等
14+
info sources [regx]
15+
列出当前关联的源文件,可以跟正则表达式匹配
16+
17+
save breakpoints bkp
18+
保存断点信息到文件bkp,下次启动时使用-x选项加载
19+
gdb -x filename <program>

src/https/mitm_svc.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
#include <spdlog/spdlog.h>
99
#include <asio/buffer.hpp>
1010
#include <asio/bind_executor.hpp>
11-
#include "mitm_svc.h"
1211

1312
#include <openssl/x509.h>
1413
#include <openssl/x509v3.h>

test/ssl/ssl_handshake.cpp

Lines changed: 117 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,137 @@
1-
#include <asio/ssl/stream.hpp>
1+
// BUG 复现三次校验证书
2+
3+
#include <asio/ssl.hpp>
24
#include <asio/ip/tcp.hpp>
35
#include <asio/awaitable.hpp>
46
#include <asio/use_awaitable.hpp>
7+
#include <asio/co_spawn.hpp>
8+
#include <asio/detached.hpp>
9+
#include <asio/connect.hpp>
10+
#include <asio/buffer.hpp>
511

612
#include <spdlog/spdlog.h>
713

8-
#include <print>
14+
#include <regex>
15+
#include <optional>
16+
#include <string>
17+
#include <string_view>
18+
#include <format>
19+
#include <iostream>
920

1021
using namespace asio;
1122
using tcp_socket_co = use_awaitable_t<>::as_default_on_t<ip::tcp::socket>;
12-
using ssl_stream_co=ssl::stream<tcp_socket_co>;
23+
using tcp_resolver_co = asio::use_awaitable_t<>::as_default_on_t<ip::tcp::resolver>;
24+
using ssl_stream_co = ssl::stream<tcp_socket_co>;
1325

1426
// namespace log = spdlog;
1527

16-
int main(int argc,char ** argv){
28+
struct endpoint
29+
{
30+
std::string host;
31+
std::string port;
32+
};
1733

18-
if(argc!=2){
19-
std::println("Usage: {} <hostname>", argv[0]);
20-
return 1;
34+
inline std::optional<endpoint> check_http_url(std::string url)
35+
{
36+
// thread_local static std::regex re{R"(^https?://([^/]+)/.*)"};
37+
thread_local static std::regex re{R"((https?)://([^/]+)(?::(\d+))?(/.*)?)"};
38+
std::smatch sm;
39+
endpoint ep{};
40+
if (std::regex_search(url, sm, re))
41+
{
42+
auto protocol = sm[1].str();
43+
ep.host = sm[2].str();
44+
if (sm[3].matched)
45+
{
46+
ep.port = sm[3].str();
47+
}
48+
else
49+
{
50+
if (protocol.size() == 5)
51+
{
52+
ep.port = "443";
53+
}
54+
else
55+
{
56+
ep.port = "80";
57+
}
58+
}
59+
return ep;
2160
}
61+
return std::nullopt;
62+
}
63+
64+
int main(int argc, char **argv)
65+
{
66+
67+
if (argc != 2)
68+
{
69+
spdlog::info("Usage: {} <http url>", argv[0]);
70+
return -1;
71+
}
72+
73+
io_context io_context;
74+
75+
auto task = [&io_context, url = argv[1]]() -> asio::awaitable<void>
76+
{
77+
auto ep = check_http_url(url);
78+
if (!ep)
79+
{
80+
spdlog::error("Invalid url: {}", url);
81+
co_return;
82+
}
83+
asio::ssl::context ctx{asio::ssl::context::sslv23};
84+
// ctx.set_verify_mode(ssl::verify_peer);
85+
// ctx.set_default_verify_paths();
86+
87+
ssl_stream_co ssl_socket{io_context, ctx};
88+
ssl_socket.set_verify_mode(ssl::verify_peer);
89+
ssl_socket.set_verify_callback(
90+
[host = ep->host](auto ok, auto &v_ctx)
91+
{
92+
// auto res=ssl::host_name_verification(host)(ok, v_ctx);
93+
// spdlog::info("{} verify result: {}",host, res);
94+
// return res;
95+
spdlog::info("{} verify result: {}", host, true);
96+
return true;
97+
});
98+
99+
auto &socket = ssl_socket.lowest_layer();
100+
101+
// tcp_socket_co socket(io_context);
102+
103+
tcp_resolver_co resolver(io_context);
104+
auto ip_list = co_await resolver.async_resolve(ep->host, ep->port);
105+
co_await async_connect(socket, ip_list, use_awaitable, 0);
22106

23-
asio::io_context io_context;
107+
// ssl_stream_co ssl_socket{std::move(socket), ctx};
24108

25-
asio::ssl::context ctx{asio::ssl::context::tlsv12};
26-
ctx.set_verify_mode(ssl::verify_peer);
27-
ctx.set_default_verify_paths();
109+
co_await ssl_socket.async_handshake(ssl::stream_base::client);
110+
co_await async_write(ssl_socket, buffer(std::format("GET / HTTP/1.0\r\nHost: {}\r\n\r\n", ep->host)));
28111

29-
ssl_stream_co ssl_socket{io_context, ctx};
112+
char bf[512];
113+
while (true)
114+
{
115+
try
116+
{
117+
auto rn = co_await ssl_socket.async_read_some(buffer(bf));
30118

31-
119+
if (rn == 0)
120+
{
121+
spdlog::info("断开连接 ");
122+
break;
123+
}
124+
std::cout << std::string_view{bf, rn};
125+
}
126+
catch (std::exception &e)
127+
{
128+
spdlog::info("异常 {}", e.what());
129+
break;
130+
}
131+
}
132+
spdlog::info("退出");
133+
};
134+
co_spawn(io_context, task, detached);
135+
io_context.run();
32136
return 0;
33137
}

xmake.lua

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -107,12 +107,12 @@ target_end()
107107
-- add_files("test/src/a.cpp",{defines = "DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN"})
108108
-- add_tests("a_test")
109109

110-
-- target("handshake_test")
111-
-- add_packages("spdlog")
112-
-- add_packages("asio")
113-
-- add_packages(openssl_package_name)
114-
-- add_files("test/ssl/ssl_handshake.cpp")
115-
-- add_tests("handshake_test")
110+
target("handshake_test")
111+
add_packages("spdlog")
112+
add_packages("asio")
113+
add_packages(openssl_package_name)
114+
add_files("test/ssl/ssl_handshake.cpp")
115+
add_tests("handshake_test")
116116

117117
-- 打包源码
118118
-- includes("@builtin/xpack")

0 commit comments

Comments
 (0)