58/anjuke 手势验证码破解思路

爬取安居客和58的房源信息,但是在大量爬取后发现会弹手势验证码,如下图

url可以参考:https://callback.58.com/antibot/verifycode?serialId=62cbf64a21ab4d309e722680c623a4e4_31ec33353c0648b7a5c97b1f2fb35976&code=22&sign=e6760461fc971994a2f3809ff536fbe9&namespace=anjuke_zufang_pc&url=.zu.anjuke.com%2Ffangyuan%2F1206610285371393%3Fisauction%3D1%26shangquan_id%3D1846

看着其实蛮复杂的,打码平台可能会省事些,但是咱们小本生意,于是还是得走破解的路(虽然少不了建立识别轨迹模型的算法。)

第一步

找校验的URL,通过校验请求,得知校验的url: https://verifycode.58.com/captcha/checkV3

所post参数有

responseId: 2a5bcbe427b944d799c6565934d971e7        #请求getV3接口获取的值(其实是图片的标识)
sessionId: d8c1366fd4a7440e9374672aab11ce5d         #网页中有
data: CF3E929E3855857D228AB815047E4218C4FA02CE4D75EAC2FB48C3BBD0B13E62799F838B8D1F0BA31627F84E998D1AA15092C72A694598BEE7AE0D0CC73C252B36ECCD12C928C2817F5C662810430D60B62B9F66B5E712FFB3B398E243BB9381E8E9FD9027B4F8EE6809433B69871468807A1D063081186E1A2F5B42ECC5C98356E704BFEB1616A545BA42F9CF1249521DEEF3C76330D2327BDA05AA6D863CBAD191C2553A0D0BC5E3C2D6E80460A7391548D57634D0B0DAB93B1B8698E7522EBA73BE478DCC6F170D2BBEA1BBC3AFC5FB45C48F43623587C780AF74D75E92D25A6DFCB07471F0514103AD85A81EEDE3407AEEF4A8AA18BC5458C14E3A8398BC288977AC6D6B1BA489FD13B264F82F537F19717D3370649B33F3B2B3952ED1C42B3C590E3B4B57129DF049E02727D7879972A3FD5E1E2647EE038E44A9233F3C61AD511285A9F0AD5AD157EF54530F0AA74E0862CFCDB9CADFC49E6772067C1AC608D6D9FE2A630605EED3878A737345C0E4AF098301F8F859FA31F8CC98F435B9C0D826D6FA26BB7385B08F86CA2BDE75B2A7E10648ED83AD2E0937FF0198B407451DCCCADA7797EB9D049D2523ACBD9FCD6FB717601A93F9FFA4B0269B2644F6E7AD277ABD5A829D8FE71A44466EF5D65A1010F8AC930F90A3263253562DC2B8647616FA4E7803C440BC92B8D93303D3B5A1FD49AF8532665ECFE6CB80845820B3135ECECCC9724714D41A753610A99F1AEE8EF03F167148DE4755141C4CFAF0015B00E0F2C1E4C9B850639174396857348A1D4402FC9E248E480FA6EB84F55D8A156044DC2DC92434B494CF2F47A3BC097D31B5E576B951E89034E153AA667B049BD16682A1FCC3F90E345954FC3021CA8D2450974806E20F9F4B7A57DD31D43B70D9F29A991D62D1E35A7971FF4544B653D18B75259F160F1EA9435BA425A883B4CD09E4A4C8CE9EBB71B7D34B45E451F63F0B4AB9EBB05DDA28E12566FC409B8EEA0C34066D5AC870670874633801BD3BC16F2F72FDE9AC9C92B8999E2C03F60579E1B9CAACE47494379BCB98A72DF774446F713A5D6AEDFA3F5D73AD6F53B6FF61BA725DD0D8F7271CC673AB647A80998916FDE5B47A0DB0F5A9758F0B3027910A1431AAEFB0CE70A4EDEDDF75B77335C7538827AF3435D21549DFB9C512E3D72E2E78F3DD442CCBA6B50B903777EB247481C9A05BA1478E7D4981EAC70505E8DD87813F90C1783B9CC1B69117180C36DA6692C59D479B0B01CEEC5144F972AA015E1CC06ADC5EC9F7677DC93FA6410A58CDA6CF9245A1BA7546BCACE09DD0F247A62BD6205021626A75A50CB8D68550C6473E892FAFEAD2ECA567A3525738C729F7971DBA5B63A5CBFCE550A3C1E5EFB9E32AAB005C3D9B93DEBD99951830710B2FD5E5676A5D4710318B953853002EF18E19AFBDDF18D2401D999F19549C1337D797BE0DACB9C3F3CEF64A9F5FA7EB004986BBE293C29F43619644465178E052479FDE0320F0C591BB78FC089B690D48C40728079DF7E5D4F62B0B39681B745550090E76A9C5E79E8B65889F1F507F6C65CAD71ED091485DD549195377819640421804598E86CB511CD20D5C039F0689E682535A2B330AC3ECC5F5FA16BA8F34898ED237A7DBFDAD6A2B08031ABCEC8E94BBEA78143B9577E861E32AFA4E410DAE905DE2448B981FD101A110594E0700BE3CCE16F64DA5F83394D99376D0651A35A6EBF3D9F8C2CB539D3A3DC83A761733A0BB79BBF2097457ECD155266D353738F1ECD5842A28B8833336AC6C6FFB0802B2BE9E50AF8213BD830E31CF809E7074B48EBA1D7D530B2B4B4F34E71D39127A7C781B639AF6AA128EEC79E9557D7334A2B244A23C168C93E3237E33CD8FB3BA4CDF14DA865EEA7B8C66C942E9DD2224E7643203729267282B36F11E6BECACA59D6204C4D5A3E62505A7AD013022FB68164B6FBA80FE168C7BEE069FB60D8D063F410E291860F1285121368EF70EDA51685E01A5431A4251E4CFDC7F2B164B3FD55CAA4CA83722C0B6C025E2C5CE727C9E4B9F14F2EC3AA9C617A06F757963CDF950C7BCF443990BB40DCF280A6F3F97C5AE1A8B1A6984BF8648671920F36C3320C5F918D17731EC817D15DE74FB49E8F80F4B7449FC8383835E15B9ACCC2D4B8598B5F6D90B97170EDCDD7D1198EB3E79A51CC615C03B1F9436535A7EFC0F258770DAD0D673AE75A9BFBA9FF50BFF76D5A87AE7D36B9FEA2D4AED2573120052F1512F38D1F3A0B260CFB94EF43FC46AEACB55A77287E1DED9F0788AAA1C48E7EF1ECCF11AB3FA5DDF9D3DAD6EF64B1BFB1C1F27D392E34CA9CA4B602BF039D13E29E9C9D7F6998AD9B1154135023FAC9D869A21C27BD6533D449038C9867F350C41CC18D34C5EA13C70C3E358965A2A9DBE5EACC1C1E305FF308E2545B8932187F78E95C58772AA3204DDC18F3996F32DA8FBB7D5A2C86AE108D206D249CCD4A7DAD8B6D82A67A363EC362134B2CC4E6FEE508CD1BC19E0238E0A3DFC17A072F3030345D842C757E1F26F1990EBAAFB3AFBFE61B1A29A96D5140590C9B7AD1D8ACA43AE96255EF0BA42AB9B88F651C76C29BEF486224A2F1A56638094D1D5E00A412A61DA6F99AED4B1304F6B0827CE154C3BF71EADB84FE5FC11FE9ED42C73A6A52340AA0020D0BA3396232E8D9AF390F526F0191ACC94B9324286C53D4264A0924B50D9067D6B88B3D1D76A0379AEF9D598B7CBCED70E8D044C645AD7D0C4716DB2E517FC2D9961684B2A4CC653946A0025CBE1B43EA07A8613C2D8299D355229FF42FF845389D6F3140A5F8E3AEDFF83A4DE67635B9637BA4C1186FBBA248752E635CF13008A80494AEAC7E293484511579525D47D746AD76BA9B186819759F518AC24CA125BCBF8368DE2DFABE95248F5F9E0CA072778DC97BE4568DE8CD7A3F93417C5E1632A9E78BF7328B22892E85AE64427DBB1F2B045CD4CCC81783B587A6978570057BB56D16062E9AB702C45536360E64FFE384432435E1E800FF24C65A928035C8076CA6C9B79A45D26575FC61E3F2D4E76F4DEDF08D1572B4775A56EF10910480CC4DD99522E398CB02B01FED208A17330B88EE7F3DA7A1BD35738C23D3E3F11D4BBACED866C0D0C723CAA39294BD2911EE475F1262EAEC94380DC3F78534538CBA778A720F540F0010E56907CA3717AB9AF1ED8742B6A82565BC472EBCC3056E6152150F53266628E39A5CB274171689165DCF7C021FBEDE905ADC2CF36C757B4CA309FABAD9ADBBB97CA10F5378681C4AABCBF  #加密后的轨迹数据

