NodeJS - Steam Sentry Login

JERR0W

Faultier
1 Jul 2016
3,242
2,667
#1
Heyo,

ich sitz hier schon ne weile und zerbrech mir den Kopf, wo genau der Fehler sitzt.. er ignoriert konstant meinen Sentry, welchen in in der DB ablege.. vielleicht kann mir ja jemand helfen?

Hier der Code:

Code:
const Steam = require('steam');
const mysql = require('mysql');
const crypto = require('crypto');

let accounts = [];
const delay = 50;

const db = mysql.createConnection({
  host: '127.0.0.1',
  user: 'xxx',
  password: 'xxx',
  database: 'xxx'
});

db.connect(err => {
  if (err) {
    console.error("[mysql] Can't connect to server:\n%s", err.stack);
    return process.exit();
  }
  console.log('[mysql] Connected successfully');
});

db.query('SELECT * FROM hourboost', (err, rows) => {
  if (err) return console.error('[mysql] Failed to run query:\n%s', err.stack);

  accounts = [];
  rows.forEach(row => {
    console.log(row);
    accounts.push([row.username, row.password, row.games, row.steamguard, row.sentry]);
  });
  console.log('Loaded %s account(s)', accounts.length);

  accounts.forEach((account, i) => {
    const steamClient = new Steam.SteamClient();
    const steamUser = new Steam.SteamUser(steamClient);
    const steamFriends = new Steam.SteamFriends(steamClient);

    setTimeout(() => {
      console.log('[%s] - Logging in.', account[0]);
      steamClient.connect();
      const sentry = account[4] === null ? null : new Buffer(account[4], 'base64');
      steamClient.on('connected', () => {
        steamUser.logOn({
          account_name: account[0],
          password: account[1],
          auth_code: account[3],
          sha_sentryfile: sentry
        });
      });

      const getGameList = games => {
        const str = games.split(',');
        const final = [];
        for (const game of str) final.push({ game_id: parseInt(game) });
        return final;
      };

      steamClient.on('logOnResponse', logonResp => {
        console.log(logonResp);
        if (logonResp.eresult == Steam.EResult.OK) {
          console.log('[%s] - Logged in.', account[0]);
          steamFriends.setPersonaState(Steam.EPersonaState.Online);
          steamUser.gamesPlayed(getGameList(account[2]));
          console.log('[%s] - Active Games and online status set. (%s)', account[0], JSON.stringify(account[2]));
        }
      });

      steamUser.on('updateMachineAuth', sentryData => {
        if (account[4] !== null) return;
        const sentry = sentryData.bytes.toString('base64');
        db.query('UPDATE hourboost SET sentry = ? WHERE username = ?', [sentry, account[0]], (err, rows, fields) => {
          if (err) return console.error('[mysql] Failed to update account:\n%s', err.stack);
        });
        console.log('[mysql] Added Sentry to account!');
      });

      steamClient.on('error', err => {
        console.log(err);
        console.log('[%s] - error: %s (Reconnecting in 5 minutes)', account[0], err.message);
        setTimeout(function() {
          console.log('[%s] - Reconnecting...', account[0]);
          steamClient.connect();
        }, 5 * 60000);
      });
    }, delay * i);
  });
});
 

frk

The Senate
6 Nov 2010
2,374
2,556
#6
Nicht wirklich hilfreich.
Naja dann geh und probier rum bis es klappt und erwarte nicht das andere dir die Arbeit abnehmen.

Dein Code ist wegen den Callbacks unübersichtlich des Todes, ich blick da als jemand der sich mit JS eigentlich gut auskennt kaum durch und hätte nicht den geringsten Bock da jetzt nach dem Bug zu suchen.

Viel Glück!
 

JERR0W

Faultier
1 Jul 2016
3,242
2,667
#7
Naja dann geh und probier rum bis es klappt und erwarte nicht das andere dir die Arbeit abnehmen.

Dein Code ist wegen den Callbacks unübersichtlich des Todes, ich blick da als jemand der sich mit JS eigentlich gut auskennt kaum durch und hätte nicht den geringsten Bock da jetzt nach dem Bug zu suchen.

Viel Glück!
Hier die relevanten Codezeilen.

PS: Es geht nicht um Arbeit abnehmen, sondern den Fehler finden.. ich probier schon die ganze Zeit rum. Wenn ich es hinkriegen würde, würde ich definitiv hier nicht im Forum rumfragen. Normalerweise SOLLTE es so funktionieren, nur mit dem Unterschied, dass ich den String in ner SQL DB ablege, anstatt in einer file.

