前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >破解文字加密第三弹之深扒天眼查

破解文字加密第三弹之深扒天眼查

作者头像
前端皮皮
发布2020-11-26 10:46:23
1.2K0
发布2020-11-26 10:46:23
举报
文章被收录于专栏:前端进阶学习交流

今天就要给大家好好扒一扒天眼查,包括它的文字加密,数字加密,登陆加密。

先给大家看一下天眼查哪些数据加密了。(加密处用红色框框出)

1.

2.

凡是加密的地方,它的标签属性都是:class='tyc-num lh24',已经在下图用红色框框出,现在看它的字体,用青色框框出,它的字体是"tyc-num" !important;现在找到字体的CSS文件(红色箭头处)来看看是如何加密的。

这是打开的CSS文件,‘tyc-num’这个字体有五个URL,它的末尾处对应这不同的浏览器,你是用的哪个浏览器就打开它对应的URL。因为小编用的chrome,所以打开第四个url,对应下载tff文件。

下载好tff文件后可以参考破解文字加密第一弹之实习僧这篇文字的方法,获得不同文字的映射。天眼查对它的数据保护的还是很好的,它的映射一天就会变一次,所以你要是想爬天眼查,最好一天爬完。下图是这一次被加密的文字,(不仅是文字,就连数字也会变,比如1今天可能加密了,第二天就不加密。比如猫眼电影,加密固定的就是0-9十个数字,而天眼查是0-9十个数字部分加密,你根本不知道它会给哪些数字加密)

比如下图是昨天的加密:

比如下图是前天的加密,大家对比一下三天的数字就知道了。

它的文字加密也是每天都会变,可能某个字今天加密,明天就不加密了。来看下数字加密的映射:

这里要注意的是关于文字和数字的映射函数是不一样的。

这是关于数字的映射函数,因为你的数字加密前和加密后一直都不是唯一的,所以用replace这个函数的话,返回的数字完全不对,之前没有意识到这一点,返回的数字还是像加密了一样杂乱无章,小编还以为天眼查给数字加密了好几次

代码语言:javascript
复制
def change(content):
   dit={
       '4':'1','6':'2','1':'3',
       '8':'4','9':'6','2':'7',
       '7':'8','3':'9','将':'人'
   }
   w=''
   for i in content:
       try:
           w=w+dit[i]
       except KeyError:
           w=w+i
   return w

因为加密的文字太多了,一个一个复制粘贴太麻烦,小编就没有做这个文字映射字典了。下面是关于文字的映射代码:

代码语言:javascript
复制
def change(string):
   changedict = {}
   for key,value in changedict.items():
       string=string.replace(key,value)
   return string

经过映射函数后,得到的相关信息都是正确的:

小编无意间发现,如果你处于登录状态,它的详情一栏的标签就change了。可以对比一下之前的图:之前的标签class='tyc-num lh24';可登陆以后,这一块的标签变成了class='js-full-container hidden'。两处的内容是完全一样的。小编就有了一个想法:是不是只要有你的登录信息,这一部分的内容就不会加密。

为了验证这一猜想,将登陆后的cookie加入headers,对网页正常的解析后,得到的内容都是完全正确的。

所以,只要模拟登陆天眼查并获得相应的cookie,就不需要再做文字映射了。但是这个登陆并不简单。下图是捕捉到的登录情况:方式为POST,一共有四个参数,autoLogin/cdpassword/loginway/mobile;其中cdpassword是加密的。

全局查找这个参数,在company这个JS文件中找到了cdpassword。

加入断点进行调试,发现当断点打在12739行,可以看到一些有趣的东西:cdpassword这个参数是由函数s生成的,而函数s的参数就是输入的密码。

这个函数s还是在同一个js文件:这个函数内又有很多其他的函数。

从加密函数初步判断为MD5加密(如果判断错误请告知)。加密的JS代码如下:

