Android反编译看看手Q口令红包的实现原理

2019-12-10 19:07:55王振洲

找到2个类共3处代码引用。

最后那个类的起名有点耐人寻味,PasswdRedBagManager,密码红包管理器,有点意思:

public void b(String str) {
  ((TroopTipsMsgMgr) this.f2203a.getManager(80)).a(str, "u533fu540du4e0du80fdu62a2u53e3u4ee4u7ea2u5305u54e6", NetConnInfoCenter.getServerTime(), BaseConstants.DEFAULT_QUICK_HEARTBEAT_TIMEOUT, f);
}

这串Unicode转换成中文后是”匿名不能抢口令红包哦”,原来还有这种逻辑,产品经理你真是够了。

这里我们重新从该类的上面看下来,大致扫一扫,发现onDestroy下面有一个方法打的log很神奇:

public long[] m883a(SessionInfo sessionInfo, String str) {
  if (QLog.isColorLevel()) {
    QLog.d(f2197a, (int) h, "openPasswdRedBagByPassword, passwd = " + str);
  }
  long[] jArr = new long[]{0, 0};
  if (sessionInfo == null) {
    return jArr;
  }
  if (TextUtils.isEmpty(str)) {
    return jArr;
  }
  c();
  List<String> list = (List) this.f2206a.get(str);
  if (list == null || list.isEmpty()) {
    return jArr;
  }
  PasswdRedBagInfo passwdRedBagInfo;
  String str2 = a(sessionInfo.a) + "_" + sessionInfo.f1757a;
  for (String str3 : list) {
    HashMap hashMap = (HashMap) this.f2209b.get(str3);
    if (hashMap != null) {
      passwdRedBagInfo = (PasswdRedBagInfo) hashMap.get(str2);
      if (!(passwdRedBagInfo == null || a(str3))) {
        jArr[g] = passwdRedBagInfo.a.uint64_creator_uin.get();
        if (!b(str3)) {
          if (!c(str3)) {
            hashMap.put(str2, passwdRedBagInfo);
            jArr[f] = 1;
            break;
          }
          jArr[f] = 3;
        } else {
          jArr[f] = 2;
        }
      }
    }
  }
  passwdRedBagInfo = null;
  if (passwdRedBagInfo == null) {
    return jArr;
  }
  b(sessionInfo.a, sessionInfo.f1757a, passwdRedBagInfo.a.string_redbag_id.get().toStringUtf8());
  a(sessionInfo, passwdRedBagInfo);
  return jArr;
}

isColorLevel目测是某种debug用的tag,可能某些环境下部分用户会打开,而从log结合我们平时打log习惯来看,这个方法应该就叫openPasswdRedBagByPassword了,第二个参数就是password。终于找到了。看一下逻辑大致是从外面load进来所有红包信息到本类的各种hashmap和list(有一个tag,只会加载第一次,本类多个方法都会调用这个方法),然后根据password从里面找到对应passwdRedBagInfo,设置result tag,然后调用了