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