修改class字节码中的字符串常量
原理Java文件在编译为class文件后,字符串内容会存储在字节码的常量池部分,理论上若有需求,可以修改此部分的值达到修改程序运行结果的目的。
字符串常量的字节码结构如下图:
实验实验文件测试程序为标准的helloworld程序,这里只输出hello,后续操作补上world
12345class My{ public static void main(String[] args) { System.out.println("hello"); }}
修改过程若目的为将hello改为world,则仅需要下载一个vscode插件“Hex Editor”,该插件支持直接修改二进制数据,我们只需要找到常量池部分的hello内容将其修改为world即可。
但该插件只能修改已有字节,如果要更改文件的长度比如添加或删除内容,是不支持的,所以这里写了个Java程序,通过写字节数组到文件的方法,在其中插入内容。
1234567891011121314151617181920212223242526272829303 ...
cloudflare代理github
参考资料gh-proxy
起因之前一直用gh-proxy来代理github,偶尔发现该网页的页脚有源码分享,于是自己搭建一个
Cloudflare注册首页:https://workers.cloudflare.com
注册账号并登录后,点击左侧”Workers 和 Pages“,点击创建
复制 index.js 到work.js点击部署,一般右侧预览窗口应显示最终效果。
但国内访问web.dev域名会被拦截,这里需要自定义域名代理
代码注释12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812 ...
euorg域名申请
参考资料资源分享|免费注册申请永久的eu.org顶级域名创建属于自己的域名,再也不用给博客域名续费了! - 墨天轮 (modb.pro)
工具虚拟地址生成器
Hostry注册HOSTRY - Instant Robust Hosting Services | HOSTRY Hosting Services
由于eu.org申请的时候不能直接填写cloudflare的解析服务器,所以这里使用hostry临时作为解析服务器。
经过尝试,现在Hostry已经无法使用qq邮箱和163邮箱注册,于是使用了临时接码平台(Hostry只用一次)
在注册时可以使用工具中的虚拟地址生成器生成信息
注册完邮箱里会收到验证邮件,第一次登陆会收到第二次邮件
登录时人机验证吗加载较慢,需要等一会儿
登录之后,点击Service中的Free DNS进入DNS页面
输入要申请的域名,点击创建DNS,后面的步骤默认
eu.org注册访问地址:https://nic.eu.org/ 进行账户注册
注册过程中的个人信息同样可以通过上方的信息生成器,但邮箱建议使用自己的邮箱,因为之后要接受域名审核成功的邮件
首先会接收到一 ...
南京大学计算机科学实验
开发环境配置
非root用户使用sudo执行命令,需将其添加到sudo中,使用命令
123su -add username sudoexit
重启之后生效
在修改镜像的过程中,原教程操作为
1sudo echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ stable main" > /etc/apt/sources.list
虽然使用了sudo,但仍然会报权限问题,经查找,得知该段指令会被分为两步运行,echo 会使用sudo执行,但 > 会使用非sudo身份。
第一种解决方案(避免使用su)
1sudo su -c "echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ stable main" > /etc/apt/sources.list"
第二种(更安全)
1echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ stabl ...
VMware安裝教程
参考资料VMware 17 下载安装及永久激活使用教程 - 嘿笨笨熊 - 博客园 (cnblogs.com)
下载下载地址:下载 VMware Workstation Pro | CN
安装
打开安装包
接受协议
选择安装路径
勾选增强键盘驱动程序
勾选添加到Path
取消勾选产品更新和客户体验计划
勾选创建快捷方式
安装
激活点击许可证,输入密钥
aa :JU090-6039P-08409-8J0QH-2YR7F
bb:ZA5RU-6FYD5-48EPY-3XXEE-PAUGD
开放麒麟虚拟机体验
参考资料openKylin 下载地址和安装方法 | openKylin文档平台
下载下载地址:系统下载-openKylin 开放麒麟社区官网 | 开源聚力,共创未来
配置虚拟机
VMware中点击创建新的虚拟机
选择典型模式(Typical)
选择稍后安装操作系统
系统选择linux,版本选择ubuntu 64位
输入名称和虚拟机存放地址
磁盘大小分配50G,选择将磁盘拆分为多个文件
自定义硬件,在新cd页面点击“使用ISO镜像文件”,选择下载的镜像文件,点击关闭
完成,启动
安装系统启动虚拟机后,点击桌面上的“安装openKylin”开始安装系统
选择语言中文
选择时区上海
创建用户
选择全盘安装,点击磁盘(50G)
勾选格式化整个磁盘,开始安装
体验分配的内存6g,cpu4个核
应用商店下载qq for linux,运行较流畅
应用商店下载QQ音乐(win32),非常卡顿,无法使用
应用商店下载edge,运行较流畅
下载了一个安卓应用,但虚拟机不支持安卓应用运行
https
参考资料HTTPS原理和TLS认证流程全解析 - 知乎 (zhihu.com)
TLS 1.0 至 1.3 握手流程详解 - en_oc - 博客园 (cnblogs.com)
HTTPS协议http协议是明文传输,内容容易被中间人拦截后获取,且中间人可伪装为服务器,向客户端发送伪装的响应。
https在http应用层和tcp传输层中间加了一层SSL安全层,整个加密过程都没有侵入原先的http协议,故对http协议进行了很好的兼容。
TLS/SSLTLS协议就是SSL协议,SSL在被网景公司(Netscape)开发出来后,SSL1.0未公布,2.0具有重大缺陷,96年发布3.0,在SSL3.0的下一个版本便是TLS1.0,在此之后迭代TLS1.0、1.1、1.2和1.3,目前应用最广泛的为TLS1.2。
TLS加密原理类似于TCP会通过握手来建立连接,TLS也会通过握手来交换一些必要的基础信息。
既然TLS是为了保证传输安全,那肯定要对传输的数据进行加密,加密的方式一般有对称加密和非对称加密。
对称加密加密和解密都用的同一个密钥,由于CS方式的特殊性,如果采用对称加密,则会存 ...
tcp
TCP三次握手ACK和ack
ACK:TCP协议中的一个标志位,标识是否对上一个包进行了确认操作
ack:32位确认号,等于上一个包的序列号seq+1
此外
SYN:同步标志位,用于建立会话连接
seq:32位序号,通过该序号确认发送的数据是有序的
步骤
第一次,客户端将SYN位置1,表示开始建立同步会话。产生一个随机数x作为序列号seq,保存至TCP报文首部的序列号字段中。知名客户端打算连接的端口,将该数据包发送给服务器端,接着客户端进入SYN_SENT状态,等待服务端的响应。
第二次,服务端接收到数据包,先检查SYN标志位,发现为1,得知客户端要建立链接。于是服务端构造数据包:将SYN位和ACK位都置为1,表示当前要建立同步连接且对上一个包进行了确认,将ack字段填充为x+1,接着随机产生一个随机数y填入seq字段,发送给客户端,服务器进入SYN_Rcvd状态。
第三次,客户端检查ack字段是否为x+1,若接收到了,则将ack字段置为y+1发送给服务端,服务端接收后检查ack字段为y+1则建立连接。此时客户端和服务端进入ESTABLISHED状态,开始传输数据。
...
深入理解计Java虚拟机
参考资料《深入理解Java虚拟机:第3版》
概述Java,91年诞生,95年发布
09年sun被oracle收购
运行时数据区
其中,方法区和堆是所有线程共享的数据区,虚拟机栈、本地方法栈、程序计数器为每份线程独有的。
程序计数器当前线程所执行的字节码的行号指针,由于线程切换后需要恢复执行环境,故每条线程都需要一个独立的程序计数器来保存执行位置,这样才能保证各条线程之间互不影响。
如果当前线程执行方法为本地(native)方法,则当前线程该计数器值为空
虚拟机栈Java虚拟机栈也是线程私有,描述Java方法执行的线程内存模型:每个方法执行时,Java虚拟机都会创建一个栈帧,该栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法从被调用直至执行完毕的过程,对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
局部变量表中存储的编译期可知的各种Java虚拟机基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用和returnAddress类型。在局部变量表中这些值会占用不同大小的变量槽,其中64位的long和doubl ...
java反编译相关
字符串replace问题某系统升级后并不是向下兼容的,新系统在运行后,自定义的模块一直报错NoSuchMethodException,查阅代码发现该方法属于在旧系统中存在但是新系统中移除的一个方法,为保证自定义模块继续执行,需要反编译新系统的源码添加该方法来适配自定义的调用。但在某个类的反编译结果中出现了一个很奇怪的现象。该段代码通过jd-gui反编译的结果如下:
123String a;...a.replace(false, '1');
已知String类没有首个参数为布尔值的replace方法,不做修改的话编译肯定是无法通过的。根据经验,猜测应该是原字符转成数字之后,jd-gui又转成布尔值了,而表示成布尔值之后为false的数,按理来说是0。于是使用java的命令行反编译工具javap,反编译结果如下:
1javap -c -v Trace.class > Trace.txt
1234: iconst_05: bipush 497: invokevirtual #3 // Method java/lang/String.repla ...