结论: mysql中间件注入延时10s增强后,应用访问数据库延时了10s,即注入成功。
销毁注入的延时功能,应用访问数据库没有延时,即销毁成功。
针对“(1)MySQL案例-结合应用”字节码增强失败,重新翻阅了源码,进行复盘。
一:重新打包lcm-module.jar
把chaosblade-exec-jvm工程进行部分修改输出,以观察其变化。
1.1 解决压chaosblade-java-agent-1.2.0.jar到chaosblade-1.2.0/lib/lcm/guangfang下
1.2 修改chaosblade-exec-jvm工程里的两个文件
1.2.1. SandboxModule.java的id=lcm
与chaosblade-java-agent-1.2.0.jar的模块重了,所以要修改成其它名字。
1.2.2 在CreateHandler.java里的handle里设定输出
System.out.println(“lcm CreateHandler handle suid= “+suid+”,target= “+target+”,actionArg=”+actionArg);
1.3 把修改并编译后的SandboxModule.class CreateHandler.class 替换掉guangfang下的文件,并打包为lcm-module.jar
把文件夹/Users/xxx/Documents/1guanda/git/chao/chaosblade-1.2.0/lib/lcm/guangfang下所有的文件打包到lcm-module.jar里
/Users/xxx/Documents/1guanda/git/chao/chaosblade-1.2.0/lib/lcm/> jar cvfm lcm-module.jar guangfang/META-INF/MANIFEST.MF -C guangfang/ .
1.4 把lcm-module.jar包放到sandbox/lib/module/lcm-module.jar
二:启动springboot-mysql工程。
代码请参考上一篇
进程号为 11807
三:向目标jvm 挂载模块
./sandbox.sh -p 11807 -l
四:激活id为lcm的模块
./sandbox.sh -p 11807 -d 'sandbox-module-mgr/active?ids=lcm'
五:字节码增强mysql
5.1 向目标mysql数据库名test进行10s的延时增强。
./sandbox.sh -p 11807 -d 'lcm/create?suid=11&target=mysql&action=delay&time=10000&database=test'
备注:
lcm:为模块的id。
create:为模块里的对外接收的方法。
suid:值任意,在源码里此字段只作了非空判断,猜测是供blade使用的。
target=mysql:参数,是向mysql插件进行注入。
action=delay:参数,延时的action。
time=10000:参数,延时的时长,毫秒。
database=test:参数,数据库名test。
5.2 springboot-mysql工程输出
由于在CreateHandler.java里打了输出,所以看到如下图的信息。
5.3 查看springboot-mysql访问时间
从图可以看出,查询时间延时了10s。即上面的增强成功。
六:销毁mysql的注入
6.1 销毁延时。
./sandbox.sh -p 11807 -d 'lcm/destroy?suid=11&target=mysql&action=delay'
6.2 查看springboot-mysql访问时间
从图可以看出,查询时间startTime=endTime,无延时。即上面的销毁成功。