首页
关于道锋
工具
友情链接
公告栏
麟图图床
麟云文件
麟云KMS
麟云工具
麟云证书管理
Search
1
使用ReDroid打造自己的云手机
2,260 阅读
2
兽装曲腿制作文档
1,747 阅读
3
Cloudflare SAAS 接入自选教程
1,673 阅读
4
Frpc使用XTCP不通过服务器传输
1,560 阅读
5
CloudFront CDN配置教程
962 阅读
默认
科学
热力学
Furry
小说
星河野望
手工制作
道具制作
音影
图像工具
计算机
渗透
硬件
编程
网络
记录
AI人工智能
CVE
软件工具
装机教程
C/C++
C#
Go
HTML5+JS+CSS
JAVA
Lua
Rust
PHP
Python2/3
Nodejs
编译
C/C++学习日志
Golang学习日志
Rust开发技巧
Rust学习日志
Rust开发教程
Nonebot2机器人框架
python开发教程
python开发技巧
Python学习日志
ai绘画
电子电路
电路设计
PCB打板
制作实战
无线电
摄影
运维
WEB
KVM云计算
docker
Ansible
代码管理
Kubernetes
Linux
MySQL
shell
集群
Zabbix
Prometheus
数据安全
Redis
istio
ELK
Nginx
Apache
Tomcat
Elasticsearch
Logstash
Kibana
测评
服务器
登录
Search
标签搜索
开源
源码
教程
服务器
环境搭建
摄影
rustlang
Rust
VS CODE
v2ray
bbr
加速
网络优化
拥塞控制
CloudFront教程
CF教程
AWS教程
CloudFront接入
Frpc
Frps
道锋潜鳞
累计撰写
443
篇文章
累计收到
114
条评论
首页
栏目
默认
科学
热力学
Furry
小说
星河野望
手工制作
道具制作
音影
图像工具
计算机
渗透
硬件
编程
网络
记录
AI人工智能
CVE
软件工具
装机教程
C/C++
C#
Go
HTML5+JS+CSS
JAVA
Lua
Rust
PHP
Python2/3
Nodejs
编译
C/C++学习日志
Golang学习日志
Rust开发技巧
Rust学习日志
Rust开发教程
Nonebot2机器人框架
python开发教程
python开发技巧
Python学习日志
ai绘画
电子电路
电路设计
PCB打板
制作实战
无线电
摄影
运维
WEB
KVM云计算
docker
Ansible
代码管理
Kubernetes
Linux
MySQL
shell
集群
Zabbix
Prometheus
数据安全
Redis
istio
ELK
Nginx
Apache
Tomcat
Elasticsearch
Logstash
Kibana
测评
服务器
页面
关于道锋
工具
友情链接
公告栏
友人
PCD-01’s Blog
iMin博客
特资啦!个人资源分享站
黎洛云综合门户网站
三石的记录
咬一口激动的鱼
中二病晚期の物語
奇梦博客
布丁の小窝
道麟笔记
迷失的小K
koto's Site
Abyss-博客
西西のBlog
锐冰龙小站
Nick的琐碎日常
渣渣120
麟图图床
麟云文件
麟云KMS
麟云工具
麟云证书管理
搜索到
37
篇与
的结果
2024-02-15
Linux下使用tcpdump监听DNS查询
Linux下使用tcpdump监听DNS查询 并解决docker connection reset by peer问题
2024年02月15日
177 阅读
0 评论
0 点赞
2024-01-13
使用ReDroid打造自己的云手机
前言市面上已经存在很多云手机厂商如红手指、多多云、雷电云、河马云手机等,价格从几十到上百元每月一台。价格还好说,但设备运行稳定性、可靠性、数据安全性全部依赖第三方厂商,注定不能进行敏感性操作或部署对安全可靠高要求的企业级服务。本文介绍一种开源的 AIC (Android In Container) 解决方案 ReDroid,使用本教程可以在一台普通型服务器运行多个安卓设备环境,并可在客户机电脑连接使用该云手机。Redroid介绍redroid(Remote an Droid)是一个 GPU 加速的 AIC(Android In Cloud)解决方案。Docker您可以在 Linux 主机( 、podman等)中启动多个实例k8s。redroid支持arm64和amd64架构。 redroid适用于云游戏、虚拟化电话、自动化测试等。目前支持:安卓 14 ( redroid/redroid:14.0.0-latest)仅适用于 Android 14 64 位 ( redroid/redroid:14.0.0_64only-latest)安卓 13 ( redroid/redroid:13.0.0-latest)仅适用于 Android 13 64 位 ( redroid/redroid:13.0.0_64only-latest)安卓 12 ( redroid/redroid:12.0.0-latest)仅适用于 Android 12 64 位 ( redroid/redroid:12.0.0_64only-latest)安卓 11 ( redroid/redroid:11.0.0-latest)安卓 10 ( redroid/redroid:10.0.0-latest)安卓 9 ( redroid/redroid:9.0.0-latest)安卓 8.1 ( redroid/redroid:8.1.0-latest)入门redroid 应该能够在任何 Linux 上运行(启用一些内核功能)。这里以使用阿里云的X86服务器进行演示,具体如下:配置:vCPUs2内存2G储存40G系统ubuntu-22.04架构x86-64带宽3M安装Docker## 安装 docker https://docs.docker.com/engine/install/#server # 根据 Docker 官方文档安装Docker curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh #或者从仓库下载 sudo apt update sudo apt-get install -y docker.io systemctl start docker systemctl enable docker 安装内核扩展模块更具不同的系统,有不一样的安装方法,具体如下 # 拉取内核模块源码 git clone https://github.com/remote-android/redroid-modules cd ./redroid-modules # Ubuntu 16.04 / 18.04 / 20.04 sudo apt-get install -y git kmod make gcc linux-headers-`uname -r` sudo make # build kernel modules sudo make install # build and install *unsigned* kernel modules # Ubuntu 20.04+ (kernel 5.0+) sudo modprobe ashmem_linux sudo modprobe binder_linux devices=binder,hwbinder,vndbinder # AmazonLinux2 git checkout origin/amazonlinux2 sudo yum install git kmod make "kernel-devel-uname-r == `uname -r`" sudo make # build kernel modules sudo make install # build and install *unsigned* kernel modules # Alibaba Cloud Linux 2 git checkout origin/alibabalinux2 sudo yum install git kmod make "kernel-devel-uname-r == `uname -r`" sudo make # build kernel modules sudo make install # build and install *unsigned* kernel modules # Alibaba Cloud Linux 3 git checkout origin/alibabalinux3 sudo yum install git kmod make "kernel-devel-uname-r == `uname -r`" sudo make # build kernel modules sudo make install # build and install *unsigned* kernel modules # openEuler 20.03 / kernel 4.19 git checkout origin/openeuler2003 sudo yum install gcc kernel-devel sudo KDIR=/usr/src/kernels/<VER> make install # 检查模块状态 lsmod | grep -e ashmem_linux -e binder_linux # example output: # binder_linux 147456 79 # ashmem_linux 16384 23 # 也可以这样验证 grep binder /proc/filesystems # output should like: nodev binder grep ashmem /proc/misc # output should like: 56 ashmem我这边因为是ubuntu 22.04,便使用 modprobe 安装如果不想换系统,可以尝试升级内核到5.0以上,默认就自带相关模块了启动容器创建Docker-compose文件docker-compose.ymlversion: "3" services: redroid: image: redroid/redroid:11.0.0-latest stdin_open: true tty: true privileged: true ports: - "20055:5555" volumes: # 資料存放在目前目錄下 - ./redroid-11-data:/data command: # 設定libndk相關 - ro.product.cpu.abilist0=x86_64,arm64-v8a,x86,armeabi-v7a,armeabi - ro.product.cpu.abilist64=x86_64,arm64-v8a - ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi - ro.dalvik.vm.isa.arm=x86 - ro.dalvik.vm.isa.arm64=x86_64 - ro.enable.native.bridge.exec=1 - ro.dalvik.vm.native.bridge=libndk_translation.so - ro.ndk_translation.version=0.2.2 - ro.secure=0 cap_add: - CAP_SYS_MODULE 启动容器#确保安装了docker-compose apt install docker-compose # 进入储存docker-compose.yml的目录 cd /data/redroid-1 docker-compose up -d如果使用 22.04可能出现如下异常解决方案pip install 'urllib3<2'链接根据 Scrcpy 官方文档下载安卓投屏软件源码包到客户机,解压使用adb connect ip:5555 # adb devices 可查看连接设备列表 scrcpy --serial ip:5555高级一些额外参数样例docker run -itd --rm --privileged \ --pull always \ -v ~/data:/data \ --cap-add CAP_SYS_MODULE \ -p 5555:5555 \ redroid/redroid:11.0.0-latest \ androidboot.redroid_width=1080 \ androidboot.redroid_height=1920 \ androidboot.redroid_dpi=480 \参数描述默认androidboot.redroid_width显示宽度720androidboot.redroid_height显示高度1280androidboot.redroid_fps显示 FPS30(启用 GPU) 15(未启用 GPU)androidboot.redroid_dpi显示 DPI320androidboot.use_memfd使用 memfd 替换已弃用的 ashmem计划默认启用假androidboot.use_redroid_overlayfs使用overlayfs共享data分区/data-base:共享data分区/data-diff:私有数据0androidboot.redroid_net_ndnsDNS 服务器数量,如果未指定 DNS 服务器,将使用“8.8.8.8”0androidboot.redroid_net_dns<1..N>域名解析 androidboot.redroid_net_proxy_type代理类型;从以下选项中选择:“静态”、“pac”、“无”、“未分配” androidboot.redroid_net_proxy_host androidboot.redroid_net_proxy_port 3128androidboot.redroid_net_proxy_exclude_list逗号分隔列表 androidboot.redroid_net_proxy_pac androidboot.redroid_gpu_mode从以下选项中选择:auto、host、guest;guest:使用软件渲染;host:使用 GPU 加速渲染;auto:自动检测自动androidboot.redroid_gpu_node 自动检测ro.xxxDEBUG 目的,允许覆盖 ro.xxx 属性;例如设置ro.secure=0,则默认提供root adb shell
2024年01月13日
2,260 阅读
0 评论
2 点赞
2023-08-11
D-Link Go-RT-AC750命令注入漏洞复现
D-Link Go-RT-AC750命令注入漏洞复现
2023年08月11日
234 阅读
0 评论
0 点赞
2023-07-17
使用CloudFlare Worker搭建Vless服务,实现无服务器代理
使用CloudFlare Worker搭建Vless服务,实现无服务器代理
2023年07月17日
462 阅读
0 评论
2 点赞
2023-04-04
ESP32 开发笔记: GPIO 参考指南
ESP32 开发笔记: GPIO 参考指南
2023年04月04日
108 阅读
0 评论
0 点赞
2023-02-25
在FastApi中运行Asyncio子进程导致NotImplementedError错误的解决方法
在FastApi中运行Asyncio子进程导致NotImplementedError错误的解决方法
2023年02月25日
184 阅读
1 评论
0 点赞
2022-07-23
Linux下du命令和df命令读取的磁盘占用不一致问题
前引前几天,站长随手打开了本站的后台,宝塔面板有接近一个月没有登陆控制面板,寻思着日志占用应该也非常大了然后站长就看到了如下场景50G的系统盘占用达到了69%(其实之前是85%,后来清理日志文件后降低到69%)然后发现不管怎么清理日志或者是其他的垃圾文件,空间占用就是没法降低。因此习惯性的连上sshdf -hl结果和宝塔显示的大同小异同样也是占用69%ps:这其实很正常,宝塔面板和df命令读取的都是磁盘的superblock信息,数据相同也无可厚非。但是问题就在这来了,站长不信邪,不相信系统盘占用有这么高。因为本站的服务器挂载有两块数据盘,一块800G,一块4T,站点日志和站点数据,面板都安装在数据盘上,理论上不应该会占用系统盘的空间啊。于是使用cd / du -sh * | sort -n du -h -x --max-depth=1去直接计算根目录下所有目录的大小好家伙,除去挂载点的大小,实际系统根目录占用仅仅5.5G,根本不到69%这是什么情况呢解决错误的想法细心的网友可能会注意到,如果这5.5G,加上www挂载点的15G,加上data挂载点的0.7G5.5+15+0.7,大概21.2G左右,加上前面的tmpfs空间,正好大概33G事情会不会这么巧呢,还真是巧合而已。解析区别前面有说,宝塔面板和df命令读取的都是磁盘分区的 superblock 信息。而 du 命令则是一个个调用系统的 fstat 去统计文件的总大小所以,理论上 df 统计的是更准确的那这么说,为什么 df 统计的结果会和 du 差那么多呢。是因为 df 统计的时候是从文件系统考虑的,不仅仅计算了文件的大小,也计算了被删除的文件,但进程还没释放的部分。例如文件已经被删除,但是被某个进程持有。其原理是读取每个分区的superblock来获取空闲数据块、已使用数据块.从而计算出空闲空间和已使用空间,所以也因此导致df统计的速度极快(才占用1024字节)。那df是怎么统计删除的文件的呢 简单说一下,只要bmap中不将这个文件的data block标记为未使用,就会算到实际使用的空间中。bmap是元数据区的一个位标记,其中记录的是数据区的block是否被使用。解决那我被占用的空间去哪了这是个好问题,但是在这之前,站长需要发一个提醒{message type="error" content="以下内容仅限在测试环境中使用测试,若应用于生产环境请三思后行"/}{message type="error" content="以下部分操作会杀死驻留进程,会影响到业务稳定,若需要使用,请按照具体情况进行修改"/}1.要找到这些丢失的空间,我们得首先先找到这些僵尸文件使用cd / lsof |grep deleted可以找到已经被表为deleted的文件被什么进程占用然后可以使用kill批量结束进程。cd / lsof |grep -i delete|awk '{print $2}'|xargs kill到这,基本上就能解决大部分问题了站长的系统盘占用也恢复了
2022年07月23日
184 阅读
1 评论
1 点赞
2022-04-17
境外服务器的各种线路说明
通过一篇短文带你了解AS4809,AS4134,AS4837,AS9929,CUVIP,AS9809,CN2,GIA,GT等各种网络线路,让你挑选服务器的时候,能够更加得心应手
2022年04月17日
212 阅读
0 评论
0 点赞
2022-04-06
Frpc使用XTCP不通过服务器传输
frp 是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持 tcp, http, https 等协议类型,并且 web 服务支持根据域名进行路由转发。frp 是一款跨平台的内网穿透工具,支持 Windows、macOS 与 Linux,它需要你有一台拥有固定公网 IP 的电脑,VPS 最好,然后就能愉快的进行内网穿透了。还支持 https,甚至可以用它进行小程序开发。
2022年04月06日
1,560 阅读
1 评论
1 点赞
2021-02-04
支付宝五福自动脚本
源代码都给了,凑合着看吧源码来自一个不愿意透露姓名的开源人士,应要求将封面头图设为他头像使用方法:首先输入要领取的站点开始的序号,总共53个站点可以领取每隔77s会自动切换到下个站点进行领取,已经领取成功的,会进行记录,下次程序运行时将忽略领取成功的站点如果要换手机号领取,在一开始输入1确认,会自动把success.json覆盖掉,不然会因为上个手机号领取成功的站点而进行跳过。注意:支付宝此活动不能连续获得60(2月3日,根据大家的情况反映,支付宝已经把风控数量调整到10个验证码左右,24小时后解除风控)个验证码,否则24小时内无法再参加此次活动!程序暂无GUI页面,先凑合着用把。site.json、default.json和success.json必须和程序在一个目录,否则程序会闪退因为此次支付宝五福为了让大家交换卡,每人获得除了敬业福之外的随机两种福的概率是最大的,所以一般会大量开出两种福,这是正常现象。主要代码:import requests import os import codecs import sys import time import json import re from shutil import copyfile class WebRequests: def __init__(self): self.dirPath = '' self.getCaptchaUrl = 'https://rds.alipay.com/captcha.htm' self.getResultUrl = 'https://mobilegw.alipay.com/mgw.htm' self.operationType = { 'sendVerifyCode': 'alipay.tradecsa.biz.blessingprod.wufu2021.sendVerifyCode', 'outPrize': 'alipay.tradecsa.biz.blessingprod.wufu2021.outPrize' } self.s = requests.Session() self.headers = { 'User-Agent': 'Mozilla/5.0 (Linux; U; Android 10; zh-CN; MI 9 Build/QKQ1.190828.002) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 Quark/4.3.3.145 Mobile Safari/537.36 Edg/89.0.4389.6', 'DNT': '1' } def loads_jsonp(self, _jsonp): try: return json.loads(re.match(".*?({.*}).*", _jsonp, re.S).group(1)) except: raise ValueError('Invalid Input') def getCaptcha(self, mobile, source): digits = 32 hex = codecs.encode(os.urandom(digits), 'hex').decode() data = { 'appid': "blessingprod_wufu_otp", 'bizNo': hex, 'mobile': mobile, 'refer': "", 'scene': "DO_NOTHING", 'type': "silence", 'useragent': "Mozilla/5.0 (Linux; U; Android 10; zh-CN; MI 8 UD Build/QKQ1.190828.002) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 Quark/4.3.3.145 Mobile Safari/537.36 Edg/89.0.4389.6" } self.s.options(self.getCaptchaUrl) try: r = self.s.post(self.getCaptchaUrl, json=data, headers=self.headers) # print(r.text) rdsToken = json.loads(r.content)['data']['extra']['token'] requestData = [{"mobile": mobile, "source": source, "rdsBizNo": hex, "rdsToken": rdsToken}] getResultData = { '_fli_online': True, 'operationType': self.operationType['sendVerifyCode'], 'requestData': str(requestData), '_': int(round(time.time() * 1000)), 'callback': 'jsonp' + str(int(round(time.time() * 1000))) } re = self.s.get(self.getResultUrl, params=getResultData, headers=self.headers) # 'jsonp16121({"resultStatus":1000,"result":{"code":"5101","resultView":"人气太旺了,请稍后再试","success":true}})' # print(re.text) re_json = self.loads_jsonp(re.text) if re_json['result']['success'] == True: return {"code": 1000, "info": f'成功获取验证码,请注意查收'} else: resultView = re_json['result']['resultView'] return {"code": 1001, "info": f'获取验证码失败,原因为{resultView}'} except Exception as e: return {"code": 1001, "info": f'获取验证码失败,原因为 {e}'} def getResult(self, mobile, source, ackCode): requestData = [ {"mobile": mobile, "source": source, "ackCode": str(ackCode)}] getResultData = { '_fli_online': True, 'operationType': self.operationType['outPrize'], 'requestData': str(requestData), '_': int(round(time.time() * 1000)), 'callback': 'jsonp' + str(int(round(time.time() * 1000))) } try: re = self.s.get(self.getResultUrl, params=getResultData, headers=self.headers) # jsonp16121({"resultStatus":1000,"result":{"code":"50144","hasPrized":false,"hasUserId":false,"resultView":"已经领取过奖品","success":false}}) # print(re.text) re_json = self.loads_jsonp(re.text) if re_json['result']['success'] == True: return {"code": 1000, "info": f'成功领取'} else: resultView = re_json['result']['resultView'] return {"code": 1001, "info": f'领取失败,原因为 {resultView}'} except Exception as e: return {"code": 1001, "info": f'领取失败,原因为 {e}'} def getSiteNum(self): path = os.path.join(self.dirPath, "site.json") with open(path, 'r', encoding='utf8')as fp: json_data = json.load(fp) return len(json_data['channelList']) def getSiteInfo(self, num): path = os.path.join(self.dirPath, "site.json") with open(path, 'r', encoding='utf8')as fp: json_data = json.load(fp) length = len(json_data['channelList']) if num > length: print(f"站点的长度为{length},{num}已经超出这个长度") return None return json_data['channelList'][num-1] def getAllSiteInfo(self): path = os.path.join(self.dirPath, "site.json") with open(path, 'r', encoding='utf8')as fp: json_data = json.load(fp) return json_data['channelList'] def getSiteName(self, siteInfo): return siteInfo['sourceList'][0]['name'] def getSiteSource(self, siteInfo): return siteInfo['sourceList'][0]['source'] def addSuccessSite(self, siteInfo): path = os.path.join(self.dirPath, "success.json") add = self.isSuccessSite(siteInfo) if add == False: with open(path, 'r+', encoding='utf8')as fp: json_data = json.load(fp) with open(path, 'w', encoding='utf8')as fp: json_data['channelList'].append(siteInfo) fp.write(json.dumps(json_data, indent=4)) def isSuccessSite(self, siteInfo): path = os.path.join(self.dirPath, "success.json") with open(path, 'r+', encoding='utf8')as fp: json_data = json.load(fp) if siteInfo in list(json_data['channelList']): return True else: return False def main(path): webRequests = WebRequests() webRequests.dirPath = path print(f"总共有{webRequests.getSiteNum()}个站点可以领取福卡") for i in range(1, webRequests.getSiteNum()+1): siteInfo = webRequests.getSiteInfo(i) siteName = webRequests.getSiteName(siteInfo) print(f"{i}:{siteName}") startSite = int(input("您要从第几个站点开始向后领取?")) mobile = input("请输入您的手机号:") for i in range(startSite, webRequests.getSiteNum()+1): siteInfo = webRequests.getSiteInfo(i) siteName = webRequests.getSiteName(siteInfo) siteSource = webRequests.getSiteSource(siteInfo) if webRequests.isSuccessSite(siteInfo): print(f"{i}:{siteName} 已经成功领取,跳过") continue print(f"{i}:{siteName} 正在领取中") result = webRequests.getCaptcha(mobile, siteSource) print(result['info']) if result['code'] == 1001: if str(result['info']).find("验证码发送过频繁") != -1: print("验证码需等待77s后才能获取,正在等待..") time.sleep(77) result = webRequests.getCaptcha(mobile, siteSource) if str(result['info']).find("人气太旺啦,稍候再试试") != -1: print("您的手机号在近期已经获得了多次支付宝验证码,已被支付宝限制,24小时内无法再获得验证码,程序终止。") break elif str(result['info']).find("人气太旺啦,稍候再试试") == -1 and str(result['info']).find("验证码发送过频繁") == -1: continue ackCode = input("请输入验证码:") result = webRequests.getResult(mobile, siteSource, ackCode) print(result['info']) if result['code'] == 1000 or result['info'].find("已经领取过奖品") != -1: webRequests.addSuccessSite(siteInfo) print("验证码需等待77s后才能获取,正在等待..") time.sleep(77) input("程序已结束,您可以关闭此程序了") def newphone(): pa = 'success.json' if os.path.exists(pa): os.remove(pa) try: copyfile("default.json", pa) except IOError as e: print("错误 %s 5秒后退出" % e) time.sleep(5) sys.exit() except: print("错误,5秒后退出:", sys.exc_info()) time.sleep(5) sys.exit() if __name__ == '__main__': print("请问是否使用的新账号是输入1 否任意:") if int(input())== 1: newphone() path = os.path.dirname(os.path.realpath(sys.argv[0])) main(path) 源码地址:需要环境源码版:下载无需环境编译版:下载
2021年02月04日
109 阅读
2 评论
0 点赞
2020-11-15
对《奇迹觉醒》的解包研究学习
《奇迹MU:觉醒》是经韩国网禅正版授权,由北京天马时空网络技术有限公司研发,腾讯独家代理运营的一款手机游戏一、软件准备《apktool》1、apktool文件的下载apktool是反编译Android apk文件的工具,apktool的主页是 https://ibotpeaches.github.io/Apktool/;我们可以从这里找到最新版本的apktool.jar文件 https://bitbucket.org/iBotPeaches/apktool/downloads/,以及apktool的安装说明。2、apktool的安装前面我们已经下载了最新的apktool.jar文件,最新版本是2.3.1,请按照以下步骤操作,参考 https://ibotpeaches.github.io/Apktool/install/新建文本文件,将下面的脚本复制到文本并保存,然后重命名为apktool.bat;@echo off if "%PATH_BASE%" == "" set PATH_BASE=%PATH% set PATH=%CD%;%PATH_BASE%; chcp 65001 2>nul >nul java -jar -Duser.language=en -Dfile.encoding=UTF8 "%~dp0\apktool.jar" %* 从上面脚本中也可以看到是用apktool.jar文件去处理;将下载的apktool_2.3.1.jar文件重命名为apktool.jar;3、apktool的使用将上述两个文件apktool.bat和apktool.jar文件放到同一文件夹下(任意路径),打开命令窗口(win+R–>cmd–>enter);定位到apktool所在的文件夹;(若有java的系统变量也是可以的)输入以下命令:apktool.bat d -f ***.apk objectFolderPath 其中,objectFolderPath为可选项,如果此项不存在,软件将会在apktool文件夹下新建一个apk文件名的文件夹,否则存储到目标文件夹《UnityStudio》1.下载运行地址:https://github.com/Perfare/UnityStudio/releases最新版本支持unity5.x《winhex》(可选)下载地址http://www.x-ways.net/winhex.zip二、过程1.使用apktool对目标apk安装包进行拆解cd F:\解包\qjjx apktool d 10040714_com.tencent.tmgp.tmsk.qj2_a951663_8.2.0_27fhqs.apk //我的环境已经配置好了环境变量,直接cd到目标目录使用即可解包完成,目录下生成了一个和文件包同名的文件夹观察目录,发现asset文件夹占据了几乎99%的大小,估算模型数据在此目录下其实好像都是这个目录腾讯的开发者还是素质很高的,每个目录下是什么都清清楚楚的2.搜寻读取资源文件经过查看装备Equip,发现大量的unity3d文件(以此为例)还是打开winhex确认一下使用的版本号也是5.x使用先前下载的UnityStudio(或称AssetStudio)批量打开文件目录或单独打开文件比如。。。。资源的内容已经展示出来了(不限于此目录),可以选择需要的资源文件导出三、总结该文,该教材仅仅用作个人学习研究使用,请勿利用教材内容,进行有损目标软件公司利益的事情(包括但不限于版权纠纷,非法入侵纠纷)。本教程慨不负责类似案例:https://www.silverdragon.cn/?p=1880 过程几乎相同,且适用于几乎所有unity3D引擎的游戏
2020年11月15日
138 阅读
0 评论
0 点赞
2020-11-08
对《神都夜行录》的解包研究学习
《神都夜行录》是由网易游戏制作发行的一款国风妖怪收集RPG手游。游戏的整体故事发生在大唐年间,神都盛世天下生平、魑魅魍魉百妖横行,玩家扮演的降妖师会历经各种冒险,学习降妖之术,解决各类神秘可疑的妖怪作乱事件一、软件准备1.PC端游戏客户端 2.quickbms 3.RMAViewer 4.IqeBrowser 5.Noesis 6.3dsmax 网盘下载:https://pan.baidu.com/s/1jLoyZBfGlDnxGxTHJFdX7g 7mnf 流程:*.npk -quickbms-> *.dat -RMAViewer-> *.iqe -IqeBrowser-> *.iqm -Noesis-> *.fbx -3dmax-> *.pmd -PmxEditor-> *.pmx二、资源定位163家的游戏,安装包都是npk封装、更新包嘛,,,搞不懂。真够大的。。。6个资源文件在 *\Netease\yxl 下,目标就是...够多的。。。三、准备解包先把几个资源文件复制一份单独操作。。。还是上winhex看看目标压缩制式NXPK? 不是EXPK就好(没研究EXPK)用quickbms和官方脚本 nxpk.bms# NXPK npk (script 0.3.8) # Demon Seals HD and others # script for QuickBMS http://quickbms.aluigi.org get EXT extension math NAMES = -1 math EXISTS = 0 math NAMES_METHOD = 0 /* # this format is totally useless because it's only a sequence of integers string TMP p "%s_hash" EXT open FDDE TMP 1 EXISTS if EXISTS == 0 string TMP p "%s.hash" EXT open FDDE TMP 1 EXISTS endif */ if EXISTS == 0 open FDDE "hash" 1 EXISTS endif if EXISTS == 0 string TMP p "%s.info" EXT open FDDE TMP 1 EXISTS endif if EXISTS != 0 comtype zlib_noerror get TMP1 byte 1 get TMP2 byte 1 if TMP1 == 0x1f && TMP2 == 0x8b comtype gzip endif get SIZE asize 1 clog MEMORY_FILE 0 SIZE SIZE 1 get SIZE asize MEMORY_FILE for i = 0 savepos TMP MEMORY_FILE if TMP >= SIZE break endif get TMP line MEMORY_FILE getvarchr TMP0 TMP 0 if NAMES >= 0 if TMP0 == 0x53 || TMP0 == 0x73 # "S" and "sS" if TMP0 == 0x53 # "S'" string TMP << 2 else string TMP << 3 endif string TMP - 1 if i & 1 strlen TMPSZ TMP if TMPSZ != 32 || TMP & \ string TMP x TMP string TMP b TMP putvarchr TMP 32 0 endif string TMP u TMP string TMP p "_%s" TMP # LAME BUGFIX FOR QUICKBMS!!! putarray 10 NAMES TMP math NAMES + 1 else putarray 11 NAMES TMP endif math i + 1 endif else if TMP0 == 'a' math NAMES = 0 # skip the first string endif endif next else string TMP p "%s.map" EXT open FDDE TMP 1 EXISTS if EXISTS != 0 math NAMES_METHOD = 1 get MAP_SIZE asize 1 for OFFSET = 0 != MAP_SIZE get TMP line 1 string ELEMENTS S TMP NAME NAME_CRC ZSIZE ZCRC SIZE CRC OFFSET putarray 10 NAMES NAME_CRC putarray 11 NAMES NAME math NAMES + 1 savepos OFFSET 1 next endif endif /* # debug for x = 0 < NAMES getarray HASH 10 x getarray NAME 11 x print "%HASH% %NAME%" next x */ set KEY string "" for x = 0 < 0x100 xmath TMP "x - 2" putvarchr KEY x TMP next x idstring "NXPK" get FILES long get VER1 long get VER2 long get VER3 long math MODE = 0 if VER1 >= 1 && VER3 > 1 math MODE = 1 endif math INFO_SIZE = 0x1c if MODE != 0 math INFO_SIZE = 0x28 endif get OFFSET long # if I used this work-around it means it was necessary in a sample, don't know what sample... get NXPK_SIZE asize if OFFSET u> NXPK_SIZE xmath OFFSET "NXPK_SIZE - (FILES * INFO_SIZE)" endif goto OFFSET for i = 0 < FILES get NAME_CRC long get OFFSET long get ZSIZE long get SIZE long get ZCRC long get CRC long if MODE != 0 get DUMMY long get DUMMY long get FLAGS long get DUMMY long else get FLAGS long endif xmath ZFLAGS "FLAGS & 0xffff" xmath FLAGS "FLAGS >> 16" if ZFLAGS == 2 comtype lz4 else # 0 comtype zlib endif set NAME string "" if NAMES > 0 if NAMES_METHOD == 0 encryption md5 "" log MEMORY_FILE OFFSET ZSIZE encryption "" "" string QUICKBMS_HEXHASH p "_%s" QUICKBMS_HEXHASH # LAME BUGFIX FOR QUICKBMS!!! else math QUICKBMS_HEXHASH = NAME_CRC endif for x = 0 < NAMES getarray TMP 10 x if TMP == QUICKBMS_HEXHASH getarray NAME 11 x putarray 10 x "" math x = NAMES # break endif next x endif math FILENUM = 0 if FLAGS & 1 math TMP = 0x80 if TMP > ZSIZE math TMP = ZSIZE endif encryption xor KEY "" 0 TMP log MEMORY_FILE OFFSET TMP encryption "" "" math OFFSET + TMP xmath TMP "ZSIZE - TMP" append log MEMORY_FILE OFFSET TMP append math OFFSET = 0 math FILENUM = -1 endif if SIZE == ZSIZE log NAME OFFSET SIZE FILENUM else clog NAME OFFSET ZSIZE SIZE FILENUM endif next i 启动quickbms.exe 然后选择nxpk.bms作为payload,然后再选择要解的文件和保存目录然后自动就开始解了除去头部偏移字节,解包进度到99%,解包已经完成,获得12661个文件因为数据量比较大,这里仅对res1.npk拆解讲解。四、文件说明解包出来的文件有好几种类型,主要有如下几种既然主要还是研究模型,那么打开RMAViewer File》Open Folder 载入我们的res1文件夹选择列表内的文件可以进行浏览,上下键控制选择焦点,滚轮或QE控制远近,WSAD键控制视角,左键按住旋转模型比如。。。这里以茨木为例选择Save IQE导出有骨骼的模型,然后在res1文件夹中筛选出iqe后缀当然Save OBJ也是可以的。只不过就只有模型了。比如:如果导出的iqe有问题或为了保险,可通过IQEFix.exe进行一次修复操作,直接将文件拉进exe即可五、格式转换iqe:以文本格式 存储的可带骨骼带贴图模型文件 iqm:以二进制 存储的可带骨骼带贴图模型文件 区别:二进制比文本格式更为通用,能被大多数模型软件读取,且压缩率更高体积更小。启动IqeBrowser,吧我们的模型导入切记目录必须为纯英文,否则文件可能打不开选中要转换的模型 Ctrl+S保存 选择【*.iqm】启动Noesis将刚刚转换的iqm导入,转换为fbx文件贴图和模型UV方向一致,则可以直接贴材质,不一致贴上会错乱。六、查找贴图启动3dsmax 导入fbx查找对应的dds技巧是将res1与res2中的所有.dds整合到新建的文件夹选择浏览视图为详细信息,以文件大小排序,剪切所有文件大小为1366KB的高清贴图在3dmax中展UV图形,以此为根据,寻找目标dds文件导入七、总结该文,该教材仅仅用作个人学习研究使用,请勿利用教材内容,进行有损目标软件公司利益的事情(包括但不限于版权纠纷,非法入侵纠纷)。本教程慨不负责bilibili同步连接 https://www.bilibili.com/read/cv8274072
2020年11月08日
199 阅读
1 评论
0 点赞
1
2
...
4