Linux

linux下使用网卡的mac地址进行md5计算,如有多个网卡,则循环对比硬件码是否符合。如果符合,则认为这台机器是经过认证的。
如下图的log记录:

Pasted_image_20240725210245.png

Android

全局搜索 “hid” ,可以在com.sangfor.vpn.client.service.auth.o()com.sangfor.vpn.client.service.auth.p()方法中搜索到:

Pasted_image_20240725210441.png

跟进m()方法,可以看到此方法为生成hid的代码实现
public String m() {
    String deviceId = this.i.checkPermission("android.permission.READ_PHONE_STATE", Process.myPid(), Process.myUid()) == 0 ? ((TelephonyManager) this.i.getApplicationContext().getSystemService("phone")).getDeviceId() : null;
    if (deviceId == null) {
        deviceId = Build.VERSION.SDK_INT >= 29 ? u.g().d() : ((WifiManager) this.i.getApplicationContext().getSystemService("wifi")).getConnectionInfo().getMacAddress();
    }
    if (deviceId == null) {
        Log.a(h, "Can't get device's hardware Information.");
        return null;
    }
    try {
        byte[] digest = MessageDigest.getInstance("MD5").digest(deviceId.getBytes());
        StringBuilder sb = new StringBuilder(32);
        int length = digest.length;
        for (int i = 0; i < length; i++) {
            sb.append(String.format("%02X", Byte.valueOf(digest[i])));
        }
        return sb.toString();
    } catch (NoSuchAlgorithmException e) {
        Log.a(h, "Can't generate device's hardware ID.", e);
        return null;
    }
}

获取手机信息权限,调用getDeviceId()方法获取hid。如果不给权限获取不到,就获取wifi接口的mac地址,地址经过md5哈希计算得到hid信息。

Windows

windows下很奇怪,获取的mac地址经过本地、在线计算怎么都不对

Pasted_image_20240725210713.png

windows下获取hid信息的方法在SangforCore.dll中,根据日志和IDA Pro进行查找
Pasted_image_20240725210807.png

Pasted_image_20240725210841.png

其中sub_10023EF0函数实现了计算hid的算法,可惜看不懂
经过测试,在虚拟机中只要把mac地址设置为已授权机器的mac地址,生成的md5值 是相同的,这不太像是加了其他硬件的id salt
Pasted_image_20240725211008.png

后续更新:
https://github.com/docker-easyconnect/docker-easyconnect/issues/246

根据深信服论坛信息https://bbs.sangfor.com.cn/forum.php?mod=viewthread&tid=7696 ,easyconnect取硬件特征码是有顺序的。
在老版本上是按照硬盘ID -> C盘ID ->D盘ID->E盘ID…
在新版本上是按照硬盘ID ->网卡mac ->C盘ID ->D盘ID->E盘ID…,且网卡MAC取的是具有默认路由的那个网卡的
前一步操作失败则进行下一步,即取硬盘ID失败,则取网卡mac…
因此在docker中只需保证MAC地址不变即可确保硬件码不变,而在windows中则需要确保硬盘ID不变,这也是为何电脑更换硬盘后需要重新提交硬件码的原因

image_2024-07-25_21-30-53.png