# sm 滑块 # 受害对象网址: 滑块验证 (xiaohongshu.com) # STEP1 网站请求分析: 加载内容如下: 加载 HTML (这一部分会 set-cookie 发送 304 请求),加载一部分 js、css 发送第一个 web?callback 请求 发送 conf?callback 请求 在加载一部分 js 发送 register 请求 这里发送 register 请求后就拿到了滑块背景以及滑块、同时观察,貌似只有个携带时间戳的参数,以及 organization, 经测试,register 请求可以直接请求,但是每次请求返回的结果都不一样, # STEP2...

# 基础知识篇 # 多线程 # Basic 线程为程序的最小执行单位,在 python 中用 Thread 库来控制线程。 import threadingimport time # 通过类携带 target 参数,直接生成线程类,同时,current_thread ().name 可以返回当前类的名称,线程的实例化可以通过调用 is_alive () 来判断线程是否存在。def test1(): for i in range(5): print(threading.current_thread().name,i) time.sleep(1)def test2(): for i in...

# 验证码概述 所谓验证码,就是采取一定的手段,对爬虫采集数据增加一定的难度,要想从 js 端突破这个问题,就需要对验证码的传输过程有一定的了解,这里仍然以 jy 滑块为例。 # JY 滑块 # 流程分析 # 页面初始化 首先 F12 对网页进行抓包可以看到,这里首先是加载了一个 html 页面,然后加载了 2 个 js,接着,向服务器发送了一个 register 请求,这里的 t 参数是时间戳,然后返回了 gt,challenge 这两个主要参数,然后是 geetype 请求,主要是用于请求 Js, 然后加载了 fullpage 这个 js,之后是向服务器发送了一个 get...

# AST 思考 本篇重在介绍关于 ast 还原代码的一些逻辑。 首先,我们知道,以目前常见的混淆来讲,大部分其实是通过不断地调用一个类似生成函数的地方,来调用。 我们在分析时,往往想看到其直接调用的位置,那么,我们就需要将所谓的生成入口写入内存中,然后直接调用进而达到直接将调用的结果展示出来。 通常,普通的混淆生成入口有如下四种: 数组型 函数形 对象型 组合型 # 数组型 所谓数组型,就是类似以数组的形式,通过数组下标访问。例如: var arrlist = [1,2,3];var b = arrlist[1];对于该种情况,我们抽象为如下四步: 确定要遍历的对象,这里是...

# AST 基本命令 # path path 为 AST 解析后的产物,在解析时,先将所有代码解析为一个大 file, 其中拥有 path 属性,若是针对一种表达式解析 (例如 VariableDeclarator 赋值表达式),那么 path 指代的就为赋值表达式所在的路径,其中又包含很多属性,主要的有: type: 表示表达式类型 node 表示该节点、为一个对象、包含很多属性 parent: 该路径的父路径,这里指代的是 node 类型,若要获取 path 类型需要 path.parentPath. 如 var a = b; 那么 a=b 为赋值表达式当前路径、var a = b...

# 反调试 所谓反调试就是在网站中嵌入 debugger,然后对控制台进行检测,若打开了控制台则进入无限 debugger; 解决方案: 直接右键 never pause here 若采用定时器的形式调用,将其置空 setInterval = function(){} //f12 打开断住后输入,再跳过 debugg,就不卡了for (var i = 1; i < 99999; i++) window.clearInterval(i); 若在原型链上 f=Function;Function=function(a){...

# 反调试 所谓反调试就是在网站中嵌入 debugger,然后对控制台进行检测,若打开了控制台则进入无限 debugger; 解决方案: 直接右键 never pause here 若采用定时器的形式调用,将其置空 setInterval = function(){} //f12 打开断住后输入,再跳过 debugg,就不卡了for (var i = 1; i < 99999; i++) window.clearInterval(i); 若在原型链上 f=Function;Function=function(a){...

# 极验滑块: https://www.geetest.com/demo/slide-bind.html # 登录参数 w 值 F12,点击登录,弹出滑块界面,出现滑块图和背景图,拖动滑块,会发送请求: 参数如下:gt\challenge\w\callback (其余的貌似不为加密) 明显,在该请求中生成了这些参数。 跟值,找到生成参数的位置。 u = r[$_CAGEe(750)]() , l = V[$_CAGEe(342)](gt[$_CAGEe(209)](o), r[$_CAGEe(742)]()) , h = m[$_CAGEe(733)](l) , f = {...

# 补环境介绍 对于存在 js 加密的网站,我们往往通过分析网站 js,了解到其加密 js 的逻辑,然后通过本地运行的方式,获取加密后的参数,达到获取 Js 的目的。 对于加密代码量较少,亦或者是扣取复杂度较低的代码,我们可以通过扣代码,缺什么补什么,进而在本地扣取一个完整的加密算法,最终在本地运行。但是,对于加密量大,同时运行流程错纵复杂的代码,扣取其加密流程的复杂度呈几何倍的增长,因此,我们希望通过直接运行整个 js 代码,进而达到获取其结果的目的。 试想,为什么我们在浏览器中运行 js 可以直接成功,但是在本地运行就不行了呢? 首先,本地运行的时候,我们大部分是采用的 node...

# AST 语法树介绍 AST 全称 Abstract Syntax Tree, 中文名称为抽象语法树,主要原理就是把代码通过词法分析和句法分析转化为一颗树的形式,对于树来讲又包含很多节点,其中包含了变量的位置,类别,值等一些参数。 例如: var a = 3;对应的 AST 解析结果为 (采用 Babel 解析,结果只取 body.declarations 中的内容): Node { type: 'VariableDeclarator', start: 4, end: 9, loc: SourceLocation { start:...