上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖

GiWifi手机版加密分析

[复制链接]
  • TA的每日心情
    开心
    前天 00:00
  • 签到天数: 53 天

    [LV.5]常住居民I

    352

    主题

    3091

    帖子

    3100

    积分

    管理员

    非物质文化遗产社会摇传承人

    Rank: 10Rank: 10Rank: 10

    积分
    3100

    猫咪币纪念章国庆纪念章中秋纪念章荣誉开发者家财万贯管理员

    发表于 2020-11-28 17:01:16 | 显示全部楼层 | 阅读模式
    通过搜索gatewayId找到g.java
    可以得出以下代码
    gwAddress
    hashMap.put("gwAddress", EncryptUtil.getEncrypt(CacheAuth.getInstance().getGwIp())

    service_type
    hashMap.put("service_type", Integer.valueOf(CacheAccount.getInstance().getLoginServiceType())

    staticPassword
    hashMap.put("staticPassword", EncryptUtil.getEncrypt(str3))

    phone
    hashMap.put("phone", EncryptUtil.getEncrypt(str))

    ip
    hashMap.put("ip", EncryptUtil.getEncrypt(CacheAuth.getInstance().getLocalIp())

    staType
    hashMap.put("staType", EncryptUtil.getEncrypt(s.l(context))

    staModel
    hashMap.put("staModel", EncryptUtil.getEncrypt(s.b())

    apMac 空
    hashMap.put("apMac", "")

    version版本
    明文 2.4.1.3

    mac
    hashMap2.put("mac", CacheAuth.getInstance().getLocalMac());

    gatewayId
    hashMap2.put("gatewayId", CacheAuth.getInstance().getGwId());

    token
    hashMap2.put("token", CacheAccount.getInstance().getUserToken());

    不需要管的数据有
    apMac version
    以上为固定数据

    调用EncryptUtil.getEncrypt有
    gwAddress staticPassword phone ip staType staModel

    调用CacheAuth.getInstance有
    mac gatewayId token service_type

    首先分析EncryptUtil.getEncrypt
    public static String getEncrypt(String str) {
            return d.a("5447c08b53e8dac4", str);
        }
    getEncrypt调用了d.a

    invoke-static {v0, p0}, Lcom/gbcom/gwifi/codec/d;->b(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;

    根据il语言定位gbcom/gwifi/codec/d.java翻阅代码

    package com.gbcom.gwifi.codec;

    import android.util.Base64;
    import java.security.Key;
    import javax.crypto.Cipher;
    import javax.crypto.spec.SecretKeySpec;

    public class d {
        private static final String a = "AES/ECB/PKCS5Padding";

        public static String a(String str, String str2) {
            if (str2 == null) {
                return "";
            }
            try {
                Key a = a(str);
                Cipher instance = Cipher.getInstance(a);
                instance.init(1, a);
                return Base64.encodeToString(instance.doFinal(str2.getBytes()), 2);
            } catch (Exception e) {
                e.printStackTrace();
                return "";
            }
        }

        private static Key a(String str) throws Exception {
            try {
                return new SecretKeySpec(str.getBytes(), "AES");
            } catch (Exception e) {
                e.printStackTrace();
                throw e;
            }
        }

        public static String b(String str, String str2) {
            try {
                Key a = a(str);
                Cipher instance = Cipher.getInstance(a);
                instance.init(2, a);
                return new String(instance.doFinal(Base64.decode(str2, 2))).trim();
            } catch (Exception e) {
                e.printStackTrace();
                return "";
            }
        }
    }
    因为是两个参数所以确定了public static String a(String str, String str2)
    调用了Cipher使用5447c08b53e8dac4生成对象,然后用1,AES/ECB/PKCS5Padding进行初始化
    进行对str2加密后base64编码

    根据执行流程可知b函数应该是解密函数
        public static String b(String str, String str2) {
            try {
                Key a = a(str);
                Cipher instance = Cipher.getInstance(a);
                instance.init(2, a);
                return new String(instance.doFinal(Base64.decode(str2, 2))).trim();
            } catch (Exception e) {
                e.printStackTrace();
                return "";
            }
        }
    调用了Cipher使用5447c08b53e8dac4生成对象,然后2,AES/ECB/PKCS5Padding进行初始化
    进行对str2进行解base64编码去空格后进行解码

    然后开始分析getLocalMac getGwId getUserToken

    我们先去CacheAuth找到getLocalMac getGwId

    public String getLocalMac() {
            String toUpperCase;
            synchronized (this) {
                toUpperCase = getStringValue(CACHE_LOCAL_MAC, "").toUpperCase();
            }
            return toUpperCase;
        }

    有getStringValue相关值就一定有设置
    public void setLocalMac(String str) {
            synchronized (this) {
                if (com.gbcom.gwifi.util.a.b(str)) {
                    if (!(str.equals("00:00:00:00:00:00") || str.equals("02:00:00:00:00:00"))) {
                        String trim = str.trim();
                        String localMac = getLocalMac();
                        if (!trim.toUpperCase().equals(localMac)) {
                            setStringValue(CACHE_LOCAL_MAC, trim);
                            this.authBean.setClientMac(trim);
                            if (!r.e(localMac)) {
                                j.b(TAG, "BaseGiWiFiInfoView send WIFI_MAC_CHANGE_ACTION");
                                GBApplication.instance().sendBroadcast(new Intent(com.gbcom.gwifi.util.c.by));
                            }
                            GiwifiPushAgent.getInstance(GBApplication.instance()).updateStatus();
                        }
                    }
                }
            }
        }
    我们继续搜索setLocalMac可以找到
    str = jSONObject2.getString("userMac");
    CacheAuth.getInstance().setLocalMac(str);
    这里抓包获取到的是明文,而上边的格式应该是加密的,所以可以推测getLocalMac getGwId在某处被加密过了,跟上述加密同理

    接下来看getUserToken
    public String getUserToken(boolean z, EMAError eMAError) {
            return native_getUserToken(z, eMAError);
        }
    这里也看不到特殊的地方,应该也在某处被特殊加密过了,跟上述加密同理







    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
  • TA的每日心情
    擦汗
    2022-7-14 17:11
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    106

    主题

    462

    帖子

    619

    积分

    版主

    Rank: 8Rank: 8

    积分
    619

    猫咪币纪念章活跃会员热心会员三好学生中秋纪念章国庆纪念章家财万贯

    发表于 2021-1-1 13:58:06 | 显示全部楼层
    看不懂,不接地气
    提及少年一词,应与平庸相斥!微信公众号——智家乐享
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表