开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 7274|回复: 6
收起左侧

[技术专题] G网App_推荐有礼算法分析

[复制链接]
结帖率:100% (1/1)
发表于 2020-7-23 00:17:31 | 显示全部楼层 |阅读模式   上海市上海市
本帖最后由 小范q 于 2020-7-23 02:04 编辑

1. 前 言

  • 前几天有人给我发了个该App推荐注册的邀请链接,抱着学习态度,研究该链接是如何生成。邀请链接如下:

    https://xxxx.com/activity/NewProvinceGiftLink/index.html?k1=-a-3b-0++41&k2=703ig82h8e7e73g411969j25eeh9j8j3&k3=500000&k4=500100&k5=500120&k6=ACT20191110&s=80wz0f&l=76409dfa762b786747df54aa2372f5a2&from=singlemessage

2. 参数分析

  • 2.1 抓包后看到如下zip数据包

  • 2.2  下载该Zip链接  解压后 看到如下网页文件

    2.png

  • 2.3  使用 HBuilder X 打开项目,并且搜索 “NewProvinceGiftLink/index.html”

    3.png

  • 2.4 往上搜索 定位到 链接参数生成代码

    function() {
          var t = this;
          this.codeData = {}, this.codeData.k1 = this.initData.realMobile, this.codeData.k2 = this.initData.userId,
                  this.codeData.k3 = this.initData.provinceId, this.codeData.k4 = this.initData.cityId, this.codeData.k5 =
                  this.initData.districtId, this.codeData.k6 = "ACT20191110", this.codeData.s = Math.random().toString(36).substr(
                          3, 6);
          var e = {
                  encry: this.codeData.k1
          };
          uexCore.changeP_encry(JSON.stringify(e), function(e) {
                  t.codeData.k1 = e.data.P_encry.replace(/\(/g, "a").replace(/\)/g, "b"), t.m1 = e.data
          });
          var r = {
                  encry: this.codeData.k2
          };
          uexCore.changeT_encry(JSON.stringify(r), function(e) {
                  t.codeData.k2 = e.data.T_encry, t.m2 = e.data
          }), setTimeout(function() {
                  var e = t.codeData.k1 + t.codeData.k2 + t.codeData.k3 + t.codeData.k4 + t.codeData.k5 + t.codeData.k6 + t.codeData
                          .s;
                  t.codeData.l = (0, h.default)(e), t.newData = "k1=" + t.codeData.k1 + "&k2=" + t.codeData.k2 + "&k3=" + t.codeData
                          .k3 + "&k4=" + t.codeData.k4 + "&k5=" + t.codeData.k5 + "&k6=" + t.codeData.k6 + "&s=" + t.codeData.s +
                          "&l=" + (0, h.default)(e), t.config.value = t.sh + "/tuijianfenxiangxy/html/invitationWrite.html?" + t.newData
          }, 100)
    }
  • 2.5 邀请链接参数分析

    参数 加密前参数 机密算法分析
    k1 this.initData.realMobile(手机号) changeP_encry(realMobile)
    k2 userId(userId) changeT_encry(userId)
    k3 provinceId(省Id) 明文
    k4 cityId(城市Id) 明文
    k5 districtId(区id) 明文
    k6 ACT20191110 固定值
    l k1+k2+..+k6+s MD5 对所有参数校验
    s 随机6位字符串 (加盐)
  • 2.6  HBuilder X 中 全文搜索 k1, k2 实现的加密算法 changeP_encry  / changeT_encry,并未查找到对应的实现方法。猜想该算法的实现应该在 app 的java 层进行实现,通过安卓的内置浏览器 EBrowserView 进行数据相互交互;

    4.png

  • 2.7  使用 jeb 反编译 该app (App存在加固,自行脱壳哈),并搜索 关键字 changeP_encry  / changeT_encry;果然定位到该算法的实现方法

    5.png

    • changeP_encry   加解密 实现方法

    6.png

    • changeT_encry   加解密 实现方法
      7.png

3. 使用 python3  实现 电力分享链接生成

import base64
import binascii
import hashlib
import json
import string
import time

import jsonpath
import requests
import random