返回的参数有:

{"message":"校验成功","data":{"sourceimg":"/captcha/source_img/841bfe59c6b4b0913d0291a173610886e32ea9d3f4987da5cdcc116bec2c4f246b34711a786dc03bb7170fe36053f0b693cf195f30e49826b7eb492951c9a782","status":0,"successToken":"8643a0255a294133bec64d5e59c909de"},"code":0}

第二步

通过url找加密函数入口

pathGetCaptcha: "/captcha/getV3", # 这个是得到验证码的

pathVerfiyCaptcha: "/captcha/checkV3", # 这个是验证验证码的,从这个可以定位到校验函数,发现是ajax请求

明眼看到上面有个AES这个对称加密函数,大概率就是要通过它来加密data里的值,找一下确实是它进行参数加密,用的是CryptoJS加密

第三步

找齐参数,这一步涉及Debug,不要放过每个可能的点,多查看堆栈数据,多watch一些关键变量

先找找最简单的两个参数,sessionId和responseId

sessionId在网页里就有,可以直接对内容进行正则匹配出来

responseId则是通过js返回的,是请求验证码图片以及它的标识responseId

最复杂的应该就是这个d所代表的轨迹数据了

var d = s.AESEncryption('{"x":"' + (e || 0) + '","g":"' + c + '","p":"' + o.pj + '","finger":"' + (t.xxzlfingertoken ? t.xxzlfingertoken : "") + '"}');

