按照惯例,打开链接,鼠标右键查看源代码,啥也没有,啥也不是,不用说了肯定是ajax异步加载了

F12后刷新网页,观察请求,有个regist的请求有点可疑,细细观察一下,嗯,就是你了,响应是一些滑块的基本信息,后面会用到

我们看一下请求,没啥难的,红框内的参数都是固定的,callback是一个毫秒级的时间戳,这里篇幅有限,读者自行实现一下,或者看下我的代码

我们先清空历史请求,滑动一下滑块(不要验证成功),找一下验证的请求,这个fverify请求太明显了啊,看一下响应,REJECT拒绝,可以啊,有点对上了啊

咱们再滑一次验证成功的,刷刷的出来这么多请求,咱搜索一下fverify,出来两个请求,看下第一个,这不就是第一个失败的验证吗?再看一下第二个,啥也没有,别慌,双击请求,PASS通过,好家伙


咱们直接看fverify请求的参数,画红线的参数没啥难度,基本写死,参数callback同初始化滑块请求一个套路,参数rid是初始化滑块请求的返回值,剩下的参数才是重头戏,看到这些参数都是以=号结尾,我立马就想到了base64,很可惜,并不是,那来吧,真男人都是硬刚的

咱们去initiator看一下它的前世今生,checkApi,check啥呢,管它是啥,先打个断点调试一下

我们在source面板打开captcha-sdk.min.js文件,美化一下,在美化后的代码中搜索checkApi,看到这熟悉的switch,case,这不就是控制流平坦化吗,话不多说,switch那行(5270)打个断点,滑动一下,very good!成功断上

