Browse Source

添加项目文件。

master
niushuai233 3 years ago
parent
commit
043781989d
  1. 18
      App.config
  2. BIN
      Assets/Image/steam-token.ico
  3. BIN
      Assets/Image/steam-token.png
  4. 14
      Entity/Config.cs
  5. 24
      Entity/SteamGuard.cs
  6. 4
      FodyWeavers.xml
  7. 215
      MainForm.Designer.cs
  8. 93
      MainForm.cs
  9. 362
      MainForm.resx
  10. 25
      Program.cs
  11. 36
      Properties/AssemblyInfo.cs
  12. 91
      Properties/Resources.Designer.cs
  13. 131
      Properties/Resources.resx
  14. 29
      Properties/Settings.Designer.cs
  15. 7
      Properties/Settings.settings
  16. 136
      UI/AboutForm.Designer.cs
  17. 32
      UI/AboutForm.cs
  18. 356
      UI/AboutForm.resx
  19. 135
      UI/Set/GuardConfig.Designer.cs
  20. 95
      UI/Set/GuardConfig.cs
  21. 126
      UI/Set/GuardConfig.resx
  22. 52
      UI/Set/ProgramConfig.Designer.cs
  23. 20
      UI/Set/ProgramConfig.cs
  24. 120
      UI/Set/ProgramConfig.resx
  25. 63
      Util/ConfigUtil.cs
  26. 69
      Util/SteamGuardCalcThread.cs
  27. 107
      Util/SteamTwoFactorToken.cs
  28. 47
      XXXSteamTwoFactorToken.cs
  29. 56
      packages.config
  30. 276
      steam-token.csproj
  31. BIN
      steam-token.ico
  32. 25
      steam-token.sln

18
App.config

@ -0,0 +1,18 @@ @@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="IKVM.Runtime" publicKeyToken="13235d27fcbfff58" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-8.2.0.0" newVersion="8.2.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="IKVM.OpenJDK.Core" publicKeyToken="13235d27fcbfff58" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-7.2.4630.5" newVersion="7.2.4630.5" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

BIN
Assets/Image/steam-token.ico

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
Assets/Image/steam-token.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

14
Entity/Config.cs

@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace steam_token.Entity
{
public class Config
{
public SteamGuard SteamGuard { get; set; }
}
}

24
Entity/SteamGuard.cs

@ -0,0 +1,24 @@ @@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace steam_token.Entity
{
public class SteamGuard
{
public string shared_secret { get; set; }
public string serial_number { get; set; }
public string revocation_code { get; set; }
public string uri { get; set; }
public string server_time { get; set; }
public string account_name { get; set; }
public string token_gid { get; set; }
public string identity_secret { get; set; }
public string secret_1 { get; set; }
public string status { get; set; }
public string steamguard_scheme { get; set; }
public string steamid { get; set; }
}
}

4
FodyWeavers.xml

@ -0,0 +1,4 @@ @@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
<Costura />
</Weavers>

215
MainForm.Designer.cs generated

@ -0,0 +1,215 @@ @@ -0,0 +1,215 @@

