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的值。

至此所有參數已經就位,剩下就是寫代碼了。

代碼我也沒寫完,建立手勢模型識別率還是太低了,目前還沒有開源這份代碼的打算。


本文僅做技術交流,不涉及源代碼,請勿用於非法用途。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM