· 7 years ago · Nov 17, 2018, 01:02 AM
1 Go to file root/intrologin.py
2
3Look for:
4
5"WRONGPWD" : localeInfo.LOGIN_FAILURE_WRONG_PASSWORD,
6
7Add this bellow:
8
9"HWBANNED" : "Login from this computer has been blocked",
10
11
12
13Client source
14
15Go to UserInterface/AccountConnector.cpp
16
17Look for:
18
19bool CAccountConnector::__AuthState_RecvEmpty()
20{
21 BYTE byEmpty;
22 Recv (sizeof (BYTE), &byEmpty);
23 return true;
24}
25
26Add this bellow:
27
28//hardware ban revised
29#include <intrin.h>
30#include <Iphlpapi.h>
31#pragma comment(lib, "iphlpapi.lib")
32const char* GetMacAddress() {
33 PIP_ADAPTER_INFO AdapterInfo;
34 DWORD dwBufLen = sizeof(AdapterInfo);
35 char *mac_addr = (char*)malloc(17);
36
37 AdapterInfo = (IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO));
38 if (!AdapterInfo) {
39 return "";
40 }
41 if (GetAdaptersInfo(AdapterInfo, &dwBufLen) == ERROR_BUFFER_OVERFLOW) {
42
43 AdapterInfo = (IP_ADAPTER_INFO *)malloc(dwBufLen);
44 if (!AdapterInfo) {
45 return "";
46 }
47 }
48
49 CHAR _MACFORMAT[] = { '%', '0', '2', 'X', ':', '%', '0', '2', 'X', ':', '%', '0', '2', 'X', ':', '%', '0', '2', 'X', ':', '%', '0', '2', 'X', ':', '%', '0', '2', 'X', 0x0 }; //"%02X:%02X:%02X:%02X:%02X:%02X"
50 if (GetAdaptersInfo(AdapterInfo, &dwBufLen) == NO_ERROR) {
51 PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo;
52 do {
53 sprintf(mac_addr, _MACFORMAT,
54 pAdapterInfo->Address[0], pAdapterInfo->Address[1],
55 pAdapterInfo->Address[2], pAdapterInfo->Address[3],
56 pAdapterInfo->Address[4], pAdapterInfo->Address[5]);
57 return mac_addr;
58
59 pAdapterInfo = pAdapterInfo->Next;
60 } while (pAdapterInfo);
61 }
62 free(AdapterInfo);
63 return NULL;
64}
65//hardware ban revised
66
67Inside:
68
69bool CAccountConnector::__AuthState_RecvPhase()
70
71Look for:
72
73 strncpy (LoginPacket.name, m_strID.c_str(), ID_MAX_NUM);
74 strncpy (LoginPacket.pwd, m_strPassword.c_str(), PASS_MAX_NUM);
75
76Add this bellow:
77
78 //hardware ban revised
79 strncpy(LoginPacket.cHWInfo, GetMacAddress(), sizeof(LoginPacket.cHWInfo) - 1);
80 //hardware ban revised
81
82
83
84Look for:
85
86 LoginPacket.name[ID_MAX_NUM] = '\0';
87 LoginPacket.pwd[PASS_MAX_NUM] = '\0';
88
89Add this bellow:
90
91 //hardware ban revised
92 LoginPacket.cHWInfo[255] = '\0';
93 //hardware ban revised
94
95
96
97Go to file UserInterface/Packet.h
98
99Look for:
100
101typedef struct command_login3 {
102 BYTE header;
103 char name[ID_MAX_NUM + 1];
104 char pwd[PASS_MAX_NUM + 1];
105 DWORD adwClientKey[4];
106} TPacketCGLogin3;
107
108Replace with:
109
110typedef struct command_login3 {
111 BYTE header;
112 char name[ID_MAX_NUM + 1];
113 char pwd[PASS_MAX_NUM + 1];
114 DWORD adwClientKey[4];
115 char cHWInfo[255 + 1]; //hardware ban revised
116} TPacketCGLogin3;
117
118
119
120Game source
121
122Go to file game/Packet.h
123
124Look for:
125
126typedef struct command_login3
127{
128 BYTE header;
129 char login[LOGIN_MAX_LEN + 1];
130 char passwd[PASSWD_MAX_LEN + 1];
131 DWORD adwClientKey[4];
132} TPacketCGLogin3;
133
134Replace with:
135
136typedef struct command_login3
137{
138 BYTE header;
139 char login[LOGIN_MAX_LEN + 1];
140 char passwd[PASSWD_MAX_LEN + 1];
141 DWORD adwClientKey[4];
142 char cHWInfo[255 + 1]; // hardware ban revised
143} TPacketCGLogin3;
144
145
146
147Go to file game/input_auth.cpp
148
149Look for:
150
151 if (false == FN_IS_VALID_LOGIN_STRING (login)) {
152 sys_log (0, "InputAuth::Login : IS_NOT_VALID_LOGIN_STRING(%s) desc %p",
153 login, get_pointer (d));
154 LoginFailure (d, "NOID");
155 return;
156 }
157
158Add this bellow:
159
160 //hardware ban revised
161 char query[1024];
162 snprintf(query, sizeof(query),"SELECT hwid FROM account.hwid_ban WHERE hwid = '%s'", pinfo->cHWInfo);
163 std::auto_ptr<SQLMsg> execquery(DBManager::instance().DirectQuery(query));
164
165 if (execquery->Get()->uiNumRows >= 1)
166 {
167 LoginFailure(d, "HWBANNED");
168 return;
169 }
170 //hardware ban revised
171
172
173
174Go to file game/db.cpp
175
176Look for:
177
178 char szQuery[1024];
179 snprintf (szQuery, sizeof (szQuery), "UPDATE account SET last_play=NOW() WHERE id=%u", dwID);
180 std::auto_ptr<SQLMsg> msg (DBManager::instance().DirectQuery (szQuery));
181
182Add this bellow:
183
184 //hardware ban revised
185 char szHwid[255 * 2 + 1];
186 DBManager::instance().EscapeString(szHwid, sizeof(szHwid), pinfo->cHWInfo, strlen(pinfo->cHWInfo));
187 char szQuery2[1024];
188 snprintf (szQuery2, sizeof (szQuery2), "UPDATE account SET hwid='%s' WHERE id=%u", szHwid, dwID); //Updates hwid of the account
189 std::auto_ptr<SQLMsg> msg2 (DBManager::instance().DirectQuery (szQuery2));
190 //hardware ban revised
191
192
193
194Run this queries inside account database:
195
196DROP TABLE IF EXISTS `hwid_ban`;
197CREATE TABLE `hwid_ban` (
198 `id` int(11) NOT NULL AUTO_INCREMENT,
199 `hwid` varchar(255) DEFAULT NULL,
200 PRIMARY KEY (`id`)
201) ENGINE=MyISAM DEFAULT CHARSET=latin1;
202
203ALTER TABLE `account` ADD COLUMN `hwid` text DEFAULT NULL;