namespace steam_token
{
partial class mainForm
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(mainForm));
this.menuStrip = new System.Windows.Forms.MenuStrip();
this.SettingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.GuardToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ProgramToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.AboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.progressBar_refresh = new System.Windows.Forms.ProgressBar();
this.groupBox_display = new System.Windows.Forms.GroupBox();
this.label_guard = new System.Windows.Forms.Label();
this.button_recalc = new System.Windows.Forms.Button();
this.button_copy = new System.Windows.Forms.Button();
this.comboBox1 = new System.Windows.Forms.ComboBox();
this.timer_time = new System.Windows.Forms.Timer(this.components);
this.label_datetime = new System.Windows.Forms.Label();
this.menuStrip.SuspendLayout();
this.groupBox_display.SuspendLayout();
this.SuspendLayout();
//
// menuStrip
//
this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.SettingToolStripMenuItem,
this.AboutToolStripMenuItem});
this.menuStrip.Location = new System.Drawing.Point(0, 0);
this.menuStrip.Name = "menuStrip";
this.menuStrip.Size = new System.Drawing.Size(644, 25);
this.menuStrip.TabIndex = 0;
this.menuStrip.Text = "menuStrip1";
//
// SettingToolStripMenuItem
//
this.SettingToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.GuardToolStripMenuItem,
this.ProgramToolStripMenuItem});
this.SettingToolStripMenuItem.Name = "SettingToolStripMenuItem";
this.SettingToolStripMenuItem.Size = new System.Drawing.Size(44, 21);
this.SettingToolStripMenuItem.Text = "设置";
//
// GuardToolStripMenuItem
//
this.GuardToolStripMenuItem.Name = "GuardToolStripMenuItem";
this.GuardToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.GuardToolStripMenuItem.Text = "令牌配置";
this.GuardToolStripMenuItem.Click += new System.EventHandler(this.GuardToolStripMenuItem_Click);
//
// ProgramToolStripMenuItem
//
this.ProgramToolStripMenuItem.Name = "ProgramToolStripMenuItem";
this.ProgramToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.ProgramToolStripMenuItem.Text = "程序设置";
this.ProgramToolStripMenuItem.Visible = false;
this.ProgramToolStripMenuItem.Click += new System.EventHandler(this.ProgramToolStripMenuItem_Click);
//
// AboutToolStripMenuItem
//
this.AboutToolStripMenuItem.Name = "AboutToolStripMenuItem";
this.AboutToolStripMenuItem.Size = new System.Drawing.Size(44, 21);
this.AboutToolStripMenuItem.Text = "关于";
this.AboutToolStripMenuItem.Click += new System.EventHandler(this.AboutToolStripMenuItem_Click);
//
// progressBar_refresh
//
this.progressBar_refresh.BackColor = System.Drawing.SystemColors.Control;
this.progressBar_refresh.ForeColor = System.Drawing.SystemColors.Control;
this.progressBar_refresh.Location = new System.Drawing.Point(12, 28);
this.progressBar_refresh.Maximum = 30;
this.progressBar_refresh.Name = "progressBar_refresh";
this.progressBar_refresh.Size = new System.Drawing.Size(620, 23);
this.progressBar_refresh.TabIndex = 2;
this.progressBar_refresh.Value = 30;
//
// groupBox_display
//
this.groupBox_display.Controls.Add(this.label_guard);
this.groupBox_display.Location = new System.Drawing.Point(13, 57);
this.groupBox_display.Name = "groupBox_display";
this.groupBox_display.Size = new System.Drawing.Size(620, 313);
this.groupBox_display.TabIndex = 3;
this.groupBox_display.TabStop = false;
this.groupBox_display.Text = "Steam Guard";
//
// label_guard
//
this.label_guard.Font = new System.Drawing.Font("微软雅黑", 72F);
this.label_guard.ForeColor = System.Drawing.Color.DodgerBlue;
this.label_guard.Location = new System.Drawing.Point(6, 25);
this.label_guard.Name = "label_guard";
this.label_guard.Size = new System.Drawing.Size(608, 299);
this.label_guard.TabIndex = 1;
this.label_guard.Text = "令二哈";
this.label_guard.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// button_recalc
//
this.button_recalc.Location = new System.Drawing.Point(428, 384);
this.button_recalc.Name = "button_recalc";
this.button_recalc.Size = new System.Drawing.Size(99, 30);
this.button_recalc.TabIndex = 4;
this.button_recalc.Text = "重新计算";
this.button_recalc.UseVisualStyleBackColor = true;
this.button_recalc.Click += new System.EventHandler(this.button_recalc_Click);
//
// button_copy
//
this.button_copy.Location = new System.Drawing.Point(534, 384);
this.button_copy.Name = "button_copy";
this.button_copy.Size = new System.Drawing.Size(99, 30);
this.button_copy.TabIndex = 4;
this.button_copy.Text = "复制";
this.button_copy.UseVisualStyleBackColor = true;
this.button_copy.Click += new System.EventHandler(this.button_copy_Click);
//
// comboBox1
//
this.comboBox1.FormattingEnabled = true;
this.comboBox1.Location = new System.Drawing.Point(199, 385);
this.comboBox1.Name = "comboBox1";
this.comboBox1.Size = new System.Drawing.Size(223, 29);
this.comboBox1.TabIndex = 5;
this.comboBox1.Visible = false;
//
// timer_time
//
this.timer_time.Tick += new System.EventHandler(this.timer_time_Tick);
//
// label_datetime
//
this.label_datetime.AutoSize = true;
this.label_datetime.Location = new System.Drawing.Point(12, 389);
this.label_datetime.Name = "label_datetime";
this.label_datetime.Size = new System.Drawing.Size(105, 21);
this.label_datetime.TabIndex = 6;
this.label_datetime.Text = " ";
//
// mainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(644, 425);
this.Controls.Add(this.label_datetime);
this.Controls.Add(this.comboBox1);
this.Controls.Add(this.button_copy);
this.Controls.Add(this.button_recalc);
this.Controls.Add(this.groupBox_display);
this.Controls.Add(this.progressBar_refresh);
this.Controls.Add(this.menuStrip);
this.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MainMenuStrip = this.menuStrip;
this.Margin = new System.Windows.Forms.Padding(5);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "mainForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Steam令牌计算器";
this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.mainForm_FormClosed);
this.menuStrip.ResumeLayout(false);
this.menuStrip.PerformLayout();
this.groupBox_display.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.MenuStrip menuStrip;
private System.Windows.Forms.ToolStripMenuItem SettingToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem AboutToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem GuardToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ProgramToolStripMenuItem;
private System.Windows.Forms.ProgressBar progressBar_refresh;
private System.Windows.Forms.GroupBox groupBox_display;
private System.Windows.Forms.Button button_recalc;
private System.Windows.Forms.Button button_copy;
private System.Windows.Forms.ComboBox comboBox1;
private System.Windows.Forms.Label label_guard;
private System.Windows.Forms.Timer timer_time;
private System.Windows.Forms.Label label_datetime;
}
}

93
MainForm.cs