Hab mich hier an die Codes gehalten: https://github.com/seishun/node-steam/issues/20

PHP:
    setTimeout(() => {
      console.log('[%s] - Logging in.', account[0]);
      steamClient.connect();
      const sentry = account[4] === null ? null : new Buffer(account[4], 'base64');
      steamClient.on('connected', () => {
        steamUser.logOn({
          account_name: account[0],
          password: account[1],
          auth_code: account[3],
          sha_sentryfile: sentry
        });
      });
PHP:
      steamUser.on('updateMachineAuth', sentryData => {
        if (account[4] !== null) return;
        const sentry = sentryData.bytes.toString('base64');
        db.query('UPDATE hourboost SET sentry = ? WHERE username = ?', [sentry, account[0]], (err, rows, fields) => {
          if (err) return console.error('[mysql] Failed to update account:\n%s', err.stack);
        });
        console.log('[mysql] Added Sentry to account!');
      });
 

frk

The Senate
6 Nov 2010
2,374
2,556
#8
Ich verstehe nicht mal warum du so ein komisches Konstrukt mit setTimeout bastelst. Du hast irgendwie den Sinn von asynchronen Funktionen nicht verstanden.
 
Likes: rn_

frk

The Senate
6 Nov 2010
2,374
2,556
#10
Ansonsten weiß ich wo dein Fehler liegt, schau dir an wie ich es mache und versuche rauszufinden wo dein Fehler liegt (ist ziemlich offensichtlich):

https://github.com/frk1/steamhourboostv2/blob/master/lib/user.js

Ich kann allerdings nur jedem davon abraten deinen Freeservice zu usen - Mal abgesehen von der Vertrauensfrage (die sich bei Accountsachen immer stellt) hast du auch offenbar keine Ahnung was du da bastelst und man darf von Sicherheitsproblemen von der Größe eines Scheunentors ausgehen :wink:
 

thepapanoob

Well-Known Member
22 Oct 2015
359
359
#11
Ansonsten weiß ich wo dein Fehler liegt, schau dir an wie ich es mache und versuche rauszufinden wo dein Fehler liegt (ist ziemlich offensichtlich):

https://github.com/frk1/steamhourboostv2/blob/master/lib/user.js

Ich kann allerdings nur jedem davon abraten deinen Freeservice zu usen - Mal abgesehen von der Vertrauensfrage (die sich bei Accountsachen immer stellt) hast du auch offenbar keine Ahnung was du da bastelst und man darf von Sicherheitsproblemen von der Größe eines Scheunentors ausgehen :wink:
ganz abgesehen davon das accounts gesperrt werden wenn man falsch hourboostet
 

JERR0W

Faultier
1 Jul 2016
3,242
2,667
#12
Ansonsten weiß ich wo dein Fehler liegt, schau dir an wie ich es mache und versuche rauszufinden wo dein Fehler liegt (ist ziemlich offensichtlich):

https://github.com/frk1/steamhourboostv2/blob/master/lib/user.js

Ich kann allerdings nur jedem davon abraten deinen Freeservice zu usen - Mal abgesehen von der Vertrauensfrage (die sich bei Accountsachen immer stellt) hast du auch offenbar keine Ahnung was du da bastelst und man darf von Sicherheitsproblemen von der Größe eines Scheunentors ausgehen :wink:
Sehe nicht wirklich n großen Unterschied.
 

JERR0W

Faultier
1 Jul 2016
3,242
2,667
#14
Fehler gefunden...

es lag am Callback, welcher beim Sentry-Generate nicht vorhanden war und das ich beim Login nicht den SHA1 vom Sentry abgefragt habe, sondern den base64-String.
 
6 Jan 2017
410
534
#15
Ist mein Script also rechtfertige ich mich hier mal.
Ich verstehe nicht mal warum du so ein komisches Konstrukt mit setTimeout bastelst.
Ist dafür gedacht, die DoS- / Bruteforce-Protection seitens Steam nicht zu triggeren, die anspringt, wenn man sich mit einigen Accounts gleichzeitig einloggt. Benutze das Ding selbst mit etwa 200 accs.

Code:
var delay = 50;

accounts.forEach(function(account, i) {
    setTimeout(function() {
        console.log("[%s] - Logging in.", account[0]);
    }, delay * i);
})
Damit wartet er jeweils 50ms, bevor er sich in den nächsten Account einloggt, ohne rekursive Scheiße zu brauchen. (Das wäre, wenn z.B. loginNext(); am Ende loginNext(); aufrufen würde)

ganz abgesehen davon das accounts gesperrt werden wenn man falsch hourboostet
Das wäre mir jetzt neu, weiß nur das Steam durchaus mal Comm.-Bans raushaut, wenn sie denken das du Accounts crackst oder sonstige Scheiße mit Steam treibst. Hat aber nichts mit "falsch" hourboosten zu tun

Ich kann allerdings nur jedem davon abraten deinen Freeservice zu usen - Mal abgesehen von der Vertrauensfrage (die sich bei Accountsachen immer stellt) hast du auch offenbar keine Ahnung was du da bastelst und man darf von Sicherheitsproblemen von der Größe eines Scheunentors ausgehen :wink:
In dem was ich gesehen habe (hauptsächlich Panel-Login) hab ich kaum Sicherheitslücken gefunden (genutzt werden prepared Statements, password_hash, Code is gut lesbar, ...)
 

frk

The Senate
6 Nov 2010
2,374
2,556
#17
Ist dafür gedacht, die DoS- / Bruteforce-Protection seitens Steam nicht zu triggeren, die anspringt, wenn man sich mit einigen Accounts gleichzeitig einloggt. Benutze das Ding selbst mit etwa 200 accs.
Wenn du so viele Accs hast das du in die Limits von Steam rennst wäre das benutzen mehrerer dedizierter Adressen die bessere Lösung.

Aber auch dieses Delay-Konstrukt kann man mit Promises und z.B. bluebird viel viel eleganter lösen.

Hier mal als Beispiel mein alter privater Reportbot, wegen dem Steam-API Limit maximal 100 Accounts gleichzeitig und wenn einer fertig ist stößt er automatisch den nächsten an, so dass immer maximal 100 Accounts gleichzeitig was machen:

Code:
Promise.map(accs, acc =>
  acc.reportPlayer(cl.target.getSteamID64(), matchid)
  .then(details => true)
  .catch(err => false)
, {concurrency: 100})
Trotzdem sind sicherheitsrelevante Tools von Leuten die nicht einmal die Grundzüge der Progammiersprache verstehen immer ein Glücksspiel...
 
Likes: JERR0W

JERR0W

Faultier
1 Jul 2016
3,242
2,667
#18
Wenn du so viele Accs hast das du in die Limits von Steam rennst wäre das benutzen mehrerer dedizierter Adressen die bessere Lösung.

Aber auch dieses Delay-Konstrukt kann man mit Promises und z.B. bluebird viel viel eleganter lösen.

Hier mal als Beispiel mein alter privater Reportbot, wegen dem Steam-API Limit maximal 100 Accounts gleichzeitig und wenn einer fertig ist stößt er automatisch den nächsten an, so dass immer maximal 100 Accounts gleichzeitig was machen:

Code:
Promise.map(accs, acc =>
  acc.reportPlayer(cl.target.getSteamID64(), matchid)
  .then(details => true)
  .catch(err => false)
, {concurrency: 100})
Ich werde mich demnächst mit Promises mal auseinandersetzen. Bin halt aktuell im Lernprozess.. bin bei weitem noch nicht gut, bin froh wenn ich was lernen kann. Eigentlich wars gestern gut, dass du mir die Lösung nicht auf dem Präsentierteller geliefert hast, denn dadurch habe ich gelernt, woran es liegt. Auch wenn mir dein Code nicht wirklich weitergeholfen hat^^
 

nicxio

Advanced Member
23 Apr 2011
1,862
1,455
#19
Wenn du so viele Accs hast das du in die Limits von Steam rennst wäre das benutzen mehrerer dedizierter Adressen die bessere Lösung.

Aber auch dieses Delay-Konstrukt kann man mit Promises und z.B. bluebird viel viel eleganter lösen.

Hier mal als Beispiel mein alter privater Reportbot, wegen dem Steam-API Limit maximal 100 Accounts gleichzeitig und wenn einer fertig ist stößt er automatisch den nächsten an, so dass immer maximal 100 Accounts gleichzeitig was machen:

Code:
Promise.map(accs, acc =>
  acc.reportPlayer(cl.target.getSteamID64(), matchid)
  .then(details => true)
  .catch(err => false)
, {concurrency: 100})
Trotzdem sind sicherheitsrelevante Tools von Leuten die nicht einmal die Grundzüge der Progammiersprache verstehen immer ein Glücksspiel...
man hatt ja genug :grin:
 
Likes: JERR0W