1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
#pragma once
#include <cstdint>
#include <algorithm>
#include <vector>
using ByteArray = std::vector<uint8_t>;
namespace Login
{
// Login header that is sent over to the server
struct RemoteLoginHeader
{
// The first four bytes are encoded by the client.
// This will carry the client version which can be checked.
uint32_t m_ClientHeader;
// The username is raw text.
// TODO: Hash the password client-side.
char m_Username[128];
char m_Password[128];
// This will provide the hardware ID of the machine.
uint32_t m_HardwareId;
// These fields will be set according
// to security check results.
uint8_t m_IntegrityBit1; // Detour detected on NTDLL function
uint8_t m_IntegrityBit2; // Detour detected on dummy function
uint8_t m_IntegrityBit3; // Virtual machine/Debugger detected
uint8_t m_IntegrityBit4; // m_IntegrityBit1 | m_IntegrityBit2 | m_IntegrityBit3 (checksum)
};
// Possible server responses
// The hardware ID is encoded (XORed with the message ID) within the message for
// shadow ban/forum ban purposes. :)
enum RemoteLoginResponse : uint8_t
{
OUTDATED_CLIENT = 'A', // '[000A:{HWID}] Your client is outdated. Please download the latest client at 'moneybot.cc'.'
ACCESS_AUTHORISED = 'B', // Allows the user to continue with injection.
INVALID_CREDENTIALS = 'C', // '[000C:{HWID}] Your credentials are invalid. Please check your spelling and try again.'
USER_BANNED = 'D', // '[000D:{HWID}] Your account is banned. Please contact 'admin@moneybot.cc' for additional information.'
INVALID_HARDWARE = 'E', // '[000E:{HWID}] Please contact an administrator to request a hardware ID reset.'
INTEGRITY_FAILURE = 'F', // '[000F:{HWID}] Failed to verify session. Please contact an administrator.' AKA the 'shadow ban', blacklists user from loader but not from forums.
NO_SUBSCRIPTION = 'G', // '[000G:{HWID}] No active subscription.'
ACCESS_SPECIAL_USER = 'H', // Allows the user to continue, sets the m_SpecialAccess var
};
// Runs the security checks and creates the login header to send to the server.
class RemoteLoginTransaction
{
RemoteLoginHeader m_Header;
public:
// Initialises the header.
void Start(const char *Username, const char *Password);
// Obtains the hardware ID of the current machine in use.
// TODO: HWID
// Translates server response, determines whether or not the
// user can access the client. NOTE: Server will drop the client if
// the response is not ACCESS_AUTHORISED.
bool TranslateResponse(ByteArray &RawResponse);
ByteArray GetHeader()
{
ByteArray Header;
// Copy header to the ByteArray.
Header.insert(
Header.begin(),
(uint8_t *)&m_Header,
(uint8_t *)&m_Header + sizeof RemoteLoginHeader
);
return Header;
}
};
}
|