[原创]steam令牌算法分析

您所在的位置:网站首页 staam令牌 [原创]steam令牌算法分析

[原创]steam令牌算法分析

#[原创]steam令牌算法分析| 来源: 网络整理| 查看: 265

0x00 前言

最近有一个项目需要将steam的令牌算法取出放置在PC上对接接口执行,由于steam令牌只能在手机上查看,所以使用起来非常不方便。 但我也没想到steam的APK居然才4M,而且没做任何混淆啥的处理,对新手非常之友好!

0x01 介绍

由于steam令牌它是不需要联网计算的,所以得知肯定是本地算法生成,但它是如何做到与服务器同步? 那必然肯定是在我们登录steam添加令牌时服务器和APP已经协商好了加密的方式,数据等并且存放在手机缓存上了。

0x02 思路

由于steam令牌弹出的界面,它显示的只有令牌码以及用户名,我们没办法直接通过搜索字符串的方式去定位,所以只能换个其它的方式去定位它的代码,而且发现界面大部分是webview组成的,唯独令牌显示的地方不是,所以他肯定会有组件ID,就可以通过组件ID的方式定位了~ 开整。

0x01 定位算法

首先先把APK拖入到JADX等待检索完成,接着我们打开Android SDK自带的uiautomatorviewer工具,手机接入ADB调试才能使用。

 

这里我们看到,令牌的组件ID是twofactorcode_code,所以我们直接在jadx搜索该组件ID。

 

我们看到第三行,使用setText进行显示code变量,那么点击进去查看下代码。

1234TwoFactorToken token = sgState.getTwoFactorToken();String code = token.generateSteamGuardCode();String account = sgState.getAccountName();remoteViews.setTextViewText(R.id.twofactorcode_code, code);

由于整个方法代码很多,但有用的就这几行,其中code是执行generateSteamGuardCode方法所返回,我们先跟进该方法查看一下。

123public final String generateSteamGuardCode() {    return generateSteamGuardCodeForTime(currentTime());}

我们看到,这里它传了一个时间戳进去,这里暂且先不跟进去,我们在继续跟进调用的方法内查看。

1234567891011121314151617181920212223242526272829303132333435public final String generateSteamGuardCodeForTime(long time) {      if (this.mSecret == null) {          return "";      }      long time2 = time / 30;      byte[] timeBytes = new byte[8];      int i = 8;      while (true) {          int i2 = i;          i = i2 - 1;          if (i2 >>= 8;      }      SecretKeySpec signKey = new SecretKeySpec(this.mSecret, "HmacSHA1");      try {          Mac mac = Mac.getInstance("HmacSHA1");          mac.init(signKey);          byte[] hmac_result = mac.doFinal(timeBytes);          int offset = hmac_result[19] & 15;          int bin_code = ((hmac_result[offset] & Byte.MAX_VALUE)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3