Skip to content

Commit 9e864c4

Browse files
committed
Refactor fkhook code
Signed-off-by: xaxys <[email protected]>
1 parent 8d39b23 commit 9e864c4

File tree

4 files changed

+701
-677
lines changed

4 files changed

+701
-677
lines changed

hookdll/Makefile

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
vpath %.cpp ../src
22
cxx = g++
3-
cxxflags = -c -O2 -I ../inc -I ../minhook/include -Wall -Werror
4-
linkflags = -shared -static
3+
cxxflags = -c -O2 -I ../inc -I ../minhook/include -Wall -Werror -Wno-unused-variable
4+
linkflags = -shared -static -l ws2_32 -l iphlpapi
55
linkflags32 = -L ../minhook/lib -l MinHook32
66
linkflags64 = -L ../minhook/lib -l MinHook64
77
cxx32prefix = i686-w64-mingw32-

inc/fakeaddrpool.h

+177
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
#pragma once
2+
3+
#include <sockaddrin.h>
4+
#include <map>
5+
#include <variant>
6+
7+
struct FakeAddrPool {
8+
9+
struct IPv4Addr {
10+
in_addr addr;
11+
12+
IPv4Addr() { memset(&this->addr, 0, sizeof(in_addr)); }
13+
14+
IPv4Addr(const in_addr &addr) : addr(addr) {}
15+
16+
IPv4Addr(ULONG addr) { this->addr.s_addr = addr; }
17+
18+
bool operator<(const IPv4Addr &other) const {
19+
return memcmp(&addr, &other.addr, sizeof(in_addr)) < 0;
20+
}
21+
22+
bool operator==(const IPv4Addr &other) const {
23+
return memcmp(&addr, &other.addr, sizeof(in_addr)) == 0;
24+
}
25+
};
26+
27+
struct IPv6Addr {
28+
in6_addr addr;
29+
30+
IPv6Addr() { memset(&addr, 0, sizeof(in6_addr)); }
31+
32+
IPv6Addr(const in6_addr &addr) : addr(addr) {}
33+
34+
bool operator<(const IPv6Addr &other) const {
35+
return memcmp(&addr, &other.addr, sizeof(in6_addr)) < 0;
36+
}
37+
38+
bool operator==(const IPv6Addr &other) const {
39+
return memcmp(&addr, &other.addr, sizeof(in6_addr)) == 0;
40+
}
41+
};
42+
43+
struct IPAddr {
44+
short family;
45+
std::variant<IPv4Addr, IPv6Addr> ip;
46+
47+
IPAddr() : family(AF_INET), ip(IPv4Addr()) {}
48+
IPAddr(const in_addr &addr) : family(AF_INET), ip(IPv4Addr(addr)) {}
49+
IPAddr(const IPv4Addr &addr) : family(AF_INET), ip(addr) {}
50+
IPAddr(const in6_addr &addr) : family(AF_INET6), ip(IPv6Addr(addr)) {}
51+
IPAddr(const IPv6Addr &addr) : family(AF_INET6), ip(addr) {}
52+
53+
bool operator<(const IPAddr &other) const {
54+
if (family != other.family) {
55+
return family < other.family;
56+
}
57+
if (family == AF_INET) {
58+
return std::get<IPv4Addr>(ip) < std::get<IPv4Addr>(other.ip);
59+
}
60+
return std::get<IPv6Addr>(ip) < std::get<IPv6Addr>(other.ip);
61+
}
62+
63+
bool operator==(const IPAddr &other) const {
64+
if (family != other.family) {
65+
return false;
66+
}
67+
if (family == AF_INET) {
68+
return std::get<IPv4Addr>(ip) == std::get<IPv4Addr>(other.ip);
69+
}
70+
return std::get<IPv6Addr>(ip) == std::get<IPv6Addr>(other.ip);
71+
}
72+
};
73+
74+
std::map<IPv4Addr, IPAddr> fake_to_real;
75+
std::map<IPAddr, IPv4Addr> real_to_fake;
76+
in_addr start;
77+
in_addr end;
78+
in_addr current;
79+
80+
FakeAddrPool(in_addr start, u_long range) {
81+
this->start = start;
82+
this->end = next(start, range);
83+
this->current = start;
84+
}
85+
86+
sockaddr_in get_fake_addr(const SockAddrIn &addr) {
87+
switch (addr.get_family()) {
88+
case AF_INET:
89+
return get_fake_addr(IPv4Addr(addr.addr.addr_v4.sin_addr));
90+
case AF_INET6:
91+
return get_fake_addr(IPv6Addr(addr.addr.addr_v6.sin6_addr));
92+
default:
93+
sockaddr_in fake_addr;
94+
memset(&fake_addr, 0, sizeof(fake_addr));
95+
return fake_addr;
96+
}
97+
}
98+
99+
sockaddr_in get_fake_addr(const sockaddr_in6 *addr) {
100+
return get_fake_addr(IPv6Addr(addr->sin6_addr));
101+
}
102+
103+
sockaddr_in get_fake_addr(const sockaddr_in *addr) {
104+
return get_fake_addr(IPv4Addr(addr->sin_addr));
105+
}
106+
107+
sockaddr_in get_fake_addr(const IPAddr &addr) {
108+
in_addr fake_ip;
109+
if (real_to_fake.count(addr)) {
110+
fake_ip = real_to_fake[addr].addr;
111+
} else {
112+
fake_ip = search_available_addr(current);
113+
IPv4Addr addr4(fake_ip);
114+
real_to_fake[addr] = addr4;
115+
fake_to_real[addr4] = addr;
116+
}
117+
sockaddr_in fake_addr;
118+
memset(&fake_addr, 0, sizeof(fake_addr));
119+
fake_addr.sin_family = AF_INET;
120+
fake_addr.sin_addr = fake_ip;
121+
return fake_addr;
122+
}
123+
124+
SockAddrIn get_origin_addr(const sockaddr_in *addr) {
125+
SockAddrIn origin_addr;
126+
IPv4Addr addr4(addr->sin_addr);
127+
if (fake_to_real.count(addr4)) {
128+
IPAddr addr = fake_to_real[addr4];
129+
switch (addr.family) {
130+
case AF_INET:
131+
origin_addr.addr.addr_v4.sin_family = AF_INET;
132+
origin_addr.addr.addr_v4.sin_addr = std::get<IPv4Addr>(addr.ip).addr;
133+
break;
134+
case AF_INET6:
135+
origin_addr.addr.addr_v6.sin6_family = AF_INET6;
136+
origin_addr.addr.addr_v6.sin6_addr = std::get<IPv6Addr>(addr.ip).addr;
137+
break;
138+
}
139+
}
140+
return origin_addr;
141+
}
142+
143+
bool has_origin_addr(const sockaddr_in *addr) {
144+
return fake_to_real.count(IPv4Addr(addr->sin_addr));
145+
}
146+
147+
in_addr search_available_addr(in_addr search_start) {
148+
if (!fake_to_real.count(IPv4Addr(search_start))) {
149+
return search_start;
150+
}
151+
in_addr addr = next(search_start);
152+
while (memcmp(&addr, &search_start, sizeof(in_addr)) != 0) {
153+
if (!fake_to_real.count(IPv4Addr(addr))) {
154+
return addr;
155+
}
156+
addr = next(addr);
157+
if (memcmp(&addr, &search_start, sizeof(in_addr)) == 0) {
158+
addr = start;
159+
}
160+
}
161+
return search_start;
162+
}
163+
164+
in_addr next(const in_addr &addr, int step = 1) {
165+
ULONG hl = (ULONG)addr.S_un.S_un_b.s_b1 << 24 |
166+
(ULONG)addr.S_un.S_un_b.s_b2 << 16 |
167+
(ULONG)addr.S_un.S_un_b.s_b3 << 8 |
168+
(ULONG)addr.S_un.S_un_b.s_b4;
169+
hl += step;
170+
in_addr next_addr;
171+
next_addr.S_un.S_un_b.s_b1 = (unsigned char)(hl >> 24);
172+
next_addr.S_un.S_un_b.s_b2 = (unsigned char)(hl >> 16);
173+
next_addr.S_un.S_un_b.s_b3 = (unsigned char)(hl >> 8);
174+
next_addr.S_un.S_un_b.s_b4 = (unsigned char)hl;
175+
return next_addr;
176+
}
177+
};