@ -0,0 +1,93 @@ @@ -0,0 +1,93 @@
using steam_token.Entity;
using steam_token.UI;
using steam_token.UI.Set;
using steam_token.Util;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Util;
namespace steam_token
{
public partial class mainForm : Form
{
public mainForm()
{
InitializeComponent();
this.timer_time.Start();
// 先计算一次
this.label_guard.Text = CalcOnce();
// 新开一个线程去初始化数据
SteamGuardCalcThread.StartThread(this.label_guard, this.progressBar_refresh);
}
/// <summary>
/// 打开令牌配置页面
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void GuardToolStripMenuItem_Click(object sender, EventArgs e)
{
GuardConfig guard = new GuardConfig();
guard.ShowDialog(this);
}
/// <summary>
/// 打开程序设置页面
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ProgramToolStripMenuItem_Click(object sender, EventArgs e)
{
ProgramConfig program = new ProgramConfig();
program.ShowDialog(this);
}
private void button_recalc_Click(object sender, EventArgs e)
{
this.label_guard.Text = CalcOnce();
SteamGuardCalcThread.StartThread(this.label_guard, this.progressBar_refresh);
}
private string CalcOnce()
{
Config config = ConfigUtil.Read<Config>();
string guard = SteamTwoFactorToken.GenerateSteamGuardCode(config.SteamGuard.shared_secret);
Console.WriteLine("guard = " + guard);
return guard;
}
private void button_copy_Click(object sender, EventArgs e)
{
Clipboard.SetDataObject(this.label_guard.Text);
}
private void timer_time_Tick(object sender, EventArgs e)
{
this.label_datetime.Text = DateTime.Now.ToString();
}
private void mainForm_FormClosed(object sender, FormClosedEventArgs e)
{
Environment.Exit(0);
}
private void AboutToolStripMenuItem_Click(object sender, EventArgs e)
{
AboutForm about = new AboutForm();
about.ShowDialog(this);
}
}
}

362
MainForm.resx

@ -0,0 +1,362 @@ @@ -0,0 +1,362 @@
<?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.Runtime.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:import namespace="http://www.w3.org/XML/1998/namespace" />
<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" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</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" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="menuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="timer_time.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>130, 17</value>
</metadata>
<metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
</root>

25
Program.cs

@ -0,0 +1,25 @@ @@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using Util;
namespace steam_token
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Control.CheckForIllegalCrossThreadCalls = false;
ConfigUtil.Init(new steam_token.Entity.Config());
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new mainForm());
}
}
}

36
Properties/AssemblyInfo.cs

@ -0,0 +1,36 @@ @@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("steam-token")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("steam-token")]
[assembly: AssemblyCopyright("Copyright © 2022")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("26555785-e311-4f28-a28d-dd96b3165b98")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

91
Properties/Resources.Designer.cs generated

@ -0,0 +1,91 @@ @@ -0,0 +1,91 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace steam_token.Properties {
using System;
/// <summary>
/// 一个强类型的资源类,用于查找本地化的字符串等。
/// </summary>
// 此类是由 StronglyTypedResourceBuilder
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目。
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// 返回此类使用的缓存的 ResourceManager 实例。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("steam_token.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// 重写当前线程的 CurrentUICulture 属性,对
/// 使用此强类型资源类的所有资源查找执行重写。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// 查找类似 SteamGuard 的本地化字符串。
/// </summary>
internal static string CONFIG_FOLDER {
get {
return ResourceManager.GetString("CONFIG_FOLDER", resourceCulture);
}
}
/// <summary>
/// 查找类似 config.json 的本地化字符串。
/// </summary>
internal static string CONFIG_NAME {
get {
return ResourceManager.GetString("CONFIG_NAME", resourceCulture);
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap steam_token {
get {
object obj = ResourceManager.GetObject("steam_token", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
}
}

131
Properties/Resources.resx

@ -0,0 +1,131 @@ @@ -0,0 +1,131 @@
<?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.Runtime.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:import namespace="http://www.w3.org/XML/1998/namespace" />
<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" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</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" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="CONFIG_FOLDER" xml:space="preserve">
<value>SteamGuard</value>
</data>
<data name="CONFIG_NAME" xml:space="preserve">
<value>config.json</value>
<comment>配置文件</comment>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="steam_token" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Assets\Image\steam-token.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

29
Properties/Settings.Designer.cs generated

@ -0,0 +1,29 @@ @@ -0,0 +1,29 @@
//------------------------------------------------------------------------------
// <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>
//------------------------------------------------------------------------------
namespace steam_token.Properties
{
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default
{
get
{
return defaultInstance;
}
}
}
}

7
Properties/Settings.settings

@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

136
UI/AboutForm.Designer.cs generated

@ -0,0 +1,136 @@ @@ -0,0 +1,136 @@

namespace steam_token.UI
{
partial class AboutForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutForm));
this.label1 = new System.Windows.Forms.Label();
this.linkLabel_openurl = new System.Windows.Forms.LinkLabel();
this.label2 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.button_about_confirm = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(105, 30);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(286, 21);
this.label1.TabIndex = 0;
this.label1.Text = "Steam令牌计算器 v1.0 @niushuai233";
//
// linkLabel_openurl
//
this.linkLabel_openurl.AutoSize = true;
this.linkLabel_openurl.LinkBehavior = System.Windows.Forms.LinkBehavior.NeverUnderline;
this.linkLabel_openurl.Location = new System.Drawing.Point(105, 115);
this.linkLabel_openurl.Name = "linkLabel_openurl";
this.linkLabel_openurl.Size = new System.Drawing.Size(390, 21);
this.linkLabel_openurl.TabIndex = 1;
this.linkLabel_openurl.TabStop = true;
this.linkLabel_openurl.Text = "https://github.com/niushuai233/steam-token-win";
this.linkLabel_openurl.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel_openurl_LinkClicked);
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(21, 115);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(78, 21);
this.label2.TabIndex = 2;
this.label2.Text = "开源地址:";
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(105, 70);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(72, 21);
this.label3.TabIndex = 3;
this.label3.Text = "欢迎Star";
//
// pictureBox1
//
this.pictureBox1.InitialImage = global::steam_token.Properties.Resources.steam_token;
this.pictureBox1.Location = new System.Drawing.Point(24, 20);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(75, 75);
this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.pictureBox1.TabIndex = 4;
this.pictureBox1.TabStop = false;
//
// button_about_confirm
//
this.button_about_confirm.Location = new System.Drawing.Point(394, 156);
this.button_about_confirm.Name = "button_about_confirm";
this.button_about_confirm.Size = new System.Drawing.Size(90, 32);
this.button_about_confirm.TabIndex = 5;
this.button_about_confirm.Text = "关闭";
this.button_about_confirm.UseVisualStyleBackColor = true;
this.button_about_confirm.Click += new System.EventHandler(this.button_about_confirm_Click);
//
// AboutForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(496, 200);
this.Controls.Add(this.button_about_confirm);
this.Controls.Add(this.pictureBox1);
this.Controls.Add(this.label3);
this.Controls.Add(this.label2);
this.Controls.Add(this.linkLabel_openurl);
this.Controls.Add(this.label1);
this.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Margin = new System.Windows.Forms.Padding(5);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "AboutForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "关于";
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label label1;
private System.Windows.Forms.LinkLabel linkLabel_openurl;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.Button button_about_confirm;
}
}