代码语言:javascript
复制
function(t) {
   "use strict";
   function e(t, e) {
       var i = (65535 & t) + (65535 & e);
       return (t >> 16) + (e >> 16) + (i >> 16) << 16 | 65535 & i
   }
   function i(t, e) {
       return t << e | t >>> 32 - e
   }
   function a(t, a, s, n, c, l) {
       return e(i(e(e(a, t), e(n, l)), c), s)
   }
   function s(t, e, i, s, n, c, l) {
       return a(e & i | ~e & s, t, e, n, c, l)
   }
   function n(t, e, i, s, n, c, l) {
       return a(e & s | i & ~s, t, e, n, c, l)
   }
   function c(t, e, i, s, n, c, l) {
       return a(e ^ i ^ s, t, e, n, c, l)
   }
   function l(t, e, i, s, n, c, l) {
       return a(i ^ (e | ~s), t, e, n, c, l)
   }
   function d(t, i) {
       t[i >> 5] |= 128 << i % 32,
       t[14 + (i + 64 >>> 9 << 4)] = i;
       var a, d, r, o, p, v = 1732584193, m = -271733879, u = -1732584194, h = 271733878;
       for (a = 0; a < t.length; a += 16)
           d = v,
           r = m,
           o = u,
           p = h,
           v = s(v, m, u, h, t[a], 7, -680876936),
           h = s(h, v, m, u, t[a + 1], 12, -389564586),
           u = s(u, h, v, m, t[a + 2], 17, 606105819),
           m = s(m, u, h, v, t[a + 3], 22, -1044525330),
           v = s(v, m, u, h, t[a + 4], 7, -176418897),
           h = s(h, v, m, u, t[a + 5], 12, 1200080426),
           u = s(u, h, v, m, t[a + 6], 17, -1473231341),
           m = s(m, u, h, v, t[a + 7], 22, -45705983),
           v = s(v, m, u, h, t[a + 8], 7, 1770035416),
           h = s(h, v, m, u, t[a + 9], 12, -1958414417),
           u = s(u, h, v, m, t[a + 10], 17, -42063),
           m = s(m, u, h, v, t[a + 11], 22, -1990404162),
           v = s(v, m, u, h, t[a + 12], 7, 1804603682),
           h = s(h, v, m, u, t[a + 13], 12, -40341101),
           u = s(u, h, v, m, t[a + 14], 17, -1502002290),
           m = s(m, u, h, v, t[a + 15], 22, 1236535329),
           v = n(v, m, u, h, t[a + 1], 5, -165796510),
           h = n(h, v, m, u, t[a + 6], 9, -1069501632),
           u = n(u, h, v, m, t[a + 11], 14, 643717713),
           m = n(m, u, h, v, t[a], 20, -373897302),
           v = n(v, m, u, h, t[a + 5], 5, -701558691),
           h = n(h, v, m, u, t[a + 10], 9, 38016083),
           u = n(u, h, v, m, t[a + 15], 14, -660478335),
           m = n(m, u, h, v, t[a + 4], 20, -405537848),
           v = n(v, m, u, h, t[a + 9], 5, 568446438),
           h = n(h, v, m, u, t[a + 14], 9, -1019803690),
           u = n(u, h, v, m, t[a + 3], 14, -187363961),
           m = n(m, u, h, v, t[a + 8], 20, 1163531501),
           v = n(v, m, u, h, t[a + 13], 5, -1444681467),
           h = n(h, v, m, u, t[a + 2], 9, -51403784),
           u = n(u, h, v, m, t[a + 7], 14, 1735328473),
           m = n(m, u, h, v, t[a + 12], 20, -1926607734),
           v = c(v, m, u, h, t[a + 5], 4, -378558),
           h = c(h, v, m, u, t[a + 8], 11, -2022574463),
           u = c(u, h, v, m, t[a + 11], 16, 1839030562),
           m = c(m, u, h, v, t[a + 14], 23, -35309556),
           v = c(v, m, u, h, t[a + 1], 4, -1530992060),
           h = c(h, v, m, u, t[a + 4], 11, 1272893353),
           u = c(u, h, v, m, t[a + 7], 16, -155497632),
           m = c(m, u, h, v, t[a + 10], 23, -1094730640),
           v = c(v, m, u, h, t[a + 13], 4, 681279174),
           h = c(h, v, m, u, t[a], 11, -358537222),
           u = c(u, h, v, m, t[a + 3], 16, -722521979),
           m = c(m, u, h, v, t[a + 6], 23, 76029189),
           v = c(v, m, u, h, t[a + 9], 4, -640364487),
           h = c(h, v, m, u, t[a + 12], 11, -421815835),
           u = c(u, h, v, m, t[a + 15], 16, 530742520),
           m = c(m, u, h, v, t[a + 2], 23, -995338651),
           v = l(v, m, u, h, t[a], 6, -198630844),
           h = l(h, v, m, u, t[a + 7], 10, 1126891415),
           u = l(u, h, v, m, t[a + 14], 15, -1416354905),
           m = l(m, u, h, v, t[a + 5], 21, -57434055),
           v = l(v, m, u, h, t[a + 12], 6, 1700485571),
           h = l(h, v, m, u, t[a + 3], 10, -1894986606),
           u = l(u, h, v, m, t[a + 10], 15, -1051523),
           m = l(m, u, h, v, t[a + 1], 21, -2054922799),
           v = l(v, m, u, h, t[a + 8], 6, 1873313359),
           h = l(h, v, m, u, t[a + 15], 10, -30611744),
           u = l(u, h, v, m, t[a + 6], 15, -1560198380),
           m = l(m, u, h, v, t[a + 13], 21, 1309151649),
           v = l(v, m, u, h, t[a + 4], 6, -145523070),
           h = l(h, v, m, u, t[a + 11], 10, -1120210379),
           u = l(u, h, v, m, t[a + 2], 15, 718787259),
           m = l(m, u, h, v, t[a + 9], 21, -343485551),
           v = e(v, d),
           m = e(m, r),
           u = e(u, o),
           h = e(h, p);
       return [v, m, u, h]
   }
   function r(t) {
       var e, i = "", a = 32 * t.length;
       for (e = 0; e < a; e += 8)
           i += String.fromCharCode(t[e >> 5] >>> e % 32 & 255);
       return i
   }
   function o(t) {
       var e, i = [];
       for (i[(t.length >> 2) - 1] = void 0,
       e = 0; e < i.length; e += 1)
           i[e] = 0;
       var a = 8 * t.length;
       for (e = 0; e < a; e += 8)
           i[e >> 5] |= (255 & t.charCodeAt(e / 8)) << e % 32;
       return i
   }
   function p(t) {
       return r(d(o(t), 8 * t.length))
   }
   function v(t, e) {
       var i, a, s = o(t), n = [], c = [];
       for (n[15] = c[15] = void 0,
       s.length > 16 && (s = d(s, 8 * t.length)),
       i = 0; i < 16; i += 1)
           n[i] = 909522486 ^ s[i],
           c[i] = 1549556828 ^ s[i];
       return a = d(n.concat(o(e)), 512 + 8 * e.length),
       r(d(c.concat(a), 640))
   }
   function m(t) {
       var e, i, a = "0123456789abcdef", s = "";
       for (i = 0; i < t.length; i += 1)
           e = t.charCodeAt(i),
           s += a.charAt(e >>> 4 & 15) + a.charAt(15 & e);
       return s
   }
   function u(t) {
       return unescape(encodeURIComponent(t))
   }
   function h(t) {
       return p(u(t))
   }
   function f(t) {
       return m(h(t))
   }
   function g(t, e) {
       return v(u(t), u(e))
   }
   function b(t, e) {
       return m(g(t, e))
   }
   function y(t, e, i) {
       return e ? i ? g(e, t) : b(e, t) : i ? h(t) : f(t)
   }

至于如何用python跑出来,这个目前还不在小编的能力范围之内,今后会从这方面进行强化。如果哪位小伙伴跑出来了一定要通知小编啊!!!

最后,小编做了一个天眼查的自动搜索的程序,输入公司名就可以返回搜索公司的所有工商信息。每个公司的信息都是在这样的url(https://www.tianyancha.com/company/21475430)里,所以想获得信息,需要得到公司对应的ID。

在这个页面中,每个公司的ID号隐藏于这个标签内:

所以大体的思路就是,先在search页面获得公司的ID号,再拼接成完整的URL,获得该公司的信息。主函数如下:

代码语言:javascript
复制
if __name__=='__main__':
   names=['宁城县刘东种养殖专业合作社','优酷信息技术(北京)有限公司']
   ids=company_url(names)
   company_infs(ids)

如果搜索量很大的话,一定要加代理池,(这两天看了一个代理网站的测评,芝麻代理还是很不错的,可用率很高,响应时间很短,)不然你的IP就会被封掉。

-----------------END------------------

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-12-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT共享之家 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档