吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 13371|回复: 91
收起左侧

[Web逆向] 问卷星(答题)协议全参数分析

  [复制链接]
hygzs 发表于 2022-4-21 14:59

之前用py写的提交有点问题,这次来从头分析一下协议


这个布局排版不会,凑合看一下吧


答题和问卷的协议几乎一样
工具:edge浏览器,fiddle
使用语言:python
QQ截图20220421120331.png
为了保证所有cookies和其他缓存不会影响接下来的抓包,这里新建一个InPrivate窗口(无痕)
QQ截图20220421121046.png
这里有个小技巧vj的会进行debug处理但是vm不会,可以直接修改地址,省去一些步骤
例如:ks.wjx.top/vj/xxxxx.aspx
改成:ks.wjx.top/vm/xxxxx.aspx


先提交一次看需求的参数
QQ截图20220421121549.png
url附加参数如下
[Python] 纯文本查看 复制代码
shortid
starttime
source
submittype
ktimes
hlv
rn
jqpram
jcn
nw
jwt
jpm
t
jqnonce
jqsign


post附带的data需求参数
[Python] 纯文本查看 复制代码
submitdata


我们分析参数来源当然要看参数怎么生成的,但是直接去搜索参数发现搜不到,于是查看发起程序,第一个是jq的不用看,直接点第二个jqmobo2.js
QQ截图20220421122129.png





简单获得和固定的的参数:
shortid         : ks.wjx.top/vm/xxxxx.aspx
starttime         : HTML页面内获取 <input type="hidden" value="2022/4/21 12:10:55" id="starttime" name="starttime">
source                : directphone
submittype        : 1
ktimes                : 操作时间 可随机
hlv                : 1
rn                : HTML页面内获取 var rndnum="607374188.63586548";
nw                : 1
jwt                : 4
jpm                : 70
t                : 现在时间戳
jqnonce                : HTML页面内获取 var jqnonce="d0c9ba05-56ab-4938-9b6f-8844f114d279";


接下来还有jqsign,jcn,jqpram 三个参数是通过加密或者运算得来的

jqsign
QQ截图20220421135900.png
通过代码观看发现,jqsign是有jqnonce经过dataenc获得,直接断点跳过去,把代码拿出来
[JavaScript] 纯文本查看 复制代码
function dataenc(a) {
    var c, d, e, b = ktimes % 10;
    for (0 == b && (b = 1),
    c = [],
    d = 0; d < a.length; d++)
        e = a.charCodeAt(d) ^ b,
        c.push(String.fromCharCode(e));
    return c.join("")
}


函数内用到ktimes,所以我们把代码改改,把ktimes传进去
function dataenc(a,ktimes) {
    var c, d, e, b = ktimes % 10;
    for (0 == b && (b = 1),
    c = [],
    d = 0; d < a.length; d++)
        e = a.charCodeAt(d) ^ b,
        c.push(String.fromCharCode(e));
    return c.join("")
}[/mw_shl_code]

jcn
jcn通过断点发现传入的是填表的姓名,算法与jqsign一致,而且后期测试发现有没有都行,那就不管了
QQ截图20220421135928.png


jqpram
从代码中得到
[JavaScript] 纯文本查看 复制代码
window.jqParam && (w += "&jqpram=" + encodeURIComponent(jqParam)),

jqpram是通过encodeURIComponent(jqParam)
当前JS内并没有关于jqParam的来源,我们全局搜索,发现来源于一个混淆的js,用的是ob混淆
1. 具有大数组的情况
2. 数组移位(有内存泄露风险、建议不格式化),自执行函数,进行移位操作,有明显的 push、shift 关键字
3.解密函数(有内存泄露风险、建议不格式化)------可能有定时器--------(看加密的开关开启数量)
4.实际代码+控制流平坦化(整体ob的强度几乎完全取决于这段的代码强度,这里面是加密前的逻辑)
5.控制流平坦化+无限debugger自执行函数+死代码注入。一般情况下不会有业务逻辑所以不要问,ob、sojson如何破解。这些东西只是一层壳,破解强度完全取决于第四段代码,也就是其他网站作者写的代码强度!
6.函数名和变量名通常以 _0x 或者 0x 开头,后接 1~6 位数字或字母组合;

