轩哥代码库 - 数据分析与深度学习
type: channel
link: http://code.chboy.top/category/Data_Analysis_Deep_Learning/
items: 学习通屏蔽Console的解决方案
items: labelimg退出重进载入class||labelimg关闭后重新进入w新建标注信息不见||labelimg接着退出前的数据继续标注
items: 基于中国铁路12306公布的火车信息等数据进行数据分析与数据可视化
items: 工业无损检测 _ 使用教程
items: 物流信息批量查询之JS混淆逆向跟栈分析
items: itdog测速脚本JS脚本混淆分析

学习通屏蔽Console的解决方案
type: item
date: 2025-04-10T12:52:30+08:00
description: 最近研究学习通逆向的时候，发现学习通做了无限debugger()措施，通过跟战分析，发现具体的导致无限debugger()的JS文件位于"a\mooc1.chaoxing.com\ananas\space\exam\jsenc_js_work.js"的532行附近。注释掉相应的代码即可，最后慢慢分析！var _0x2360 = ['\x65\x4d\x4b\x57\x4c\x38\x4b\x4c\x77\x34\x6e\x44\x67\x41\x55\x3d', '\x77\x71\x78\x55\x63\x43\x4c\x43\x68\x77\x3d\x3d', '\x77\x70\x72\x43\x6e\x31\x62\x43\x67\x7a\x55\x3d', '\x66\x77\x70\x4e', '\x56\x73\x4f\x2b\x49\x6c\x38\x3d', '\x77\x37\x77\x66\x5a\x63\x4f\x75\x77\x34\x4d\x3d', '\x58\x38\x4b\x79\x45\x63\x4b\x7a\x77\x70\x34\x3d', '\x77\x37\x55\x36\x77\x72\x2f\x43\x67\x41\x6b\x3d', '\x77\x36\x49\x6e\x77\x72\x44\x43\x6b\x41\x4e\x39\x51\x67\x3d\x3d', '\x4d\x38\x4b\x30\x77\x37\x73\x3d', '\x77\x35\x42\x75\x77\x70\x4c\x44\x76\x51\x3d\x3d', '\x77\x34\x67\x6b\x50\x73\x4b\x77\x4d\x4d\x4f\x46\x59\x51\x3d\x3d', '\x42\x38\x4b\x4b\x44\x4d\x4f\x63\x77\x6f\x51\x3d', '\x77\x70\x51\x50\x77\x37\x6e\x43\x75\x38\x4b\x56\x77\x36\x49\x4d', '\x77\x37\x67\x75\x77\x6f\x78\x64\x44\x44\x48\x44\x6b\x41\x3d\x3d', '\x41\x55\x34\x51\x57\x68\x62\x44\x73\x41\x67\x74\x59\x51\x3d\x3d', '\x41\x4d\x4b\x41\x41\x4d\x4f\x61\x77\x6f\x77\x38\x66\x67\x3d\x3d', '\x77\x6f\x62\x44\x6d\x63\x4f\x78\x77\x6f\x35\x6b', '\x77\x71\x63\x6e\x4e\x52\x6a\x43\x76\x51\x3d\x3d', '\x77\x72\x4c\x43\x67\x38\x4b\x43\x57\x73\x4b\x75\x4f\x51\x3d\x3d', '\x53\x30\x6a\x43\x6b\x57\x52\x39\x4f\x67\x6a\x44\x68\x68\x33\x43\x75\x38\x4f\x32\x77\x36\x73\x6e\x55\x51\x3d\x3d', '\x4f\x63\x4f\x41\x53\x73\x4f\x78\x77\x37\x72\x44\x6c\x67\x3d\x3d', '\x5a\x51\x52\x47\x62\x38\x4f\x43', '\x42\x4d\x4b\x4b\x47\x73\x4f\x73\x77\x6f\x38\x31\x64\x67\x50\x43\x6b\x73\x4f\x51\x50\x67\x54\x43\x72\x38\x4b\x45', '\x45\x31\x6b\x42\x56\x44\x54\x44\x6f\x51\x30\x6a\x65\x7a\x4d\x5a\x50\x73\x4f\x6b\x77\x36\x34\x3d', '\x77\x35\x30\x71\x50\x4d\x4b\x32\x4f\x67\x3d\x3d', '\x44\x63\x4f\x2b\x61\x38\x4b\x4f\x77\x35\x2f\x44\x70\x47\x49\x3d', '\x77\x35\x72\x44\x71\x67\x62\x43\x75\x73\x4f\x39', '\x4d\x47\x70\x72\x77\x35\x74\x42', '\x44\x73\x4b\x77\x50\x32\x33\x44\x6e\x38\x4f\x4d\x77\x35\x50\x43\x6a\x73\x4b\x72\x4f\…

labelimg退出重进载入class||labelimg关闭后重新进入w新建标注信息不见||labelimg接着退出前的数据继续标注
type: item
date: 2025-03-26T10:04:00+08:00
description: 问题如下图如何断点重续打开\venv\Lib\site-packages\labelImg\labelImg.py 文件在labelimg文件1252行 self.default_save_dir = dir_path 下面加入以下代码 if dir_path is not None and len(dir_path) > 1: self.default_save_dir = dir_path # 加入以下代码 files = os.listdir(dir_path) # 判断是否存在名为 class.txt 的文件 if "classes.txt" in files: self.label_hist.clear() # 不清空继续打开其他标注文件不会删除原来的 with open(dir_path + "/classes.txt", 'r') as f: for line in f.readlines(): line = line.strip() if self.label_hist is None: self.label_hist = [line] else: self.label_hist.append(line) 加入后重新按照 Open dir->Change Save Dir顺序打开文件,即可重新读取Change Save Dir下的classes标注信息使用前建议备份一下 目前我用是没啥问题 不知道有啥隐藏bug。os:因为这个问题导致我标了一天的信息全被覆盖了。干!

基于中国铁路12306公布的火车信息等数据进行数据分析与数据可视化
type: item
date: 2024-12-19T16:18:11+08:00
description: 项目概要项目名称基于中国铁路12306公布的火车信息等数据进行数据分析与数据可视化项目背景随着中国经济的持续发展和城市化进程的加速，人口流动日益频繁，铁路运输作为中国最重要的公共交通方式之一，承载了巨大的客运量。本项目旨在利用中国铁路12306公布的火车票价格等公开数据，通过数据分析与可视化技术，探索票价趋势、出行模式，提供直观的数据洞察，辅助决策优化和服务提升。分析范围本项目主要分析中国铁路12306公布的较为繁忙的铁路线路的火车车次、火车类型、火车出发时刻/到站时刻、火车始发站/终点站、火车票价等进行数学分析和数据可视化。实现思路[!NOTE]为确保项目实现过程与课程教学内容紧密对应，本项目将依据课程中讲授的知识点逐步实现相应功能。尽管实现方法可能非最高效途径，但旨在强化理论与实践的结合，确保学习效果。编写开发文档一个好的项目避免不了需要一个好的开发文档，为了实现此项目，特编写了这篇开发文档，因为了保持和课程教学内容紧密对应，本篇文档将采用MarkDown编写。数据采集本次选取了piao.gaotie.cn网站进行火车数据的数据采集，并加入了代理IP进行高效爬取，谨防出现IP被封禁等情况。为了更好的实现数据采集的功能，我将数据采集(GetData)与代理(Proxy)制作成了两个软件包，供主函数调用。为了更高效的使用IP代理，减少数据采集带来的麻烦。我将代理IP的软件包制作成了一个Class(类)对象，进行代理调度让采集更高效，以更好的实现数据采集。通过上述步骤，将采集好的数据通过Python中的List(列表)特有的数据类型返回给主函数进行调用。[!WARNING]本项目侧重点为数据分析与可视化，故数据采集的具体实现方法与过程将不再过多讲述，详情可查看源代码。数据写入与保存将数据采集返回的数据保存到运行目录下的/data文件夹下（在保存前，应先判断此路径是否存在，如不存在应先创建），将为每一条火车线路单独创建一个csv文件，实现数据的分别保存。 # 获取火车数据并写入csv文件，准备数据处理 # 注意：如是火车，则动车组二等座的价格为硬座价格。 # TODO 数据获取与写入 # START------------------------------------------------ data, city = GetData_Package.get_data() # 获取数据的函数 for index, item in enumerate(data): #循环取值 city_from = city[index]["from"][0] #获取火车的出发地 city_to = city[index]["to"][0] #获取火车的目的地 with open(r"data/" + city_from + "-" + city_to + ".csv", "w", newline="", encoding="gbk") as files: #创建文件对象 writer = csv.writer(files) # 创建csv对象 writer.writerow( ['车次', '空白值1', '类型', '出发站', '空白值2', '到达站', '出发时间', '到达时间', '运行时长', '动车组票价', '火车组票价', '空白值3']) # 在数据爬取中，有空白列，在后续处理 writer.writerows(item) # 写入数据 # END------------------------------------------------[!CAUTION]至此，数据采集与文件写入已完成，下面将开始进行数据分析。数据分析前提条件：读入csv文件进行数据分析的前提需要读入csv文件，在csv文件中进行分析。因本项目中，将每一条火车线路都单独创建了一个csv文件，所以在读入时，我采用了循环读入文件。 data, city = GetData_Package.get_data() # 获取采集后的数据 for index, item in enumerate(data): city_from = city[index]["from"][0] #获取火车的出发地 city_to = city[index]["to"][0] #获取火车的目的地 file_path = f"data/{city_from}-{city_to}.csv" # 读取CSV文件到 DataFrame df = pd.read_csv(file_path, encoding='gbk', na_values=' - ') # 后续数据分析的代码都在此循环内依次进行数据分析_第一步：空白列删除（缺失值处理）因数据采集后的数据有多余无意义的数据，为了保证数据分…

工业无损检测 _ 使用教程
type: item
date: 2024-12-04T13:42:00+08:00
description: 组装硬件将提供的设备进行组装，有相机组件、机械臂组件、传送带组件。其中，机械臂组件还需要与吸盘、夹爪组装。(如果是螺丝检测，则应该组装夹爪；如果是PCB检测，则应该组装吸盘)传送带组件中，还有红外线检测仪器。项目文件螺丝加工件处理数据采集与标注数据采集本项目中，数据采集使用"MAIN_DH.py"文件，直接在终端内执行(执行命令前需要cd至代码主路径下)python3 MAIN_DH.py执行命令后，会打开GUI窗口，如图所示：其中具体功能详情如下：打开相机关闭相机采集图像数据连接机械臂断开机械臂机械臂回零关闭真空发生器显示机械臂现在的笛卡的坐标XYZR的值控制机械臂XY方向运动控制机械臂Z方向与R旋转设置中转点将8现在的坐标值设置到中转点位运动到中转点设置抓取点将8现在的坐标值设置到抓取点位运动到抓取点设置机械臂抓取机械臂在XY方向的偏差显示日志信息选择放置物料的类别开始零件分类开始PCB分类调用执行开始保存设置的点位信息调试完成后勾选记录比赛根据17设置的类别设置对应类别的放置点运动到17选择的点位数据采集后，数据保存到主路径的上一级目录下的"save_image"文件夹下。数据标注此时，应该在项目主目录下新建一个文件夹，然后把"save_image"文件夹下的文件复制到新建的文件夹下。cd进入这个文件夹后，在终端执行：labelimg会打开数据标注工具"labelimg"，如下图所示：打开标注照片的文件夹设置标注完成保存位置（将采集的图片.jpg文件和打完标签的.txt文件保存在一个文件夹里）打完标签完成后可以打开该文件里的classes.txt文件，若里面的东西只有本次打标签的名字，则正确。格式选YOLO可以在 Edit 里面选择"auto save"（自动保存）注意事项：标注PCB缺陷数据集的时候必须标注一个名为PCB的类，为pcb抓取定位位置（没有这个类无法定位抓取）。需要将有问题的PCB板的问题处特别标定。模型训练在数据采集和训练完成后，我们需要训练数据，训练数据的python代码是项目主路径下的"train.py"文件。但是在训练之前，我们需要调整训练参数，具体要调整的内容如下：训练的模型配置文件和标签数据文件：在 train.py的大概430行左右，有下述代码： parser.add_argument('--cfg', type=str, default='models/yolo5s_part.yaml', help='model.yaml path') parser.add_argument('--data', type=str, default=ROOT /'data/part.yaml', help='dataset.yaml path')依次点击上述两个yaml文件，修改nc(标签个数)与name(标签名称)。训练的GPU与训练的轮数、一轮中每秒训练的图片张数：在 train.py的大概440行左右，有下述代码： parser.add_argument('--epochs', type=int, default=1000, help='total training epochs') parser.add_argument('--batch-size', type=int, default=100, help='total batch size for all GPUs, -1 for autobatch')修改第一行的轮数次数，修改第二行的一轮中每秒训练的图片张数（一般为6 or 8）。在 train.py的大概450行左右，有下述代码： parser.add_argument('--device', default='0', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')修改需要使用的GPU索引，一般填0，即默认使用第一张显卡训练。修改完训练参数后，我们开始训练模型。我们使用终端执行下述命令打开它。python3 train.py然后等待训练的模型完成。会生成best.pt与last.pt文件，路径是在"/runs/train/xxx"(这个路径在训练的python文件中可自定义)。我们把这两个pt文件复制到\my_weights\nut路径下。九点标注运行项目主路径线下的"arm_机械臂手眼标定\MAIN_GUI_daheng.py"文件，进行九点标注，实现九点标注是为了把机械臂与摄像头的点位匹配，已达到获取后续抓取的准确性。开始测试本项目中，数据测试使用"MAIN_DH.py"文件，直接在终端内执行(执行命令前需要cd至代码主路径下)python3 MAIN_DH.py打开GUI页面后，开始测试。PCB板加工件处理数据采集与标注同上文一致。模型训练同上…

物流信息批量查询之JS混淆逆向跟栈分析
type: item
date: 2024-11-13T13:07:00+08:00
description: 前情概要近几天有客户联系到我接单，客户要求：做一个批量查询物流信息的软件，要求一天能够查询上十万单的物流信息，并且从这十几万单的物流信息中提取出有效物流，并且能够导出物流揽收时间、寄出地（并且要求提取出省、市）。奈何现在的反爬技术愈来愈强，各大快递公司对于物流信息查询的接口鉴权已做的越来越全面。通过提取物流公司提供的快递单号查询接口已不太现实。但通过物流公司提供的开放平台“物流轨迹识别API”实现需要对API按次收费，也不是最优的方案。我的想法经过几天的查找，发现有个别网站正在做“批量查询物流信息”的平台，虽然是收费平台，但是看到优惠信息“每个账号每天能免费查询100单物流信息”，于是一个非常大胆的想法油然而生，制作一个自动化程序，首先注册一万个账号写入“账号库”，在之后查询时调用“账号库”中的账号进行查询，理论上可以实现。开始分析PS：平台网址：aHR0cHM6Ly95dW4uemh1emh1ZmFubGkuY29tLw==想要实现自动化注册流程，那么必须抓到网站在注册时候发送的包，首先进入网站的注册网页，再进入Web dev，后面发现跳“debugger”。那么，首先要解决这个问题，这个问题在JS逆向中最常见，一般出现这个问题我们是要通过“替换JS”文件的方法来解决，即把调用这个“debugger”的方法通过JS替换文件的方式给注释掉，就不会弹“debugger”了。JS逆向第一步：注释debugger方法那么，我们通过跟栈分析，在调用"debugger"方法中，有两个匿名函数，那么我们跳过，点击第一个堆栈函数。发现(_0x4a3118['LlPtj'])('de'));这一个函数调用了“debugger”方法，那么对函数参数置空，即(_0x4a3118[''])('de'));即可注释掉“debugger”方法。这是最基础的一个步骤，因为JS做了逆向和混淆，同时也可见JS代码中，所有的参数、函数名称，都已经混淆，完全代码不可读。JS逆向第二步：通过网络模块，找出注册账号的接口通过分析，发现注册的脚本内，除了我们填写的值“username”、“password”、“qq”等，还有一个“zs”的值，那很明显接口被加密了，首先遇到这个情况怎么办呢？如何知道这个加密的值是怎么计算的呢？发现加密参数首先，我们观察一下这个值的构成，他是由xxxx + “|” + 时间戳 构成，那么这个加密的值是不是动态的？（即用户名和密码和qq都填写的一样，这个加密的值会变化吗）？我们多尝试几次，发现加密出的这个参数的值每次都会发生变化，因此我们考虑是否和时间戳有关。其实这个参数的构成中带有时间戳，已经暗示的很明显了，生成这个参数的值和时间戳是有关的，因为时间戳每时每刻都在发生变化，所以无论我们注册的值是否发生变化，时间戳发生变化后，这个加密的值都会发生变化。找到计算加密参数的JS代码我们全局搜索这个参数的key，即“zs”。现在，我们找到和有关“zs”的JS代码。 submit: function (formfilter, reload, addsign, sgname) { //监听提交 form.on('submit(' + formfilter + ')', function (data) { var ld = layer.load(); //算sign if (addsign === true) { var s = md5.Do(data.field[sgname]); data.field["zs"] = s.toString(); } $.post('', data.field, function (result) { layer.close(ld); //关闭load lyresult.show(result, reload); }, 'json').error(function () { layer.close(ld); //关闭load lyresult.syserr(); }); return false; }); },现在，可见，有“md5”字样，可能是“MD5加密”，我们打断点，分析他调用的函数的内容。跟栈分析，发现在一串函数中，有一个返回值： return _0x4542ec['Abmuj'](_0x4cb122['MD5'](_0x5ca529 + _0x4542ec + [_0x4481('‫129'很明显，他是字符串拼接，然后进行MD5加密的，可以打断点，分析每个参数里面的值是什么？经过断点分析，“_0x5ca529”是用户名，“_0x4542ec”是一个常量，用于字符串的加密拼接所需要的，至此，加密逻辑都完成了。我们知道了他的加密逻辑，放在python等语言中，计算加密内容调用即可！登录之后，推送物流查询信息这儿…

itdog测速脚本JS脚本混淆分析
type: item
date: 2024-06-27T15:35:00+08:00
description: 本次分析的是“网站测速”模块。进入页面后，通过F12开发者工具，进行网页抓包，发现点击“开始测速”后，发现页面进行了一个 POST 请求，如图，经过请求页面后，发现有一段JS代码进行WSS（websockets）协议连接；通过分析 POST后的页面源码，发现一段疑似进行WSS协议链接的网页代码：$(function(){ //新增历史记录 add_history('http://code.chboy.top'); //开始分发任务 //连接websocket var ws; var wss_url='wss://www.itdog.cn/websockets'; var task_id='20240627153112mtm0f2jx561tfo0e0g'; var check_mode='fast'; create_websocket(wss_url,task_id,check_mode); });通过溯源这个JS代码中的 create_websocket 函数，后发现于一个经过混淆的JS代码内（https://www.itdog.cn/frame/js/pages/http_speed.js）。通过JS代码整体情况来看，疑似ob混淆，参考文献：https://blog.csdn.net/weixin_43411585/article/details/123437953于是我们使用 v_jstools 工具进行解密。通过原JS脚本下断点，发现WSS协议中的加密参数 ws.onopen = function () { ws.send("{\"task_id\":\"" + _0x261ac6 + "\",\"task_token\":\"" + md5(_0x261ac6 + "token_20230313000136kwyktxb0tgspm00yo5", 16) + "\"}"); };可见，通过task_id字段和"token_20230313000136kwyktxb0tgspm00yo5"字符串进行拼接，然后MD5加密，之后取MD5的前16个字符。然而，在POST接口时，task_id字段已经明文告知，此处不需要解密，直接调用这个解密即可解密。详情解密结果，可见附件。itdog.zip