inc/sockaddrin.h

+155
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
#pragma once
2+
3+
#include <winsock2.h>
4+
#include <ws2ipdef.h>
5+
#include <ws2tcpip.h>
6+
#include <string>
7+
8+
namespace std {
9+
static inline std::string to_string(const struct in_addr &addr) {
10+
char str[INET_ADDRSTRLEN];
11+
memset(str, 0, sizeof(str));
12+
inet_ntop(AF_INET, &addr, str, sizeof(str));
13+
return str;
14+
}
15+
16+
static inline std::string to_string(const struct in6_addr &addr) {
17+
char str[INET6_ADDRSTRLEN];
18+
memset(str, 0, sizeof(str));
19+
inet_ntop(AF_INET6, &addr, str, sizeof(str));
20+
return str;
21+
}
22+
23+
static inline std::string to_string(const struct sockaddr_in &addr) {
24+
return to_string(addr.sin_addr) + ":" +
25+
to_string(ntohs(addr.sin_port));
26+
}
27+
28+
static inline std::string to_string(const struct sockaddr_in6 &addr) {
29+
return to_string(addr.sin6_addr) + ":" +
30+
to_string(ntohs(addr.sin6_port));
31+
}
32+
}
33+
34+
struct SockAddrIn {
35+
union {
36+
sockaddr_in addr_v4;
37+
sockaddr_in6 addr_v6;
38+
} addr;
39+
40+
SockAddrIn() {
41+
memset(&addr, 0, sizeof(addr));
42+
}
43+
44+
static SockAddrIn from_socket(SOCKET sock) {
45+
SockAddrIn addr_in;
46+
if (sock == INVALID_SOCKET) return addr_in;
47+
int namelen = sizeof(addr_in.addr);
48+
getsockname(sock, (sockaddr *)&addr_in.addr, &namelen);
49+
return addr_in;
50+
}
51+
52+
static SockAddrIn from_sockaddr(const sockaddr *addr) {
53+
SockAddrIn addr_in;
54+
if (!addr) return addr_in;
55+
memcpy(&addr_in.addr, addr, get_len(addr->sa_family));
56+
return addr_in;
57+
}
58+
59+
static SockAddrIn from_addr(const char *addr) {
60+
SockAddrIn addr_in;
61+
from_addr(addr, &addr_in);
62+
return addr_in;
63+
}
64+
65+
static bool from_addr(const char *addr, SockAddrIn *addr_in) {
66+
struct addrinfo hints, *res;
67+
memset(&hints, 0, sizeof(hints));
68+
hints.ai_family = AF_UNSPEC; // 不指定是IPv4还是IPv6
69+
70+
int err = getaddrinfo(addr, NULL, &hints, &res);
71+
if (err != 0) {
72+
return false;
73+
}
74+
75+
int len = get_len(res->ai_family);
76+
memcpy(&addr_in->addr, res->ai_addr, len);
77+
freeaddrinfo(res);
78+
return len > 0;
79+
}
80+
81+
sockaddr *get_sockaddr() const {
82+
return (sockaddr *)&addr;
83+
}
84+
85+
u_short get_family() const {
86+
return get_sockaddr()->sa_family;
87+
}
88+
89+
int get_len() const {
90+
return get_len(get_family());
91+
}
92+
93+
static int get_len(u_short family) {
94+
switch (family) {
95+
case AF_INET:
96+
return sizeof(sockaddr_in);
97+
case AF_INET6:
98+
return sizeof(sockaddr_in6);
99+
default:
100+
return 0;
101+
}
102+
}
103+
104+
std::string get_ip() const {
105+
u_short family = get_family();
106+
switch (family) {
107+
case AF_INET:
108+
return std::to_string(addr.addr_v4.sin_addr);
109+
case AF_INET6:
110+
return std::to_string(addr.addr_v6.sin6_addr);
111+
default:
112+
return "";
113+
}
114+
}
115+
116+
u_short get_port_raw() const {
117+
u_short family = get_family();
118+
switch (family) {
119+
case AF_INET:
120+
return addr.addr_v4.sin_port;
121+
case AF_INET6:
122+
return addr.addr_v6.sin6_port;
123+
default:
124+
return 0;
125+
}
126+
}
127+
128+
void set_family(u_short family) {
129+
get_sockaddr()->sa_family = family;
130+
}
131+
132+
void set_ip_any() {
133+
u_short family = get_family();
134+
if (family == AF_INET) {
135+
addr.addr_v4.sin_addr.s_addr = INADDR_ANY;
136+
} else if (family == AF_INET6) {
137+
addr.addr_v6.sin6_addr = in6addr_any;
138+
}
139+
}
140+
141+
void set_port_raw(u_short port) {
142+
u_short family = get_family();
143+
if (family == AF_INET) {
144+
addr.addr_v4.sin_port = port;
145+
} else if (family == AF_INET6) {
146+
addr.addr_v6.sin6_port = port;
147+
}
148+
}
149+
};
150+
151+
namespace std {
152+
static inline std::string to_string(const SockAddrIn &addr) {
153+
return addr.get_ip() + ":" + std::to_string(ntohs(addr.get_port_raw()));
154+
}
155+
}

0 commit comments

Comments
 (0)