// 定义一个变量
case '1':
var _0x3c0fd6;
continue;
// 定义多个变量,并赋值
case '5':
var _0xf2a5df = this[_0x2721b1] // config object
, _0x2352cc = _0xf2a5df[_0x2519b2] // captcha.fengkongcloud.com
, _0x4a8aee = _0xf2a5df[_0x2978b9] // /ca/v2/fverify
, _0x57f0e6 = _0x1191f0[_0x14e9('0x1c5')](_0x4a8aee, undefined) ? _0x5f2e73 : _0x4a8aee // /ca/v2/fverify
, _0x351641 = _0xf2a5df[_0x48b1b5] // eR46sBuqF0fdw7KWFLYa
, _0x48b6e3 = _0xf2a5df[_0x5314e9] // default
, _0x626842 = _0xf2a5df[_0x13a5ad] // web
, _0x425cd2 = _0xf2a5df[_0x5dc37e] // 1.0.1
, _0x5882ed = _0xf2a5df[_0x4ffe15] // zh-cn
, _0x729c21 = _0xf2a5df[_0x435fdd]; // 1.1.3
continue;
// 定义一个变量,并赋值
case '6':
var _0x2d5d9f = this[_0x23b339](_0x39eb51); // 2020061923141589973e0f44c1b1f909
continue;
// 定义一个变量,接收getMouseAction函数的返回值,这里即验证滑块接口的部分加密参数,这个函数是我们重点分析对象
case '3':
var _0x352a92 = this[_0x34b0ce]();
/*
{
"act.os": "web_pc"
"be": "1mcjoxidh7A="
"dj": "6EmPUIMzqW8="
"jr": "osPWhvfh55w="
"ke": "i3H/MW2BvA0="
"kw": "3IHDWudhp8I="
"nw": "yxr7iVoFUnE="
"wz": "5dHGjcUFGUQeKPcpckf/"dHePXFxpARwxyPcm3aaozR2Y696w4+PIXuPqITNsJk5eXWBm"+3CjnCe8TIkfLrGIYgq97Kd6xYBVu02TWOALgMmal4AFTnB/+H2qWOduLjPP"
"zy": "bq4s2WHJ5YY="
}
*/
continue;
// 定义一个变量,并赋值
case '0':
var _0x16baf1 = _0x3b171f; // web
continue;
// 定义一个变量,并赋值
case '7':
var _0x5e801b = _0x238b36[_0x1fdcad][_0x35a24d]((_0x3c0fd6 = {'organization': _0x351641}, // organizationorganization,eR46sBuqF0fdw7KWFLYa
(_0x69c4cb, _0x566231[_0x1fdcad])(_0x3c0fd6, _0x5cf804[_0xdffe2f], this[_0x4a490f](_0x48b6e3)), // ik,pQ/2b0RtqwE=,getEncryptContent('default'),因为这三个加密参数和其他加密参数过于相似,我怀疑是同一加密函数,所以会在分析getMouseAction函数时写明
(_0x69c4cb, _0x566231[_0x1fdcad])(_0x3c0fd6, _0x5cf804[_0x55eafe], this[_0x4a490f](_0x626842)), // bx,5xp18atYFl8=, getEncryptContent('web')
(_0x69c4cb, _0x566231[_0x1fdcad])(_0x3c0fd6, _0x5cf804[_0x29fbfc], this[_0x4a490f](_0x5882ed)), // ly ey/BLBP7+Sc=,getEncryptContent('zh-cn')
(_0x69c4cb, _0x566231[_0x1fdcad])(_0x3c0fd6, _0x39eb51, _0x2d5d9f), // rid,2020061923141589973e0f44c1b1f909
(_0x69c4cb, _0x566231[_0x1fdcad])(_0x3c0fd6, _0x573912, _0x425cd2), // rversion,1.0.1
(_0x69c4cb, _0x566231[_0x1fdcad])(_0x3c0fd6, _0x59e760, _0x729c21), // sdkver,1.1.3
(_0x69c4cb, _0x566231[_0x1fdcad])(_0x3c0fd6, _0x5ca3e7, _0x5cf804[_0x30e79e]), // protocol,4
(_0x69c4cb, _0x566231[_0x1fdcad])(_0x3c0fd6, _0x251c0f, _0x16baf1), _0x3c0fd6), _0x352a92); // ostype,web
continue;
// 定义一个变量并赋值
case '2':
var _0x33ae65 = _0x238b36[_0x1fdcad][_0x2b1c84](); // 1592580515130
continue;
// 给已定义的变量赋值
case '4':
_0x238b36[_0x1fdcad][_0x232778][_0x368fac] = _0x33ae65; // 1592580515130
continue;
// 调用getJSONP函数
case '8':
_0x5c1d93[_0x283873](_0x21da6a, _0x2352cc, _0x57f0e6, _0x5e801b, _0x1daed1);
continue;
14:估计是定义一个slide吧
image
10:从初始化滑块获取一些基本信息,验证了我们前面的想法
image
0:base64decode,看到这里,可以打开console面板验证一下我们的想法,window.atob('CSAEgk97Hm4='),结果完全一致
image
11:DES,这里用的是CBC模式,用0填充,密码是sshummei,并取0-8位
//看到'sshummei'和_0x516e7e,猜测其中一个作为密码,另一个作为密文 //看到['substr'](0, 8),这里很明显的趣结果0-8位 //看到0,0,猜测应该是zeropadding填充 //然后写代码测试,猜的还是挺准的。。。 var _0x24b6fc = _0x4403df['default']['DES']('sshummei', _0x516e7e, 0, 0)['substr'](0, 8);image
8:这里定义了多个变量,赋值mouseData、startTime、...、blockWidth,具体意思可以根据变量名猜测
var _0x12d747 = this['_data'] , _0x2b08e7 = _0x12d747['mouseData'] , _0xa71082 = _0x12d747['startTime'] , _0x2cb8d7 = _0x12d747['endTime'] , _0x45a948 = _0x12d747['mouseEndX'] , _0x42a39b = _0x12d747['trueWidth'] , _0x325810 = _0x12d747['trueHeight'] , _0x3ab199 = _0x12d747['selectData'] , _0x463fbc = _0x12d747['blockWidth'];9:定义了一个变量,值为'web_pc'
//var 'web_pc' = this['getOs'](); var _0x554304 = this[_0x576853](); var 'web_pc' = this['getOs']();3、6:分别定义了一个空的object
var _0x753835 = {}; var _0x130e3f = {};7:这里经过多次调试,可以确认一些值为固定值,需要解决的参数为zy、dj、wz
image
根据上图可知zy,dj,wz分别是k5、k7、k6,这里根据值还是很好分析的,zy为滑块到缺口的距离/400,dj为按下滑块到松下滑块的时间,wz为滑动轨迹,分别是鼠标的x坐标、y坐标、以及时间
4:console的值为1
image
13:这里给ke变量赋值runBotDetection函数的返回值,检测是否使用了webdriver,1为使用了,0为未使用
image
12:这里给nw变量赋值为1
image
2:使用getEncryptContent函数对7处获取的数据逐一加密,即DES加密
image
1:获取11处的key
image
5:返回值正是我们在checkApi中获取的值
image
1、基本上分析了所有的参数,有些参数是固定值,就交给你们了
2、完整代码,该项目不再维护,分析过程、参数加密方法已于文章说明
3、该项目仅供学习参考, 请勿用作非法用途! 如若涉及侵权, 416828817@qq.com/18355094977@163.com, 收到必删除!!!
GivenIamadumbprogrammerandIamusingrspecandIamusingsporkandIwanttodebug...mmm...let'ssaaay,aspecforPhone.那么,我应该把“require'ruby-debug'”行放在哪里,以便在phone_spec.rb的特定点停止处理?(我所要求的只是一个大而粗的箭头,即使是一个有挑战性的程序员也能看到:-3)我已经尝试了很多位置,除非我没有正确测试它们,否则会发生一些奇怪的事情:在spec_helper.rb中的以下位置:require'rubygems'require'spork'
使用Ruby1.9.2运行IDE提示说需要gemruby-debug-base19x并提供安装它。但是,在尝试安装它时会显示消息Failedtoinstallgems.Followinggemswerenotinstalled:C:/ProgramFiles(x86)/JetBrains/RubyMine3.2.4/rb/gems/ruby-debug-base19x-0.11.30.pre2.gem:Errorinstallingruby-debug-base19x-0.11.30.pre2.gem:The'linecache19'nativegemrequiresinstall
我有:When/^(?:|I)follow"([^"]*)"(?:within"([^"]*)")?$/do|link,selector|with_scope(selector)doclick_link(link)endend我打电话的地方:Background:GivenIamanexistingadminuserWhenIfollow"CLIENTS"我的HTML是这样的:CLIENTS我一直收到这个错误:.F-.F--U-----U(::)failedsteps(::)nolinkwithtitle,idortext'CLIENTS'found(Capybara::Element
Ruby是否有逐步调试器,类似于Perl的“perl-d”? 最佳答案 ruby-debug(对于ruby1.8),debugger(对于ruby1.9),byebug(对于ruby2.0)以及trepanning系列都有一个-x或--trace选项。在调试器内部,命令setlinetrace将打开或关闭线路跟踪。这是themanualforruby-debug原来的答案已经修改,因为数据噪声文章的链接,唉,不再有效了。还添加了ruby-debug的后继者 关于ruby-Ruby
我开始了一个新的Rails3.2.5项目,Assets管道不再工作了。CSS和Javascript文件不再编译。这是尝试生成Assets时日志的输出:StartedGET"/assets/application.css?body=1"for127.0.0.1at2012-06-1623:59:11-0700Servedasset/application.css-200OK(0ms)[2012-06-1623:59:11]ERRORNoMethodError:undefinedmethod`each'fornil:NilClass/Users/greg/.rbenv/versions/1
rails新手。只是想了解\assests目录中的这两个文件。例如,application.js文件有如下行://=requirejquery//=requirejquery_ujs//=require_tree.我理解require_tree。只是将所有JS文件添加到当前目录中。根据上下文,我可以看出requirejquery添加了jQuery库。但是它从哪里得到这些jQuery库呢?我没有在我的Assets文件夹中看到任何jquery.js文件——或者直接在我的整个应用程序中没有看到任何jquery.js文件?同样,我正在按照一些说明安装TwitterBootstrap(http:
我有一个包含多个组件的存储库,其中大部分是用JavaScript(Node.js)编写的,一个是用Ruby(RubyonRails)编写的。我想要一个.travis.yml文件来触发一个运行每个组件的所有测试的构建。根据thisTravisCIGoogleGroupthread,目前还没有官方支持。我的目录结构是这样的:.├──构建服务器├──核心├──扩展├──网络应用├──流浪文件├──package.json├──.travis.yml└──生成文件我希望能够运行特定版本的Ruby(2.2.2)和Node.js(0.12.2)。我已经有了一个make目标,所以maketest在每
文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景 最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。 在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记
我已经开始使用RubyMine6。我正在处理Rails4、Ruby2.1.1项目。我无法找到如何使用Pow作为服务器调试到RubyMine。你能给我指明正确的方向吗? 最佳答案 我能够使用远程调试从RubyMine进行调试。我正在使用RubyMine6、Rails3、Ruby2.1.1。首先创建一个.powenv文件并添加:exportRUBY_DEBUG_PORT=1234exportPOW_WORKERS=1将以下gem添加到您的Gemfile:gem'ruby-debug-ide'gem'debase'创建一个新的初始化器st
当我编写代码时,我非常频繁地使用“puts”语句进行调试。它允许我查看服务器中发生的情况。在调试代码的时候,不知道是什么原因,我把这些“puts”语句去掉了。这是个好主意还是我应该保留它们以使我的服务器日志更加清晰? 最佳答案 您应该使用记录器而不是puts。使用这种语句:Rails.logger.debug"DEBUG:#{self.inspect}#{caller(0).first}"ifRails.logger.debug?如果您想(几乎)实时查看调试,只需在另一个终端窗口中使用tail命令:tail-Flog/develop