内容来源:https://www.cnblogs.com/YuanEven/p/15719932.html


0.0

下载好node环境,git文件,配制好系统环境后执行
QQ截图20220421142132.png
QQ截图20220421142231.png
QQ截图20220421142325.png
并把文件用fd映射到网页去,方便调试和了解代码,刷新网页
断点测试
QQ截图20220421142535.png

[JavaScript] 纯文本查看 复制代码
      var _0x4b9009 = rndnum["split"](".")[0]; //分隔rn 获取前置 给予_0x4b9009
      var _0x37348b = abcd1(parseInt(_0x4b9009));//abcd1处理_0x4b9009 给予_0x37348b
      var _0x307a46 = (_0x37348b + "")["split"]("");//_0x37348b 给予_0x307a46
      var _0x2f4e03 = $("#starttime")["val"]() || window["initstime"];//获取starttime 给予_0x2f4e03
      var _0x17071c = abcdu(new Date(_0x2f4e03["replace"](new RegExp("-", "gm"), "/"))); //转换时间戳通过abcdu处理 给予_0x17071c
      var _0x12e25a = _0x17071c + "";
      if (_0x17071c % 10 > 0) _0x12e25a = _0x12e25a["split"]("")["reverse"]()["join"](""); //_0x17071c%10>0 处理
      var _0x24bc24 = parseInt(_0x12e25a + "89123"); //时间戳 1650522320+89123    结果:165052232089123
      var _0x307a46 = (_0x24bc24 + "" + (_0x37348b + ""))["split"]("");//分隔上面
      var _0xd36323 = abcd4(_0x307a46, "kgESOLJUbB2fCteoQdYmXvF8j9IZs3K0i6w75VcDnG14WAyaxNqPuRlpTHMrhz");//abcd4处理_0x307a46
      var _0xc23193 = _0x24bc24 + _0x37348b + parseInt(activityId);//值得一提activityId打开页面的时候就处理了
      jqParam = abcd3(_0xc23193, _0xd36323);
      var _0x16feb7 = abcd5(jqParam);
      jqParam = _0x16feb7;


activityId        :页面获取
[JavaScript] 纯文本查看 复制代码
	function DecodeId(input) {
            return input ^ 2130030173;
        }
        var activityId =2035206417;
        activityId = DecodeId(activityId);


这里已经分析完了,然后处理一下逆向后的js发出来

[JavaScript] 纯文本查看 复制代码
function abcd1(_0xd7a12a) {
    return abcd2(_0xd7a12a, 3597397);
}

function abcd2(_0x5d3f51, _0x2da958) {
    if (!abcdx()) return;
    var _0x17fe67 = 2147483648;
    var _0x330f76 = 2147483647;
    var _0x8c2ab2 = ~~(_0x5d3f51 / _0x17fe67);
    var _0x33045d = ~~(_0x2da958 / _0x17fe67);
    var _0xa5b0b1 = _0x5d3f51 & _0x330f76;
    var _0x352369 = _0x2da958 & _0x330f76;
    var _0x3f97b8 = _0x8c2ab2 ^ _0x33045d;
    var _0x4307f8 = _0xa5b0b1 ^ _0x352369;
    return _0x3f97b8 * _0x17fe67 + _0x4307f8;
}

function abcd3(_0x2a839f, _0x29778) {
    if (_0x2a839f - 62 < 0) {
        var _0x47bf41 = _0x29778["substr"](_0x2a839f, 1);
        return _0x47bf41;
    }
    var _0x5aa264 = _0x2a839f % 62;
    var _0xf91ae6 = parseInt(_0x2a839f / 62);
    return abcd3(_0xf91ae6, _0x29778) + _0x29778["substr"](_0x5aa264, 1);
}

function abcd4(_0x2d1e33, _0x4ccbfe) {
    if (!abcdx()) return;
    var _0x39c799 = _0x4ccbfe["split"]("");
    var _0x368c45 = _0x4ccbfe["length"];
    for (var _0x2faa11 = 0; _0x2faa11 < _0x2d1e33["length"]; _0x2faa11++) {
        var _0x1e44d9 = parseInt(_0x2d1e33[_0x2faa11]);
        var _0x172ebc = _0x39c799[_0x1e44d9];
        var _0x939174 = _0x39c799[_0x368c45 - 1 - _0x1e44d9];
        _0x39c799[_0x1e44d9] = _0x939174;
        _0x39c799[_0x368c45 - 1 - _0x1e44d9] = _0x172ebc;
    }
    _0x4ccbfe = _0x39c799["join"]("");
    return _0x4ccbfe;
}

function abcd5(_0x30fc22) {
    if (!abcdx()) return;
    var _0x416034 = 0;
    var _0x39f6f7 = _0x30fc22["split"]("");
    for (var _0x3a1139 = 0; _0x3a1139 < _0x39f6f7["length"]; _0x3a1139++) {
        _0x416034 += _0x39f6f7[_0x3a1139]["charCodeAt"]();
    }
    var _0x33f508 = _0x30fc22["length"];
    var _0x51436b = _0x416034 % _0x33f508;
    var _0xd1d5ab = [];
    for (var _0x3a1139 = _0x51436b; _0x3a1139 < _0x33f508; _0x3a1139++) {
        _0xd1d5ab["push"](_0x39f6f7[_0x3a1139]);
    }
    for (var _0x3a1139 = 0; _0x3a1139 < _0x51436b; _0x3a1139++) {
        _0xd1d5ab["push"](_0x39f6f7[_0x3a1139]);
    }
    return _0xd1d5ab["join"]("");
}

function abcdu(_0x32b9a8) {
    var _0x4ba9ab = -480;
    var _0x1ce339 = new Date()["getTimezoneOffset"]();
    var _0x2ab335 = _0x4ba9ab - _0x1ce339;
    return _0x32b9a8["getTime"]() / 1000 + _0x2ab335 * 60;
}

function abcdx() {
    if (navigator["webdriver"]) return ![];
    if (document["$cdc_asdjflasutopfhvcZLmcfl_"]) return ![];
    if (/PhantomJS/ ["test"](window["navigator"]["userAgent"])) return ![];
    if (window["callPhantom"] || window["_phantom"]) return ![];
    return !![];
}

function _0x156205(rndnum, starttime, activityId) {
    var _0x4b9009 = rndnum["split"](".")[0]; //分隔rn 获取前置 给予_0x4b9009
    var _0x37348b = abcd1(parseInt(_0x4b9009)); //abcd1处理_0x4b9009 给予_0x37348b
    var _0x307a46 = (_0x37348b + "")["split"](""); //_0x37348b 给予_0x307a46
    var _0x2f4e03 = starttime; //获取starttime 给予_0x2f4e03
    var _0x17071c = abcdu(new Date(_0x2f4e03["replace"](new RegExp("-", "gm"), "/"))); //转换时间戳通过abcdu处理 给予_0x17071c
    var _0x12e25a = _0x17071c + "";
    if (_0x17071c % 10 > 0) _0x12e25a = _0x12e25a["split"]("")["reverse"]()["join"](""); //_0x17071c%10>0 处理
    var _0x24bc24 = parseInt(_0x12e25a + "89123"); //时间戳 1650522320+89123    结果:165052232089123
    var _0x307a46 = (_0x24bc24 + "" + (_0x37348b + ""))["split"](""); //分隔上面
    var _0xd36323 = abcd4(_0x307a46, "kgESOLJUbB2fCteoQdYmXvF8j9IZs3K0i6w75VcDnG14WAyaxNqPuRlpTHMrhz"); //abcd4处理_0x307a46
    var _0xc23193 = _0x24bc24 + _0x37348b + parseInt(activityId); //值得一提activityId打开页面的时候就处理了
    jqParam = abcd3(_0xc23193, _0xd36323);
    var _0x16feb7 = abcd5(jqParam);
    jqParam = _0x16feb7;
    return jqParam;
}
var  rndnum = "607374188.44535993";
var  starttime = "2022/4/21 14:25:20";
var  activityId = "129722188";
console.log(_0x156205(rndnum, starttime, activityId))


至于post的参数,应该都能看懂
QQ截图20220421145836.png

到此所有参数分析完毕,如有遗漏或不解,可以回帖问我










免费评分

参与人数 25威望 +2 吾爱币 +125 热心值 +23 收起 理由
smwsk + 1 + 1 我很赞同!
SOOX + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
gnow2013 + 1 + 1 谢谢@Thanks!
Ningcha + 1 + 1 谢谢@Thanks!
jackies + 1 + 1 用心讨论,共获提升!
染色体 + 1 + 1 热心回复!
zhyerh + 1 + 1 谢谢@Thanks!
无敌小车 + 1 + 1 热心回复!
叹丶 + 1 + 1 谢谢@Thanks!
haoe + 1 我很赞同!
红烧排骨 + 1 热心回复!
deep1ndreams + 1 + 1 我很赞同!
yixi + 1 + 1 谢谢@Thanks!
ZeroEndOS + 1 + 1 谢谢@Thanks!
漁滒 + 3 + 1 我很赞同!
fengbolee + 2 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
FFF全部成为F + 1 用心讨论,共获提升!
福仔 + 2 + 1 用心讨论,共获提升!
17606004414 + 1 + 1 热心回复!
RustYou + 1 谢谢@Thanks!
wmwhh + 1 谢谢@Thanks!
gaosld + 1 + 1 谢谢@Thanks!
涛之雨 + 2 + 100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
别放弃 + 1 + 1 谢谢@Thanks!
ShanGuiOne + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| hygzs 发表于 2022-5-30 17:32
starttime为开始时间,其中ktimes为多少就要延时多久,最低为1,服务器会比较你提交参数内的时间和提交时间还有ktimes,一定要逻辑合理.(有点忙没办法细说,你们自己注意一下)
zhangsir95 发表于 2022-4-22 21:06
大佬能否做一个问卷星的答题脚本,现在很多公司搞答题活动,先发题目,然后在问卷星答题,看谁抢答的快,前几名就有奖。能否作个已知题目输入之后,一键提交答案,这样一秒不到就完成了。又或者要这样搞,思路如何实现?

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
AfricanTiger + 1 + 1 这个才是目前最需要的

查看全部评分

 楼主| hygzs 发表于 2022-4-28 15:00
无敌小车 发表于 2022-4-28 13:29
没用的,我用试过了。同一个ip在一定时间内提交次数过多会有验证码,先是点击验证码然后是滑动验证码,这 ...

啊这,我能过
NorthWinter 发表于 2023-9-18 16:26
楼主 我的这个请求出来返回的是22 这个该怎么处理 ktimes我已经处理好了的
ShanGuiOne 发表于 2022-4-22 07:35
学习学习
ksiv 发表于 2022-4-22 07:57
这是要多么有耐心才能分析到这一步
lighterleon 发表于 2022-4-22 08:34
感谢分享,谢谢
别放弃 发表于 2022-4-22 09:07
讲的很好,分析的很明确,谢谢分享
sina001 发表于 2022-4-22 09:16
这个是真有用,要仔细看看
luckydog88 发表于 2022-4-22 11:55
这个可以做什么呢,
komuhaha 发表于 2022-4-22 12:55
学习了,之前有段时间还在研究这个刷得
airdear 发表于 2022-4-22 14:13
高人!!!
Leeth 发表于 2022-4-22 19:27
谢谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 08:58

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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