32
UI/AboutForm.cs

@ -0,0 +1,32 @@ @@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace steam_token.UI
{
public partial class AboutForm : Form
{
public AboutForm()
{
InitializeComponent();
// 初始化图片
this.pictureBox1.Image = Properties.Resources.steam_token;
}
private void button_about_confirm_Click(object sender, EventArgs e)
{
this.Close();
}
private void linkLabel_openurl_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
System.Diagnostics.Process.Start(this.linkLabel_openurl.Text);
}
}
}

356
UI/AboutForm.resx

@ -0,0 +1,356 @@ @@ -0,0 +1,356 @@
<?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.Runtime.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:import namespace="http://www.w3.org/XML/1998/namespace" />
<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" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</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" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
</root>

135
UI/Set/GuardConfig.Designer.cs generated

@ -0,0 +1,135 @@ @@ -0,0 +1,135 @@

namespace steam_token.UI.Set
{
partial class GuardConfig
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.button_confirm = new System.Windows.Forms.Button();
this.openFileDialog_steam = new System.Windows.Forms.OpenFileDialog();
this.textBox_shared_secret = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.button_openfile = new System.Windows.Forms.Button();
this.label2 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// button_confirm
//
this.button_confirm.Location = new System.Drawing.Point(451, 97);
this.button_confirm.Name = "button_confirm";
this.button_confirm.Size = new System.Drawing.Size(85, 30);
this.button_confirm.TabIndex = 1;
this.button_confirm.Text = "确定";
this.button_confirm.UseVisualStyleBackColor = true;
this.button_confirm.Click += new System.EventHandler(this.button_confirm_Click);
//
// openFileDialog_steam
//
this.openFileDialog_steam.FileName = "openFileDialog1";
this.openFileDialog_steam.Title = "请选择Steam令牌文件";
//
// textBox_shared_secret
//
this.textBox_shared_secret.Location = new System.Drawing.Point(16, 59);
this.textBox_shared_secret.Name = "textBox_shared_secret";
this.textBox_shared_secret.Size = new System.Drawing.Size(428, 29);
this.textBox_shared_secret.TabIndex = 2;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(12, 9);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(363, 21);
this.label1.TabIndex = 3;
this.label1.Text = "请输入位于Steam令牌文件中的[shared_secret]值";
//
// button_openfile
//
this.button_openfile.Location = new System.Drawing.Point(451, 59);
this.button_openfile.Name = "button_openfile";
this.button_openfile.Size = new System.Drawing.Size(85, 30);
this.button_openfile.TabIndex = 1;
this.button_openfile.Text = "选择文件";
this.button_openfile.UseVisualStyleBackColor = true;
this.button_openfile.Click += new System.EventHandler(this.button_openfile_Click);
//
// label2
//
this.label2.AutoSize = true;
this.label2.Font = new System.Drawing.Font("微软雅黑", 9F);
this.label2.ForeColor = System.Drawing.Color.Red;
this.label2.Location = new System.Drawing.Point(13, 36);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(462, 17);
this.label2.TabIndex = 4;
this.label2.Text = "/data/data/com.valvesoftware.android.steam.community/files/Steamguard-xxx";
//
// label3
//
this.label3.AutoSize = true;
this.label3.Font = new System.Drawing.Font("微软雅黑", 10F);
this.label3.Location = new System.Drawing.Point(16, 101);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(309, 20);
this.label3.TabIndex = 5;
this.label3.Text = "Tips: 手机需root或者能通过备份手段拿到该文件";
//
// GuardConfig
//
this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(539, 132);
this.Controls.Add(this.label3);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.textBox_shared_secret);
this.Controls.Add(this.button_openfile);
this.Controls.Add(this.button_confirm);
this.Font = new System.Drawing.Font("微软雅黑", 12F);
this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "GuardConfig";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "令牌配置";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button button_confirm;
private System.Windows.Forms.OpenFileDialog openFileDialog_steam;
private System.Windows.Forms.TextBox textBox_shared_secret;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Button button_openfile;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label3;
}
}

