# instrmj **Repository Path**: repok/instrmj ## Basic Information - **Project Name**: instrmj - **Description**: java函数钩子? - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-10-09 - **Last Updated**: 2024-10-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## init proj ```bash #init module:experiment mvn archetype:generate -DgroupId=com.zzz.instrmj -DartifactId=experiment -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false #init module:AgentUsingByteBuddy mvn archetype:generate -DgroupId=com.zzz.instrmj -DartifactId=AgentUsingByteBuddy -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false #init module:runtime mvn archetype:generate -DgroupId=com.zzz.instrmj -DartifactId=runtime -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false #init module : DorkingWeb curl https://start.spring.io > help.txt rm -fr DorkingWeb.zip DorkingWeb/ curl https://start.spring.io/starter.zip -d bootVersion=2.7.4 -d javaVersion=1.8 -d groupId=com.zzz.instrmj -d artifactId=DorkingWeb -d version=1 -d packaging=jar -d dependencies=web -d type=maven-project -d name=DorkingWeb -o DorkingWeb.zip unzip DorkingWeb.zip -d DorkingWeb rm -fr DorkingWeb/.mvn/ DorkingWeb/mvnw* sed -i -e 's/2.7.4/1.5.22.RELEASE/g' DorkingWeb/pom.xml rm -fr DorkingWeb.zip #init module:DorkingSimple mvn archetype:generate -DgroupId=com.zzz.instrmj -DartifactId=DorkingSimple -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false ``` ## zip4j+javassist cold inject to constructor demo > zip4j+javassist 冷注入构造器桩 演示步骤 1. 打包 ```bash cd DorkingWeb ; mvn -DskipTests package; cd - cd runtime ; mvn -DskipTests package; cd - cd ColdInjectByJavassist ; mvn -DskipTests package; cd - ``` 2. 静态统计或冷注入 > 静态统计invokeInstructionStaticCounter 参见 [invokeInstructionStaticCounter.sh](https://gitee.com/pubz/instrmj-output/blob/dev/InvokeInstructionStaticCounter/invokeInstructionStaticCounter.sh) 或 [invokeInstructionStaticCounter.ipynb](https://gitee.com/pubz/instrmj-output/blob/dev/InvokeInstructionStaticCounter/invokeInstructionStaticCounter.ipynb) java \ -DInstrmjIndicantRecord=MethodExecScript \ -DDorkingJarPath=/d/instrmj/DorkingSimple/target/DorkingSimple-1-jar-with-dependencies.jar \ -DInstrmjRuntimeJarPath=d:/instrmj/runtime/target/runtime-1.jar -DInstrmjDorkingIncluded=org.apache.ibatis \ -DInstrmjInvokeInstructionStaticCounterFocusPackagePrefix1=org.apache.ibatis. \ -cp /d/instrmj/ColdInjectByJavassist/target/ColdInjectByJavassist-1-full.jar com.zzz.instrmj.coldInject.byZip4jJavassit.main.Main \ ```bash ##新写法(描述符写法): #描述 spring-boot 样式 : 应用+依赖 都形如 BOOT-INF/lib/*.jar , # (BOOT-INF/lib/*.jar 是 被spring自定义加载器加载的jar) cd DorkingWeb ; mvn -DskipTests package; cd - java \ -DInstrmjDescriptorFullClassName=com.zzz.instrmj.coldInject.byZip4jJavassit.dorkingStructureDescriptor.instance.InjectMethodExecScriptToSpringBoot \ -cp /d/instrmj/ColdInjectByJavassist/target/ColdInjectByJavassist-1-full.jar com.zzz.instrmj.coldInject.byZip4jJavassit.main.Main \ ``` ```bash ##新写法(描述符写法): # (估计 应用+依赖 的 单一jar样式: DorkingSimple-1-jar-with-dependencies.jar 不好描述 ) # 应用+依赖 散开 的 多jar样式: DorkingSimple-1.jar + target/dependency/*.jar 应可以描述, 以下就是描述这种样式: cd DorkingSimple ; mvn -DskipTests package; mvn dependency:copy-dependencies -DincludeScope=runtime ; cd - java \ -DInstrmjDescriptorFullClassName=com.zzz.instrmj.coldInject.byZip4jJavassit.dorkingStructureDescriptor.instance.InjectMethodExecScriptToJedisSimple \ -cp /d/instrmj/ColdInjectByJavassist/target/ColdInjectByJavassist-1-full.jar com.zzz.instrmj.coldInject.byZip4jJavassit.main.Main \ ``` 3. 注入后 执行目标应用 > 执行修改后的jar ```bash java -jar DorkingWeb\target\DorkingWeb-1.jar java -jar D:\instrmj\DorkingSimple\target\DorkingSimple-1-jar-with-dependencies.jar java -jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=7896 D:\instrmj\DorkingSimple\target\DorkingSimple-1-jar-with-dependencies.jar ``` 4. 等目标应用启动完成后 导出调用栈序列 ```bash #MethodCallStack桩导出操作: #启动dorkingWeb完成后 导出桩在启动过程中记录的文件: echo 'CmdCloseFileOfMethodCallStack' > ./instrmjControlCenterHome/cmdHome/cmd #此时产生的带时间戳的文件 即 启动序列 MethodCallStack-boot.csv #访问一个web 接口后 导出桩在接口执行过程中记录的文件(增量,不含上一步启动过程中的): curl http://localhost:8080/user-controller/get-user-by-id?userId=19 #userId值任意 echo 'CmdCloseFileOfMethodCallStack' > ./instrmjControlCenterHome/cmdHome/cmd #刷出刚的流程, 注意忽略新出来的文件 即 web接口的 栈序列 MethodCallStack-rest.csv #按 ctrl+c 结束DorkWeb, 此时最后一个文件还会被写入一些内容,这些内容应是停止过程 的 栈序列 MethodCallStack-stop.csv ``` 5. 分析 MethodCallStack.csv ```bash head -n 2000 MethodCallStack.csv > MethodCallStack.csv.2000 ```