class ZsdlShare(object):
    def __init__(self):
        self.host = 'https://osg-static.sgcc.com.cn'
        self.phone = "13812345678"
        self.userId = "1234567890"

    def __base_ranstr(self, nums):
        """
        获取随机字符串
        :param nums: 获取长度
        :return:
        """
        salt = ''.join(random.sample(string.ascii_letters + string.digits, nums))
        return salt

    def md5(self, data):
        return hashlib.md5(data.encode()).hexdigest()

    def change_num_decry(self, dnc_str):
        """
        手机号解密
        :param dnc_str:
        :return:
        """
        return dnc_str.replace("_", "\\\\u").replace("a", "(").replace("b", ")").replace("4", "5").replace("3",
                                                                                                           "6").replace(
            "2", "7").replace("1", "8").replace(
            "0", "9").replace("+", "0").replace("-", "1").replace(")", "2").replace("(", "3").replace("*", "4")

    def change_num_encry(self, enc_str):
        """
        手机号加密
        :param enc_str:
        :return:
        """
        return enc_str.replace("\\\\u", "_").replace("0", "+").replace("1", "-").replace("2", ")").replace("3",
                                                                                                           "(").replace(
            "4", "*").replace("5", "4").replace("6", "3").replace("7", "2").replace("8", "1").replace("9", "0").replace(
            "(", "a").replace(")", "b")

    def id_encrypt(self, user_id):
        """
        用户User_id加密
        :param user_id:
        :return:
        """
        v2 = []
        for item in user_id:
            temp_int = int(ord(item))
            if item.isdigit():
                temp_int += 3
                if temp_int > 57:
                    temp_int -= 10

            elif item.islower():
                temp_int += 4
                if temp_int > 122:
                    temp_int -= 26

            v2.append(chr(temp_int))

        return "".join(v2)

    def id_dncry_For_New(self, dnc_str):
        """
        UserId 解密
        :param dnc_str
        :return:
        """
        v2 = []
        for item in dnc_str:
            temp_int = int(ord(item))
            if item.isdigit():
                if temp_int < 51:
                    temp_int += 10
                temp_int -= 3
            elif item.islower():
                if temp_int < 101:
                    temp_int += 26
                temp_int -= 4
            v2.append(chr(temp_int))

        return "".join(v2)

    def get_shares(self):
        """
        :return:
        """
        base_url = self.host + '/activity/NewProvinceGiftLink/index.html?k1={0}&k2={1}&k3={2}&k4={3}&k5={4}&k6={5}&s={6}&l={7}'
        k1 = self.change_num_encry(self.phone)
        k2 = self.id_encrypt(self.userId)
        k3 = "500000"
        k4 = "500100"
        k5 = "500120"
        k6 = "ACT20191110"
        s = self.__base_ranstr(6).lower()
        l = self.md5(k1 + k2 + k3 + k4 + k5 + k6 + s).lower()

        return base_url.format(k1, k2, k3, k4, k5, k6, s, l)

if __name__ == '__main__':
    print(ZsdlShare().get_shares())
1.png
7.png
6.png
5.png
4.png
3.png
2.png

评分

参与人数 1精币 +1 收起 理由
zy723 + 1 感谢分享,很给力!~

查看全部评分


结帖率:75% (3/4)

签到天数: 12 天

发表于 2020-8-1 12:28:22 | 显示全部楼层   湖南省湘潭市
看看学习一下思路!
回复 支持 反对

使用道具 举报

结帖率:93% (121/130)

签到天数: 15 天

发表于 2020-7-24 14:28:01 | 显示全部楼层   广东省广州市
TBit 发表于 2020-7-24 08:35
抓包工具是 charles

我用的charles   界面没他的那个看起来那么漂亮
回复 支持 反对

使用道具 举报

结帖率:100% (17/17)

签到天数: 21 天

发表于 2020-7-24 08:35:30 | 显示全部楼层   山东省烟台市
chendipang 发表于 2020-7-24 00:32
抓包工具看去了挺舒服的方便提供下下载地址嘛

抓包工具是 charles
回复 支持 反对

使用道具 举报

结帖率:93% (121/130)

签到天数: 15 天

发表于 2020-7-24 00:32:07 | 显示全部楼层   广东省广州市
抓包工具看去了挺舒服的方便提供下下载地址嘛
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)

签到天数: 1 天

发表于 2020-7-23 08:36:42 | 显示全部楼层   辽宁省沈阳市
这复杂~~我是看不懂
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)

签到天数: 1 天

发表于 2020-7-23 08:34:22 | 显示全部楼层   辽宁省沈阳市
打开逛逛 拜师求大佬指点  超级赞辛苦 牛牛牛
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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