95
UI/Set/GuardConfig.cs

@ -0,0 +1,95 @@ @@ -0,0 +1,95 @@
using Newtonsoft.Json;
using steam_token.Entity;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Util;
namespace steam_token.UI.Set
{
public partial class GuardConfig : Form
{
private SteamGuard steamGuard;
public GuardConfig()
{
InitializeComponent();
// 先初始化组件 再使用
Config config = ConfigUtil.Read<Config>();
steamGuard = config.SteamGuard;
if (null != steamGuard && !string.IsNullOrEmpty(steamGuard.shared_secret))
{
this.textBox_shared_secret.Text = steamGuard.shared_secret;
}
}
private void button_openfile_Click(object sender, EventArgs e)
{
this.openFileDialog_steam.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
if (this.openFileDialog_steam.ShowDialog() == DialogResult.OK)
{
ReadFile(this.openFileDialog_steam.FileName);
}
}
private void ReadFile(string fileName)
{
FileInfo file = new FileInfo(fileName);
if (!file.Exists)
{
MessageBox.Show("文件" + fileName + "不存在");
}
if (file.Length > 1024 * 2)
{
MessageBox.Show("文件大小错误, 鉴定为不合适的文件");
}
byte[] bytes = File.ReadAllBytes(fileName);
string fileStr = Encoding.UTF8.GetString(bytes);
ParseSteamGuard(fileStr);
}
private void ParseSteamGuard(string fileStr)
{
try
{
steamGuard = JsonConvert.DeserializeObject<SteamGuard>(fileStr);
Console.WriteLine(steamGuard);
this.textBox_shared_secret.Text = steamGuard.shared_secret;
}
catch (JsonReaderException)
{
MessageBox.Show("文件内容不符合要求, 请不要修改拷贝出来的文件");
}
catch (Exception)
{
MessageBox.Show("未知异常, 请通知作者, 感谢!");
}
}
private void button_confirm_Click(object sender, EventArgs e)
{
if (null == steamGuard)
{
MessageBox.Show("熬, 未知操作!!!");
return;
}
Config config = ConfigUtil.Read<Config>();
config.SteamGuard = steamGuard;
ConfigUtil.Save<Config>(config);
this.Dispose();
}
}
}

126
UI/Set/GuardConfig.resx

@ -0,0 +1,126 @@ @@ -0,0 +1,126 @@
<?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.Runtime.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:import namespace="http://www.w3.org/XML/1998/namespace" />
<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" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</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" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="openFileDialog_steam.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
</root>

52
UI/Set/ProgramConfig.Designer.cs generated

@ -0,0 +1,52 @@ @@ -0,0 +1,52 @@

namespace steam_token.UI.Set
{
partial class ProgramConfig
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.SuspendLayout();
//
// ProgramConfig
//
this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(539, 294);
this.Font = new System.Drawing.Font("微软雅黑", 12F);
this.Margin = new System.Windows.Forms.Padding(5);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "ProgramConfig";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "设置";
this.ResumeLayout(false);
}
#endregion
}
}

20
UI/Set/ProgramConfig.cs

@ -0,0 +1,20 @@ @@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace steam_token.UI.Set
{
public partial class ProgramConfig : Form
{
public ProgramConfig()
{
InitializeComponent();
}
}
}

120
UI/Set/ProgramConfig.resx

@ -0,0 +1,120 @@ @@ -0,0 +1,120 @@
<?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.Runtime.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:import namespace="http://www.w3.org/XML/1998/namespace" />
<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" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</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" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

63
Util/ConfigUtil.cs

@ -0,0 +1,63 @@ @@ -0,0 +1,63 @@
using Newtonsoft.Json;
using steam_token.Entity;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Util
{
public class ConfigUtil
{
public static string CONFIG_NAME = steam_token.Properties.Resources.CONFIG_NAME;
public static string CONFIG_FOLDER = steam_token.Properties.Resources.CONFIG_FOLDER;
public static void Init<T>(T t)
{
string configPath = GetConfigPath();
if (File.Exists(configPath))
{
return;
}
File.WriteAllText(configPath, JsonConvert.SerializeObject(t));
}
public static T Read<T>()
{
string json = File.ReadAllText(GetConfigPath());
try
{
return JsonConvert.DeserializeObject<T>(json);
}
catch (Exception)
{
MessageBox.Show("配置文件内容异常, 请检查", json);
}
return default;
}
public static void Save<T>(T config)
{
if (null == config)
{
return;
}
File.WriteAllText(GetConfigPath(), JsonConvert.SerializeObject(config));
}
private static string GetConfigPath()
{
string folder = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "/niushuai233/" + CONFIG_FOLDER;
if (!Directory.Exists(folder))
{
Directory.CreateDirectory(folder);
}
return folder + "/" + CONFIG_NAME;
}
}
}

69
Util/SteamGuardCalcThread.cs

@ -0,0 +1,69 @@ @@ -0,0 +1,69 @@
using steam_token.Entity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Util;
namespace steam_token.Util
{
public class SteamGuardCalcThread
{
private static Thread thread;
private static Label label_guard;
private static ProgressBar progressBar_refresh;
internal static void StartThread(Label label, ProgressBar progressBar)
{
label_guard = label;
progressBar_refresh = progressBar;
StartThread();
}
private static void StartThread()
{
if (thread != null && thread.IsAlive)
{
// 先停止原先的线程
thread.Abort();
Console.WriteLine("中止线程");
}
// 等1s 保证停止
// Thread.Sleep(1000);
// 初始化线程
thread = new Thread(Calc);
thread.Name = "SteamGuardCalcThread";
// 开启线程
thread.Start();
}
private static void Calc()
{
Config config = ConfigUtil.Read<Config>();
string shared_secret = config.SteamGuard.shared_secret;
if (string.IsNullOrEmpty(shared_secret))
{
Console.WriteLine("未发现配置的秘钥");
return;
}
for (int i = 30; i >= 0; i--)
{
Thread.Sleep(1000);
if (i == 0)
{
string guard = SteamTwoFactorToken.GenerateSteamGuardCode(shared_secret);
label_guard.Text = guard;
i = 30;
Console.WriteLine("重新设值: " + guard);
}
progressBar_refresh.Value = i;
}
}
}
}

107
Util/SteamTwoFactorToken.cs

@ -0,0 +1,107 @@ @@ -0,0 +1,107 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace steam_token.Util
{
public class SteamTwoFactorToken
{
private static byte[] s_rgchSteamguardCodeChars = { 50, 51, 52, 53, 54, 55, 56, 57, 66, 67, 68, 70, 71, 72, 74, 75, 77, 78, 80, 81, 82, 84, 86, 87, 88, 89 };
private byte[] mSecret;
public SteamTwoFactorToken(String sharedSecret)
{
if (!string.IsNullOrEmpty(sharedSecret))
{
this.mSecret = Convert.FromBase64String(sharedSecret);
}
else
{
MessageBox.Show("未知的shared_secret");
}
}
public static string GenerateSteamGuardCode(String sharedSecret)
{
return new SteamTwoFactorToken(sharedSecret).GenerateSteamGuardCode();
}
public string GenerateSteamGuardCode()
{
return GenerateSteamGuardCodeForTime(CurrentTime());
}
private string GenerateSteamGuardCodeForTime(long calcTime)
{
if (this.mSecret == null)
{
return "";
}
byte[] bArr = new byte[8];
long j2 = calcTime / 30;
int i = 8;
while (true)
{
int i2 = i - 1;
if (i <= 0)
{
break;
}
bArr[i2] = (byte)((int)j2);
j2 = RightMove(j2, 8);
i = i2;
}
HMACSHA1 hmacsha1 = new HMACSHA1();
hmacsha1.Key = (this.mSecret);
byte[] doFinal = hmacsha1.ComputeHash(bArr);
int i3 = doFinal[19] & 15;
int i4 = (doFinal[i3 + 3] & 255) | ((doFinal[i3 + 2] & 255) << 8) | ((doFinal[i3] & 127) << 24) | ((doFinal[i3 + 1] & 255) << 16);
byte[] bArr2 = new byte[5];
for (int i5 = 0; i5 < 5; i5++)
{
byte[] bArr3 = s_rgchSteamguardCodeChars;
bArr2[i5] = bArr3[i4 % bArr3.Length];
i4 /= bArr3.Length;
}
return System.Text.Encoding.UTF8.GetString(bArr2);
}
public long CurrentTime()
{
return DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() / 1000;
}
/// <summary>
/// 无符号右移, 相当于java里的 value>>>pos
/// </summary>
/// <param name="value"></param>
/// <param name="pos"></param>
/// <returns></returns>
public long RightMove(long value, int pos)
{
//移动 0 位时直接返回原值
if (pos != 0)
{
// int.MaxValue = 0x7FFFFFFF 整数最大值
int mask = int.MaxValue;
//无符号整数最高位不表示正负但操作数还是有符号的,有符号数右移1位,正数时高位补0,负数时高位补1
value = value >> 1;
//和整数最大值进行逻辑与运算,运算后的结果为忽略表示正负值的最高位
value = value & mask;
//逻辑运算后的值无符号,对无符号的值直接做右移运算,计算剩下的位
value = value >> pos - 1;
}
return value;
}
}
}

47
XXXSteamTwoFactorToken.cs

@ -0,0 +1,47 @@ @@ -0,0 +1,47 @@
using steam_token.Entity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Util;
namespace steam_token
{
public class XXXSteamTwoFactorToken
{
private static byte[] s_rgchSteamguardCodeChars = { 50, 51, 52, 53, 54, 55, 56, 57, 66, 67, 68, 70, 71, 72, 74, 75, 77, 78, 80, 81, 82, 84, 86, 87, 88, 89 };
private byte[] mSecret;
public XXXSteamTwoFactorToken(String sharedSecret)
{
if (string.IsNullOrEmpty(sharedSecret))
{
this.mSecret = Convert.FromBase64String(sharedSecret);
}
else
{
MessageBox.Show("未知参数 shared_secret");
}
}
public static String GenerateSteamGuardCode()
{
string sharedSecret = ConfigUtil.Read<Config>().SteamGuard.shared_secret;
return new XXXSteamTwoFactorToken(sharedSecret).GenerateSteamGuardCodeForTime(CurrentTime());
}
private String GenerateSteamGuardCodeForTime(long calcTime)
{
return null;
}
private static long CurrentTime()
{
return DateTime.Now.Millisecond / 1000;
}
}
}

