Skip to content

Instantly share code, notes, and snippets.

@fank
Last active August 29, 2024 17:52
Show Gist options
  • Select an option

  • Save fank/11127158 to your computer and use it in GitHub Desktop.

Select an option

Save fank/11127158 to your computer and use it in GitHub Desktop.
ArmA 3 / DayZ-Standalone - BattlEye GUID calculation

md5("BE" (2 bytes) + 64-bit SteamID (8 bytes))

std::stringstream bestring;
__int64 steamID = 76561197996545192;
__int8 i = 0, parts[8] = { 0 };
do parts[i++] = steamID & 0xFF;
while (steamID >>= 8);
bestring << "BE";
for (int i = 0; i < sizeof(parts); i++) {
bestring << char(parts[i]);
}
// I used this md5 library http://www.zedwood.com/article/cpp-md5-function
std::cout << md5(bestring.str()) << std::endl;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Int64 SteamId = 76561197996545192;
byte[] parts = { 0x42, 0x45, 0, 0, 0, 0, 0, 0, 0, 0 };
byte counter = 2;
do
{
parts[counter++] = (byte)(SteamId & 0xFF);
} while ((SteamId >>= 8) > 0);
MD5 md5 = new MD5CryptoServiceProvider();
byte[] beHash = md5.ComputeHash(parts);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < beHash.Length; i++)
{
sb.Append(beHash[i].ToString("x2"));
}
Console.Out.WriteLine(sb.ToString());
Console.In.Read();
}
}
}
// Thanks to nano2k
package main
import (
"crypto/md5"
"fmt"
)
func main() {
steamid := 76561197996545192
h := md5.New()
h.Write([]byte("BE"))
for i := 0; i < 8; i++ {
h.Write([]byte{byte(steamid & 0xFF)})
steamid >>= 8
}
fmt.Printf("Battleye GUID: %x", h.Sum(nil))
}
var crypto = require('crypto');
var int64 = require('int64-native');
var md5Hash = crypto.createHash('md5');
var steamId = new int64('76561197996545192'); // The steamid must be a STRING! not a number!
md5Hash.update('BE');
for (var i = 0; i < 8; i++) {
md5Hash.update(String.fromCharCode(steamId.and(0xFF).toNumber()));
steamId = steamId.shiftRight(8);
}
console.log(md5Hash.digest('hex'));
<?php //Cheers Rommel
/* Verify that following value is higher than 2147483647(32bit):
echo PHP_INT_MAX;
*/
$steamID = '76561197996545192';
$temp = '';
for ($i = 0; $i < 8; $i++) {
$temp .= chr($steamID & 0xFF);
$steamID >>= 8;
}
$return = md5('BE' . $temp);
echo $return;
?>
# Thanks to gunlinux
import md5
steamid=76561197996545192
temp = ""
for i in range(8):
temp += chr((steamid & 0xFF))
steamid >>= 8
m = md5.new("BE"+temp)
print m.hexdigest()
-- Microsoft SQL Server
-- https://github.com/Fankserver/Microsoft-SQL-Server-Assemblies/tree/master/BattlEye
SELECT SteamIdToBattlEyeGUID(76561197996545192);
@Lynxaa
Copy link
Copy Markdown

Lynxaa commented Oct 6, 2017

php

function beguid($id) {
	$result = '';
	for ($i = 0; $i < 8; $i++) {		
		$result .= chr(gmp_strval(gmp_and($id, 0xFF)));
		$id = gmp_div($id, gmp_pow(2, 8));
	}
	return md5('BE' . $result);
}

$guid = beguid(gmp_abs(steamid));

@AWildTeddyBear
Copy link
Copy Markdown

AWildTeddyBear commented Mar 29, 2018

Much easier version of the C++ one: (I'm sure it can be simplified even more, not sure. ;P)

std::string computeSteam64BattlEyeGUID(long long steam64ID){
    std::string bestring = "BE";
    for(size_t i = 0; i == 0 || (steam64ID >>= 8); bestring += (steam64ID & 0xFF), ++i);
    return md5(bestring); //http://www.zedwood.com/article/cpp-md5-function
}

@cat24max
Copy link
Copy Markdown

Modern approach to reverse-lookup: https://github.com/Multivit4min/beguid-converter/

@maca134
Copy link
Copy Markdown

maca134 commented Nov 30, 2019

Here is a nodejs implementation that needs no external deps as long as your running +10.4.0

// nodejs +10.4.0
import { createHash } from 'crypto';

const steamId = 76561197996545192n; // cd97cc68c1038b485b081ba2aa3ea6fa
const bytes = [];

for (let i = 0; i < 8; i++) {
	bytes.push(Number((steamId >> (8n * BigInt(i))) & 0xffn));
}

const guid = createHash('md5').update(Buffer.from([0x42, 0x45, ...bytes])).digest('hex');

console.log(guid);

@0FakE
Copy link
Copy Markdown

0FakE commented Sep 3, 2020

Fank, can this be done the other way around to? Like from guid to SteamId?

Yes you can.

Use the free reverse-lookup / converter: https://devt0ols.net/converter

Available on each browser and any mobile device.

Valid lookup values: Steam (Vanity) URL, Steam ID, Steam ID 3, Steam ID 64, BattlEye ID, Bohemia ID


REST API

https://devt0ols.net/converter/?inc=help/api

Example response:

{
  "error": false,
  "result": {
    "steam_url": "https://steamcommunity.com/profiles/76561197960265729",
    "steam_id": "STEAM_0:1:0",
    "steam_id3": "[U:1:1]",
    "steam_id64": "76561197960265729",
    "battleye_id": "74ae012b5407e0a3cc2cd82ec1f8ba7d",
    "bohemia_id": "ccuWIpEIrX_wmD5VsthErf1qNQbEK7IdG6fL1Il4KuA=",
    "requests": 1
  }
}

Discord BOT

https://devt0ols.net/converter/?inc=main/bot

Invitation link: ID Bot

The BOT is able to lookup and convert each of the mentioned values above.

@cat24max
Copy link
Copy Markdown

cat24max commented Sep 3, 2020

There is also the AllianceApps API: https://allianceapps.io/beguid

Or if you would like to host it yourself: https://github.com/Multivit4min/beguid-converter

Edit: Just realized I shared this link already :D

But no, you cannot convert it directly (without a rainbow table).

@ignaciochemes
Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment