node模拟登录并管理tplink路由器

在上一篇文章《node模拟登录并管理小米路由器》中,我们介绍了如何模拟登录并快速管理小米路由器,接上文我们将继续介绍如何模拟登录TP-LINK路由器。

接下来,我们一步一步分析TP-LINK的登录协议并最终实现模拟登录。

1、首先,我们用chrome打开TP-LINK的路由登录界面,地址一般是:http://tplogin.cn,并打开调试,控制台(F12或者鼠标右键选择“检查”),切换至network这个tab并勾选Preserve Log。

2、随便输入一个密码,发起登录请求:

从图中我们可以看到登录请求中携带的参数变化的字段只有password字段,其他都是固定的,并且password字段是加密的,我们只需要找到password的加密函数,理论上就可以实现模拟登录,那么如何找到加密函数呢?

3、通过请求的Initiator,我们可以追踪发起请求的js调用栈:

通过查看js调用栈并配合chrome自带的代码格式化工具,我们可以轻松找到加密函数$.orgAuthPwd

4、虽然找到了加密函数,但是在当前js文件中并没有找到加密函数的定义,我们可以通过全局搜索大法进一步找到机密函数的定义以及加密算法:

得到的加密函数和加密算法整理后如下:

function securityEncode(a, b, c) {
    var e = "", f, g, h, k, l = 187, n = 187;
    g = a.length;
    h = b.length;
    k = c.length;
    f = g > h ? g : h;
    for (var p = 0; p < f; p++)
        n = l = 187,
            p >= g ? n = b.charCodeAt(p) : p >= h ? l = a.charCodeAt(p) : (l = a.charCodeAt(p),
                n = b.charCodeAt(p)),
            e += c.charAt((l ^ n) % k);
    return e
}

function orgAuthPwd(a) {
    return this.securityEncode("RDpbLfCPsJZ7fiv", a, "yLwVl0zKqws7LgKPRQ84Mdt708T1qQ3Ha7xv3H7NyU84p21BriUWBU43odz3iP4rBL3cD02KZciXTysVXiV8ngg6vL48rPJyAUw0HurW20xqxv9aYb4M9wK1Ae0wlro510qXeU07kV57fQMc8L6aLgMLwygtc0F10a0Dg70TOoouyFhdysuRMO51yY5ZlOZZLEal1h0t9YQW0Ko7oBwmCAHoic4HYbUyVeU3sfQ1xtXcPcf1aT303wAQhv66qzW")
}

然后我们输入正确的密码,登录进去,发现登录后返回了token:

这个很重要,这个就是我们后面获取设备列表和管理设备的钥匙,然后我们在登录请求行上点击鼠标右键并选择copy-> copy as fetch,并将其记录下来,copy的代码如下:

fetch("http://tplogin.cn/", {
  "headers": {
    "accept": "application/json, text/javascript, */*; q=0.01",
    "accept-language": "zh-CN,zh;q=0.9",
    "content-type": "application/json; charset=UTF-8",
    "x-requested-with": "XMLHttpRequest"
  },
  "referrer": "http://tplogin.cn/",
  "referrerPolicy": "strict-origin-when-cross-origin",
  "body": "{\"method\":\"do\",\"login\":{\"password\":\"zNsKrg4H2AqfbwK\"}}",
  "method": "POST",
  "mode": "cors",
  "credentials": "omit"
});

后期,我只需要在node中导入node-fetch,将copy的代码中的password字段动态换成我们通过加密函数加密后的内容就可以了。

5、接下来,我们可以进一步找到获取设备列表的请求,

这里可以看到,我们之前登陆成功后获取的token,用在了请求url中,我们同样的将请求copy as fetch保存以备用:

fetch("http://tplogin.cn/stok=stokxxxxx/ds", {
    "headers": {
        "accept": "application/json, text/javascript, */*; q=0.01",
        "accept-language": "zh-CN,zh;q=0.9",
        "content-type": "application/json; charset=UTF-8",
        "x-requested-with": "XMLHttpRequest"
    },
    "referrer": "http://tplogin.cn/",
    "referrerPolicy": "strict-origin-when-cross-origin",
    "body": "{\"hosts_info\":{\"table\":\"online_host\"},\"network\":{\"name\":\"iface_mac\"},\"method\":\"get\"}",
    "method": "POST",
    "mode": "cors",
    "credentials": "omit"
})

按照同样的方式我们可以很轻松的实现踢设备,接入设备等功能,这里就不再赘述了,大家可以按照上面的方式自己去实践。

你可以在本文的结尾下载文章涉及的完整源码。

猛戳这里下载本文案例源码包

系列文章导航:

第1节: node模拟登录并管理小米路由器

第3节: node模拟登录并管理中国移动光猫

  • 支付宝二维码 支付宝
  • 微信二维码 微信
相关文章