56
packages.config

@ -0,0 +1,56 @@ @@ -0,0 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Costura.Fody" version="5.7.0" targetFramework="net48" developmentDependency="true" />
<package id="Fody" version="6.6.3" targetFramework="net48" developmentDependency="true" />
<package id="Microsoft.NETCore.Platforms" version="1.1.0" targetFramework="net48" />
<package id="Microsoft.Win32.Primitives" version="4.3.0" targetFramework="net48" />
<package id="NETStandard.Library" version="1.6.1" targetFramework="net48" />
<package id="Newtonsoft.Json" version="13.0.1" targetFramework="net48" />
<package id="System.AppContext" version="4.3.0" targetFramework="net48" />
<package id="System.Buffers" version="4.5.1" targetFramework="net48" />
<package id="System.Collections" version="4.3.0" targetFramework="net48" />
<package id="System.Collections.Concurrent" version="4.3.0" targetFramework="net48" />
<package id="System.Console" version="4.3.0" targetFramework="net48" />
<package id="System.Diagnostics.Debug" version="4.3.0" targetFramework="net48" />
<package id="System.Diagnostics.DiagnosticSource" version="4.3.0" targetFramework="net48" />
<package id="System.Diagnostics.Tools" version="4.3.0" targetFramework="net48" />
<package id="System.Diagnostics.Tracing" version="4.3.0" targetFramework="net48" />
<package id="System.Globalization" version="4.3.0" targetFramework="net48" />
<package id="System.Globalization.Calendars" version="4.3.0" targetFramework="net48" />
<package id="System.IO" version="4.3.0" targetFramework="net48" />
<package id="System.IO.Compression" version="4.3.0" targetFramework="net48" />
<package id="System.IO.Compression.ZipFile" version="4.3.0" targetFramework="net48" />
<package id="System.IO.FileSystem" version="4.3.0" targetFramework="net48" />
<package id="System.IO.FileSystem.Primitives" version="4.3.0" targetFramework="net48" />
<package id="System.Linq" version="4.3.0" targetFramework="net48" />
<package id="System.Linq.Expressions" version="4.3.0" targetFramework="net48" />
<package id="System.Memory" version="4.5.5" targetFramework="net48" />
<package id="System.Net.Http" version="4.3.0" targetFramework="net48" />
<package id="System.Net.Primitives" version="4.3.0" targetFramework="net48" />
<package id="System.Net.Sockets" version="4.3.0" targetFramework="net48" />
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net48" />
<package id="System.ObjectModel" version="4.3.0" targetFramework="net48" />
<package id="System.Reflection" version="4.3.0" targetFramework="net48" />
<package id="System.Reflection.Extensions" version="4.3.0" targetFramework="net48" />
<package id="System.Reflection.Primitives" version="4.3.0" targetFramework="net48" />
<package id="System.Resources.ResourceManager" version="4.3.0" targetFramework="net48" />
<package id="System.Runtime" version="4.3.0" targetFramework="net48" />
<package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net48" />
<package id="System.Runtime.Extensions" version="4.3.0" targetFramework="net48" />
<package id="System.Runtime.Handles" version="4.3.0" targetFramework="net48" />
<package id="System.Runtime.InteropServices" version="4.3.0" targetFramework="net48" />
<package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="net48" />
<package id="System.Runtime.Numerics" version="4.3.0" targetFramework="net48" />
<package id="System.Security.Cryptography.Algorithms" version="4.3.0" targetFramework="net48" />
<package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="net48" />
<package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="net48" />
<package id="System.Security.Cryptography.X509Certificates" version="4.3.0" targetFramework="net48" />
<package id="System.Text.Encoding" version="4.3.0" targetFramework="net48" />
<package id="System.Text.Encoding.Extensions" version="4.3.0" targetFramework="net48" />
<package id="System.Text.RegularExpressions" version="4.3.0" targetFramework="net48" />
<package id="System.Threading" version="4.3.0" targetFramework="net48" />
<package id="System.Threading.Tasks" version="4.3.0" targetFramework="net48" />
<package id="System.Threading.Timer" version="4.3.0" targetFramework="net48" />
<package id="System.Xml.ReaderWriter" version="4.3.0" targetFramework="net48" />
<package id="System.Xml.XDocument" version="4.3.0" targetFramework="net48" />
</packages>

276
steam-token.csproj