打个断点再绘画一次轨迹,得到如下参数

可以看到加密所需的四个参数 e, c , o.pj, t.xxzlfingertoken。

这个e浪费了我一些时间,起初我以为e是函数i()里的值,后面发现是传参进来的

其中526行这里不能打断点,因为一滑动轨迹就会断到,然后这个i应该是和我们滑动的轨迹有关。于是回来又看堆栈里的r数组

我个憨憨发现了其中的奥妙,这个e就是轨迹数组里的最后一个坐标 - 第一个坐标的值,而且这个轨迹图永远都是向右滑,这样保证最后一个坐标点的X值永远大于第一个坐标的X值,也就是这个e参数永远是正值,这个可以做个校验滑动方向。

继续找接下来的参数,其中c为轨迹图,因为稍微懂点英文都能猜到,c应该是由r转换得到的字符串,而r列表里面的p应该就是各个point以及t停留时间。

o.pj好像一直都是[0,0]

最后一个参数 t.xxzlfingertoken 在js文件里只有这个e.token是最像我们要找的

这个function(e)里的e参数就触及我的知识盲区了,这个也不知道这个函数入口在哪,e里面就两个值status和token,确实找不到了,于是就拿token的值来直接搜索。

找到就是一个请求的返回值,而且对应了status和token,正好可以直接来用

然后就要找这个callback所传的参数,这个是加密的请求

_0x477bx1c这个值也能找到,接下来看看堆栈里的数据是啥

将上述的值在_0xe871里找到对应关系

var _0x477bx1c = ("dpjsonp_" + Math["random"]())["replace"](".", "");

这里也就是这个callback需要传的参数,只不过是通过math.random()随机数然后移除 . 

通过这个可以拿到token的值。

至此所有参数已经就位,剩下就是写代码了。

代码我也没写完,建立手势模型识别率还是太低了,目前还没有开源这份代码的打算。


本文仅做技术交流,不涉及源代码,请勿用于非法用途。 

猜你喜欢

转载自www.cnblogs.com/triangle959/p/spider-captcha.html
58