前言

此逆向学习仅提供思路和部分接口,本文章仅用于学习,如果觉得不妥可联系我进行删除。


接口

获取验证码

加密参数:sign,phoneNo

固定参数:version,versioncode,clienttype.....等

sign的加密方式

采用md5加密,条件是设备信息加时间戳的方式。

// 生成Sign
func generateRandomStringSign(timestamp int64, device string) string {

    // 将时间戳转换为字符串
    currentTimeStr := strconv.FormatInt(timestamp, 10)

    // 拼接设备信息和时间戳
    var5 := strings.Builder{}
    var5.WriteString(device)
    var5.WriteString(currentTimeStr)

    // 计算 MD5 哈希值
    hash := md5.Sum([]byte(var5.String()))
    var7 := fmt.Sprintf("%x", hash)
    ret

phoneNo的加密方式:

这个有难度,但不多。

最开始是被绕进去了,逆向分析了半小时就解决这个接口了。

phoneNo的加密方式则是通过base64编码的公钥进行加密,方式是RSA加密。

不公开,此加密方式繁琐也证明了游戏官方的态度。

提供一下反编译的Java代码:

private final void addCommonParams(Request.Builder var1) {
      String var4 = String.valueOf(System.currentTimeMillis());
      StringBuilder var5 = new StringBuilder();
      var5.append(this.deviceInfo);
      var5.append(var4);
      String var7 = StringExtentionsKt.md5(var5.toString());
      var1.addHeader("timestamp", var4);
      var1.addHeader("device", this.deviceInfo);
      var1.addHeader("version", "5.30.91-beta");
      var1.addHeader("versionCode", "230920");
      var1.addHeader("guestId", String.valueOf(GlobalDataSource.INSTANCE.getGuestId()));
      var1.addHeader("sign", var7);
      var1.addHeader("clientType", "app");
      var4 = MainApp.Companion.getSourceFrom();
      CharSequence var8 = (CharSequence)var4;
      boolean var3 = false;
      boolean var2;
      if (var8 != null && var8.length() != 0) {
         var2 = false;
      } else {
         var2 = true;
      }

      if (!var2) {
         var1.addHeader("sourceFrom", var4);
      }

      var7 = MainApp.Companion.getSourceType();
      CharSequence var6 = (CharSequence)var7;
      if (var6 != null && var6.length() != 0) {
         var2 = false;
      } else {
         var2 = true;
      }

      if (!var2) {
         var1.addHeader("sourceType", var7);
      }

      label31: {
         var4 = MainApp.Companion.getChannelNo();
         var8 = (CharSequence)var4;
         if (var8 != null) {
            var2 = var3;
            if (var8.length() != 0) {
               break label31;
            }
         }

         var2 = true;
      }

      if (!var2) {
         var1.addHeader("channelNo", var4);
      }

   }

登录接口

请求头内容和验证码的差不多,仅有body的json编码改变了些许。

    requestBody := map[string]interface{}{
        "account":          "",
        "password":         "",
        "serial":           uuid.New().String(),
        "phoneNo":          phoneNumber,
        "verificationCode": code,
    }

这个地方的难度也是之前请求加密的phoneNo的加密,其余并无难度。


说点题外话把,此雷霆游戏APP有很危险的内容,一旦通过接口登录后会拥有accrssToken等关键信息,若是部分游戏登录时也采用这样的登录权限,极有可能通过root权限封包APP内的登录验证,不用输入账号密码也能登录。

部分灰产可通过登录凭证直接养号避开图像验证之类的。

本文章只是提供思路学习。

有一说一,爱加密和邦邦企业版挺难的,尤其是一旦函数涉及到so层,那就只能用工具一步步看着还原。

比如联通的APP,虽然逆向出来了,但也是花了快一天左右。

添加付费获取联系方式,仅讲解逆向思路,需要订单号:

价格: 68.00 元
VIP会员价格:68.00元终身会员免费
已有3人购买并解决该问题。
温馨提示:登录付款后可永久阅读隐藏内容。 付费可读
最后修改:2024 年 01 月 30 日
如果觉得我的文章对你有用,请随意赞赏