@ -0,0 +1,276 @@ @@ -0,0 +1,276 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="packages\Costura.Fody.5.7.0\build\Costura.Fody.props" Condition="Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.props')" />
<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>{26555785-E311-4F28-A28D-DD96B3165B98}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>steam_token</RootNamespace>
<AssemblyName>steam-token</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>steam-token.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="Costura, Version=5.7.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>packages\Costura.Fody.5.7.0\lib\netstandard1.0\Costura.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Win32.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\Microsoft.Win32.Primitives.4.3.0\lib\net46\Microsoft.Win32.Primitives.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.AppContext, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.AppContext.4.3.0\lib\net463\System.AppContext.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.ComponentModel.Composition" />
<Reference Include="System.Console, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Console.4.3.0\lib\net46\System.Console.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Core" />
<Reference Include="System.Diagnostics.DiagnosticSource, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>packages\System.Diagnostics.DiagnosticSource.4.3.0\lib\net46\System.Diagnostics.DiagnosticSource.dll</HintPath>
</Reference>
<Reference Include="System.Diagnostics.Tracing, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Diagnostics.Tracing.4.3.0\lib\net462\System.Diagnostics.Tracing.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Globalization.Calendars, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Globalization.Calendars.4.3.0\lib\net46\System.Globalization.Calendars.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.IO, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.IO.4.3.0\lib\net462\System.IO.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.IO.Compression, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
<HintPath>packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.IO.Compression.FileSystem" />
<Reference Include="System.IO.Compression.ZipFile, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
<HintPath>packages\System.IO.Compression.ZipFile.4.3.0\lib\net46\System.IO.Compression.ZipFile.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.IO.FileSystem, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.IO.FileSystem.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Linq, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Linq.4.3.0\lib\net463\System.Linq.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Linq.Expressions, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Linq.Expressions.4.3.0\lib\net463\System.Linq.Expressions.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Net.Http, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Net.Http.4.3.0\lib\net46\System.Net.Http.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Net.Sockets, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Net.Sockets.4.3.0\lib\net46\System.Net.Sockets.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Reflection, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Reflection.4.3.0\lib\net462\System.Reflection.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Runtime, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Runtime.Extensions, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Runtime.Extensions.4.3.0\lib\net462\System.Runtime.Extensions.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Runtime.InteropServices, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Runtime.InteropServices.4.3.0\lib\net463\System.Runtime.InteropServices.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Security.Cryptography.Algorithms, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net463\System.Security.Cryptography.Algorithms.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Security.Cryptography.Encoding, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Security.Cryptography.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Security.Cryptography.X509Certificates, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Text.RegularExpressions, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Text.RegularExpressions.4.3.0\lib\net463\System.Text.RegularExpressions.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Windows.Forms.DataVisualization" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="System.Xml.ReaderWriter, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Xml.ReaderWriter.4.3.0\lib\net46\System.Xml.ReaderWriter.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Entity\Config.cs" />
<Compile Include="Entity\SteamGuard.cs" />
<Compile Include="MainForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="MainForm.Designer.cs">
<DependentUpon>MainForm.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="UI\AboutForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="UI\AboutForm.Designer.cs">
<DependentUpon>AboutForm.cs</DependentUpon>
</Compile>
<Compile Include="UI\Set\ProgramConfig.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="UI\Set\ProgramConfig.Designer.cs">
<DependentUpon>ProgramConfig.cs</DependentUpon>
</Compile>
<Compile Include="UI\Set\GuardConfig.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="UI\Set\GuardConfig.Designer.cs">
<DependentUpon>GuardConfig.cs</DependentUpon>
</Compile>
<Compile Include="Util\SteamGuardCalcThread.cs" />
<Compile Include="Util\SteamTwoFactorToken.cs" />
<Compile Include="Util\ConfigUtil.cs" />
<EmbeddedResource Include="MainForm.resx">
<DependentUpon>MainForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<EmbeddedResource Include="UI\AboutForm.resx">
<DependentUpon>AboutForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UI\Set\GuardConfig.resx">
<DependentUpon>GuardConfig.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UI\Set\ProgramConfig.resx">
<DependentUpon>ProgramConfig.cs</DependentUpon>
</EmbeddedResource>
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<Content Include="Assets\Image\steam-token.ico" />
<Content Include="Assets\Image\steam-token.png" />
<Content Include="steam-token.ico" />
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="packages\Fody.6.6.3\build\Fody.targets" Condition="Exists('packages\Fody.6.6.3\build\Fody.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('packages\Fody.6.6.3\build\Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Fody.6.6.3\build\Fody.targets'))" />
<Error Condition="!Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.props')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Costura.Fody.5.7.0\build\Costura.Fody.props'))" />
<Error Condition="!Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Costura.Fody.5.7.0\build\Costura.Fody.targets'))" />
</Target>
<Import Project="packages\Costura.Fody.5.7.0\build\Costura.Fody.targets" Condition="Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.targets')" />
</Project>

BIN
steam-token.ico

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

25
steam-token.sln

@ -0,0 +1,25 @@ @@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.32106.194
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "steam-token", "steam-token.csproj", "{26555785-E311-4F28-A28D-DD96B3165B98}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{26555785-E311-4F28-A28D-DD96B3165B98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{26555785-E311-4F28-A28D-DD96B3165B98}.Debug|Any CPU.Build.0 = Debug|Any CPU
{26555785-E311-4F28-A28D-DD96B3165B98}.Release|Any CPU.ActiveCfg = Release|Any CPU
{26555785-E311-4F28-A28D-DD96B3165B98}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {820E8374-01AD-41B9-82C1-388ADF797885}
EndGlobalSection
EndGlobal
Loading…
Cancel
Save