- 博客(63)
- 收藏
- 关注
原创 【khbox补环境-3】原型链与 Illegal Invocation 保护机制
当调用浏览器原生方法时,如果this不是预期的对象类型,会抛出// 合法调用// 非法调用。
2026-01-12 06:48:17
755
原创 【web补环境篇-0】document.all
开新坑,之前的魔改node大概是有思路了,但是还需要结合实际来不断进行优化。就先拿document.all 试一下水。之前的思路是魔改node。但是在重新整理的过程中,由于编译耗时较久,选择了这个node addon的方式先实现一套轻量版的,等完善后再去移植到node原生进行完整node。通过addon ,可以在任何环境中直接导入 const addon = require(‘./addon’) 即可使用。这个./addon是编译好的 addon.node扩展。
2026-01-10 22:15:37
1226
原创 一个cdp的检测
那么cdp 有没有办法被检测呢?更多文章,敬请关注gzh:零基础爬虫第一天。解法的话待后面再开新坑 <-_-!这里让ai给出了一个代码。
2025-12-25 23:46:49
301
原创 【DrissionPage源码-6】dp如何监听network和console
这一轮把 DrissionPage 里几块重点基本看了一遍:从Driver 到 元素对象的构造(、三类 ID 的互转和懒加载),到网络层监听(ListenerDataPacket),再到控制台输出监听(Console),基本把页面结构、网络流量、前端日志这三条主线都串了起来。DOM 域(DOM.*)负责节点的查找、描述、属性与结构;Runtime 域(Runtime.*)负责在具体对象上执行 JS,并把返回值再包装回 Python;Network 域(Network.*
2025-12-25 23:44:55
1012
原创 【DrissionPage源码-0】了解CDP
1. CDP 的本质:JSON-RPC over WebSocketCDP 并不是什么魔法,它本质上就是一堆 JSON 数据包在 WebSocket 上发来发去。当打开 Chrome 浏览器的F12 开发者工具时,那个“开发者工具窗口”其实就是一个用 HTML/JS 写的前端网页。当点击“Console”选项卡时,工具发送了一条 CDP 命令给浏览器内核。当点击“Network”查看抓包时,浏览器内核通过 CDP 把请求数据推送到工具界面。通信过程示例:"id": 1,
2025-12-25 23:42:24
817
原创 【node源码-6】async-hook c层修改以及测试
只是这个FSREQCALLBACK 等不明显,回头改成对应的函数名试试。这个输出的太多了,还是要修改成过滤的模式,也没有输出tostring。回调函数的tostring, 但是一直获取不到业务代码app.js的堆栈。突然想起来,这里没有必要也不应该输出堆栈,否则日志量就太夸张了。位置:D:\Code\C\node\src\async_wrap.cc。emm 这个不是给人看的,是给机器看的。但是这个貌似c层也有解决方案。其实就是把上面的js 逻辑写到下面的cc里。测试一下异步hook。
2025-12-24 20:06:16
406
原创 【node源码-5】Async Hooks使用
init 的特殊性同步调用:在创建异步资源时立即执行可能递归:如果你在 init 中创建新的异步操作,会再次触发 init性能影响:每个异步操作都会触发,高频场景下开销大before/after 的配对总是成对出现(即使回调抛异常)可以用来实现上下文传递(CLS - Continuation Local Storage)用来测量异步回调的执行时间destroy 的不确定性可能延迟调用(依赖 GC)某些类型可能不会触发 destroy不能依赖 destroy 做关键的清理工作。
2025-12-23 21:13:23
732
原创 【node阅读-3】Execution__Call分析
直接关系:这是V8 函数调用的统一入口(对象访问(Interceptor 触发点)。函数调用JSEntrystub → 栈帧 → 执行。:Proxy 或自定义 getter/setter 在Invoke内部触发。Dispatcher:Fast API(C++ 绑定)或 IC(JS 缓存)都在Invoke分支处理。这段代码就是 V8 处理对象访问(this/Interceptor)和函数调用(Dispatcher/JSEntry)的核心实现,Node.js 的fn->Call最终走的就是它。
2025-12-23 20:25:23
1021
原创 【node源码-2】Node.js 启动流程
↓↓LoadEnvironment() → StartExecution() → 选择入口 JS↓↓↓你的 app.js 执行 → 进入事件循环(uv_run()) → 直到进程结束你的 app.js 顶层代码执行(同步部分)↓异步任务注册(setTimeout、fs.readFile 等) → 进入 libuv 事件循环↓事件循环运行(uv_run()) → 处理所有异步回调、微任务↓事件循环清空 → 返回退出码↓NodeMainInstance::Run() 返回↓。
2025-12-23 20:06:41
999
原创 【node阅读-0】下载编译node
是 C++ 标准库(头文件)提供的智能指针之一,用于自动管理动态分配对象的生命周期,支持多个指针共享同一个对象的所有权。共享所有权:多个shared_ptr可以指向同一个对象,当所有shared_ptr都销毁或重新指向其他对象时,才会自动删除底层对象。引用计数:内部使用一个引用计数器(reference count)记录有多少个shared_ptr共享这个对象。拷贝/赋值时:计数 +1析构或 reset 时:计数 -1计数降为 0 时:自动delete管理的对象。
2025-12-17 23:32:39
845
原创 【补环境框架】序
最近在研究补环境框架的实现,发现了一些有意思的东西。现有的框架虽然能用,但代码量大得离谱。本文会深入分析现有方案的工作原理和致命缺陷,最后提出一个基于V8魔改的优化思路。
2025-12-15 23:51:21
1052
原创 【爬虫框架-7】日志追踪实现
在分布式爬虫系统中,一个初始请求可能会派生出数十子请求(列表页→详情页→评论页→下一页…),这些请求分布在不同的消费者进程中执行。如何追踪整个任务链的执行状态、性能瓶颈以及调用关系,成为系统可观测性的核心挑战。
2025-12-15 22:08:36
668
2
原创 【爬虫框架-6】中间件的另一种写法实现
中间件(Middleware)是爬虫框架中的拦截器模式实现,它允许你在请求发送前和响应返回后插入自定义逻辑。
2025-12-10 13:21:30
940
原创 【爬虫框架-5】实现一下之前的思路
其实之前写的redis 统计,虽然是看起来有用,但是后来有评论给了新的思路,就是发布的时候 直接新定义新的队列。即同一份代码,发布的时候 预定义新的队列比如 批次号1201009_task1 ,1201010_task1 ,然后只要确定能自己自动消费即可。这是任务 发布的demo ,通过判断单个任务的is_success,收集到当前这个队列中发布任务的情况。当然,既然是类静态方法, 传入的类参数 是要有个重新实例化的地方:_get_or_create_spider_instance。
2025-12-10 13:18:12
222
原创 【爬虫框架-4】统计的用法
当然,这个做法在当前看来也不是最优解,也希望能有幸和读到的人一起探讨。# 在这里可以打点:任务执行成功后续还需要根据监控的四大黄金指标不断完善。更多文章,敬请关注gzh:零基础爬虫第一天next~
2025-12-07 07:58:53
1601
3
原创 【爬虫框架-3】闭包的用法
这也是我的第一版做法,把类相关的信息传过去,消费的时候冲洗构造实例。同时还要维护一个实例缓存,避免每次都重新从meta参数转实例。如果你需要记录一些状态(比如计数),通常会写一个类。但如果逻辑很简单,用类有点“杀鸡用牛刀”,闭包是更好的选择。有时候我们定义了逻辑,但不想立刻执行,而是想把逻辑和参数打包好,等需要的时候再执行。4.闭包的终极形态:装饰器(Decorator)装饰器就是:接受一个函数,返回一个闭包。外部变量是没问题的(如例1),但如果要。外部变量(如例2的计数器),必须使用。
2025-12-07 07:56:16
395
原创 【爬虫框架-2】funspider架构
如果能看到这里,说明这个流程基本已经了解了。其实就是一个同步的,先publish任务扔进队列,然后启动消费,采集+ 解析+入库。当然,任意一个部分出错+重试,都有funboost 兜底来重试,这个框架简直是绝了。爬虫有相当多的参数功能就可以直接用funboost。就是这里动态创建队列的时候,官方文档给了demo ,动态生成队列 ,以及使用类方法。但是动态生成队列 +使用类方法 就有点麻烦了。根据解析名创建队列。在上述代码中,有一个。这个我们回头再解决~
2025-12-05 21:45:30
983
1
原创 【爬虫框架-0】从一个真实需求说起
当我第一次接到这个需求时,觉得很简单:每天早上 08:00 自动采集10000条商品数据,采集完成后立即验证数据完整性,然后生成报表推送到业务系统。用 Scrapy 写个爬虫,加个定时任务,不就搞定了?08:00 - 触发采集任务08:??- 采集什么时候结束?08:??- 数据验证要等到什么时候才能开始?这个看似简单的"等待采集完成"的需求,让我重新审视了爬虫框架的设计。初始队列:10000 个 URL↓第一轮采集:9800 成功,200 失败 → 200个自动重试↓。
2025-12-04 20:00:00
1584
1
原创 左右互搏03-so调用java md5-android开发
viewmodel加个 triggerEncryption 方法。fragment 加一个点击处理逻辑。在home xml 中加一个按钮。通过jni 生成这个java。
2025-01-26 07:18:41
104
原创 左右互博02-unidbg主动调用外层so函数
另一个是 module.findSymbolByName(“md5Enc”);// findSymbolByName 里面 尽量填ida里面的方法,这个动态注册的demo ,另一个是 动态注册的 要 dm.callJNI_OnLoad(emulator);这里有几个点 ,一个是要加载android.so unidbg 已经实现了。unidbg 代码。
2025-01-25 21:44:42
210
原创 左右互搏01-so 防直接hook之 左篇
稍微修改一下,另一个so 调用这个so,加密的时候,打开so 调用函数再关掉, 这样就没有一个好的调用时机了(主动构造除外)。如果java层直接调用, 那么frida 直接hook这个导出的函数就可以了 ,封装了一个统一出口函数 ,在另一个cpp中调用。当然也可以hook ,见下篇。这是一个魔改的md5。
2025-01-25 18:17:38
131
原创 安卓篇-unidbg初步测试
jni不知道自己可能会用到哪些java函数,但是这个abstractJni已经实现了一些基本函数如 stringClass.getBytes 如果有新的 就需要我们自己补一些。:目前app的进度是c层的md5魔改 已经做好,又套了一层java层的加密。刚好可以再熟悉一下unidbg。下一篇加个registernative的函数 和oncreate的函数在app 中。先看下app 的反编译的结果,很明显,源码很清晰 ,之前的混淆方式一点用没有。最新版的app ,作为demo测试一下。unidbg代码如下。
2024-07-20 21:23:34
372
原创 基础篇-appdemo升级
接之前gitee,想做个许多按钮的app,包括各种加密,检测等。突然想到可以做一个类似yrx的web题目列表样式的app,开始试一下。
2024-07-11 03:14:20
144
原创 sha1以及hmac 算法细节
先变hex 再补80 00 到512 bit ,这就是k·ipad之后的数据 和 明文的Hex形式 进行级联。opad之后的数据 与hash结果 进行级联。吧前面的k`和0x5c进行抑或 ,先把明文hex 比如koohai。级联后的数据 进行一次hash。级联后的数据 进行一次hash。比如key是 a123456。和0x36抑或 xor。和之前的hash 进行拼接。然后和上面的值进行拼接。扩展到分组长度的key。
2024-06-27 21:35:21
232
原创 md5在ida中的识别
ida中 识别md5 ,先右键转为hex 或者按h在ida中当然也可以使用搜索search imdate-value 搜索立即数 0x67452301;这是上面的init中的state一个数···
2024-06-23 08:34:14
215
原创 md5在ida中的识别
ida中 识别md5 ,先右键转为hex 或者按h在ida中当然也可以使用搜索search imdate-value 搜索立即数 0x67452301;这是上面的init中的state一个数···
2024-06-23 08:32:45
833
原创 嵌入md5
一些set和get 是对基本变量的绑定 ,有用的只有这个 onMd5Click。cmakelists.txt : 把两个cpp 都导入。接下来进入正题,要在安卓中导入cpp,fragment中调用。
2024-06-19 01:40:05
120
原创 鸽鸽鸽 ~
同时也有一个基于react的前端xpath 可配置界面, 基于scrapy crawlspider的通用爬虫想法正在实现,基本功能如下。在gitee上放了个仓库,正向写个app的demo,方便逆向及hook。鸽了好久不想写东西。有初步demo 了就挂链接。
2024-05-28 01:29:52
284
原创 yrx第一题补环境
先在浏览器中试一下,发现浏览器正常输出,由于预先知道了是md5的魔改和aes 的魔改。魔改算法暂时水平还不够,只能先补补环境。先运行一下,发现报错,抛出异常了,我们把正常js 放浏览器看一下。今天来挑战一下入门级别的 猿人学第二届第一题(作者说简单到离谱) 我信个g~老头子坏得很。如图,代码是直接发送的请求,token是在发送的时候生成的。通过调试发现,如果浏览器的话, 就直接返回 0xbb76994f。稍微跟一下,就会发现js是在match1.js 中。但是和浏览器对比了一下,哎值不一样。
2024-04-29 23:19:10
147
原创 某h5set参数
对比一下标准算法,加密一致,分别是md5和sha256. ijk计算好以后,body对象通过sha256加密,生成新的一个json去获取h5sec.这个js 用了ob 混淆,为了省头发,全量抠一下拿下来。这个js 是用ast 预先大概处理了一下,只还原了函数,本地覆盖一下即可。通过对图二和图1 断点分析,可以发现在进入sign 以后有了h5set参数。是个异步函数,执行到刚才的js里 ,会返回个json,包含h5st 的参数。依然在还原过的js里寻找,会在上面发现如下的函数。这是图1 附近的一些js,
2024-02-22 16:46:23
300
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