@bdsx/anticrasher
Version:
simple anti-crasher
106 lines • 10.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Counter = exports.anticrasher = void 0;
const networkidentifier_1 = require("bdsx/bds/networkidentifier");
const packetids_1 = require("bdsx/bds/packetids");
const packets_1 = require("bdsx/bds/packets");
const common_1 = require("bdsx/common");
const core_1 = require("bdsx/core");
const event_1 = require("bdsx/event");
const nativetype_1 = require("bdsx/nativetype");
const pointer_1 = require("bdsx/pointer");
const prochacker_1 = require("bdsx/prochacker");
const counter_1 = require("./counter");
Object.defineProperty(exports, "Counter", { enumerable: true, get: function () { return counter_1.Counter; } });
const event_2 = require("./event");
Object.defineProperty(exports, "anticrasher", { enumerable: true, get: function () { return event_2.anticrasher; } });
{
console.log("[ANTICRASHER] allocated", " - mdisprgm".blue);
event_1.events.serverOpen.on(() => {
console.log("[ANTICRASHER] launching", " - mdisprgm".blue);
});
event_1.events.serverClose.on(() => {
console.log("[ANTICRASHER] closed", " - mdisprgm".blue);
});
}
core_1.ipfilter.setTrafficLimit(1024 * 1024);
core_1.ipfilter.setTrafficLimitPeriod(3600);
const InvalidSoundsCounter = new counter_1.Counter(3, 3);
const FoodSpammerCounter = new counter_1.Counter(3, 3);
const IllegalPositionsCounter = new counter_1.Counter(3, 0);
// invalid sound events
{
event_1.events.packetBefore(packetids_1.MinecraftPacketIds.LevelSoundEvent).on((pkt, ni) => {
if ([12, 26, 35, 42].includes(pkt.sound))
return;
return InvalidSoundsCounter.enter(ni, event_2.anticrasher.Crashers.InvalidSounds);
});
}
// invalid eating food
{
event_1.events.packetBefore(packetids_1.MinecraftPacketIds.ActorEvent).on((pkt, ni) => {
const action = pkt.event;
if (action !== packets_1.ActorEventPacket.Events.EatingItem)
return;
return FoodSpammerCounter.enter(ni, event_2.anticrasher.Crashers.FoodSpammer);
});
}
// invalid positions
{
event_1.events.packetBefore(packetids_1.MinecraftPacketIds.PlayerAuthInput).on((pkt, ni) => {
switch (true) {
case pkt.moveX > 0x3fffffff:
case pkt.moveZ > 0x3fffffff:
case pkt.pos.x > 0x3fffffff:
case pkt.pos.y > 0x3fffffff:
case pkt.pos.z > 0x3fffffff:
IllegalPositionsCounter.addBanned(ni, event_2.anticrasher.Crashers.IllegalPositions);
return common_1.CANCEL;
default:
}
});
}
{
const WrongSkinBlocker = new counter_1.Counter(70, 2);
event_1.events.packetRaw(packetids_1.MinecraftPacketIds.PlayerSkin).on((ptr, size, ni, id) => {
if (size < 0x400) {
WrongSkinBlocker.enter(ni, event_2.anticrasher.Crashers.InvalidSkin);
return common_1.CANCEL;
}
});
}
{
const disconnectConnection = prochacker_1.procHacker.js("?disconnect@NetworkConnection@@QEAAXXZ", nativetype_1.void_t, null, networkidentifier_1.NetworkConnection);
const counter = {};
const receivePacket = prochacker_1.procHacker.hooking("?receivePacket@NetworkConnection@@QEAA?AW4DataStatus@NetworkPeer@@AEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAVNetworkSystem@@AEBV?$shared_ptr@V?$time_point@Usteady_clock@chrono@std@@V?$duration@_JU?$ratio@$00$0DLJKMKAA@@std@@@23@@chrono@std@@@5@@Z", nativetype_1.int32_t, // DataStatus
null, networkidentifier_1.NetworkConnection, pointer_1.CxxStringWrapper, networkidentifier_1.NetworkHandler, core_1.VoidPointer)((conn, stream, networkHandler, time_point) => {
const ni = conn.networkIdentifier;
const addr = ni.getAddress();
const id = stream.valueptr.getUint8();
if (counter[addr] > 1 || id === packetids_1.MinecraftPacketIds.PurchaseReceipt) {
event_2.anticrasher.crasherDetected.fire(new event_2.CrasherDetectedEvent(undefined, ni, event_2.anticrasher.Crashers.DisallowedPacket));
disconnectConnection(conn);
return 1;
}
if (id === 0) {
counter[addr] = counter[addr] ? counter[addr] + 1 : 1;
}
return receivePacket(conn, stream, networkHandler, time_point);
});
}
{
//
// example_and_test/vulnerabilities.ts
//
event_1.events.packetRaw(packetids_1.MinecraftPacketIds.ClientCacheBlobStatus).on((ptr, size, netId) => {
if (ptr.readVarUint() >= 0xfff || ptr.readVarUint() >= 0xfff) {
console.log(("DOS (ClientCacheBlobStatus) detected from " + netId).red);
return common_1.CANCEL;
}
});
event_1.events.packetBefore(packetids_1.MinecraftPacketIds.Disconnect).on((pkt, ni) => {
if (ni.getActor() == null)
return common_1.CANCEL;
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxrRUFBK0U7QUFDL0Usa0RBQXdEO0FBQ3hELDhDQUFvRDtBQUNwRCx3Q0FBcUM7QUFDckMsb0NBQWtEO0FBQ2xELHNDQUFvQztBQUNwQyxnREFBa0Q7QUFDbEQsMENBQWdEO0FBQ2hELGdEQUE2QztBQUM3Qyx1Q0FBb0M7QUF3R2Qsd0ZBeEdiLGlCQUFPLE9Bd0dhO0FBdkc3QixtQ0FBNEQ7QUF1R25ELDRGQXZHQSxtQkFBVyxPQXVHQTtBQXJHcEI7SUFDSSxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzRCxjQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUU7UUFDdEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0QsQ0FBQyxDQUFDLENBQUM7SUFDSCxjQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUU7UUFDdkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUQsQ0FBQyxDQUFDLENBQUM7Q0FDTjtBQUVELGVBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3RDLGVBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUVyQyxNQUFNLG9CQUFvQixHQUFHLElBQUksaUJBQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0MsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLGlCQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzdDLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxpQkFBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENB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