当前位置: 首页 > news >正文

网站开发深入浅出 - python篇数码商城网站建设

网站开发深入浅出 - python篇,数码商城网站建设,网站建设基本步骤是什么,做家教网站怎么样什么是Java agent技术#xff1f; Java代理#xff08;Java agent#xff09;是一种Java技术#xff0c;它允许开发人员在运行时以某种方式修改或增强Java应用程序的行为。Java代理通过在Java虚拟机#xff08;JVM#xff09;启动时以代理#xff08;agent…什么是Java agent技术 Java代理Java agent是一种Java技术它允许开发人员在运行时以某种方式修改或增强Java应用程序的行为。Java代理通过在Java虚拟机JVM启动时以代理agent的形式加载到JVM中以监视、修改或甚至完全改变目标应用程序的行为。 Java agent 可以做什么 安全监控和审计 通过Java代理可以在应用程序中注入代码以监视其行为并记录关键事件。这可以用于安全审计目的以确保应用程序不受到恶意行为或违规操作的影响。 安全验证和授权 Java代理可以拦截对受保护资源的访问并执行安全验证和授权操作。通过代理可以实现访问控制策略确保只有经过授权的用户或系统可以访问特定资源。 安全加固 通过Java代理可以对应用程序进行安全加固例如实时检测和防御攻击包括代码注入、SQL注入、跨站点脚本攻击等。代理可以拦截请求并根据安全策略进行处理从而提高应用程序的安全性。 加密和解密 Java代理可以用于实现端到端的数据加密和解密保护敏感数据在传输过程中的安全性。代理可以拦截数据流对数据进行加密或解密操作以确保数据在传输过程中不会被窃取或篡改。 安全日志记录 Java代理可以用于记录应用程序的安全日志包括用户操作、异常事件、安全警报等。通过代理可以将安全日志发送到中央日志服务器进行集中管理和分析以便及时发现和应对安全威胁。 静态Agent使用 创建Maven项目写一个类PreMainTraceAgent使用Maven编译并打成jar包。 package com.example;import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.IllegalClassFormatException; import java.lang.instrument.Instrumentation; import java.security.ProtectionDomain;public class PreMainTraceAgent {public static void premain(String agentArgs, Instrumentation inst) { System.out.println(agentArgs : agentArgs); inst.addTransformer(new DefineTransformer(), true); }static class DefineTransformer implements ClassFileTransformer { static int counts0; Override public byte[] transform( ClassLoader loader, String className, Class? classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer ) throws IllegalClassFormatException { System.out.println(premain load Class: className); System.out.println(filter (counts) class); return classfileBuffer; } } }打成jar包之后我们要注意META-INF目录下的MSNIFEST.MF文件MANIFEST.MF 文件是 Java 归档文件如 JAR 文件的一部分用于描述归档文件的元数据信息和配置。它通常位于归档文件的根目录下。 一些常见的属性我们需要了解 Manifest-Version: 描述了 MANIFEST.MF 文件的版本。 Created-By: 描述了创建该归档文件的工具名称和版本。 Main-Class: 描述了可执行 JAR 文件的入口类Main类当您执行 JAR 文件时Java虚拟机会自动寻找并执行该类中的main方法。 Class-Path: 描述了归档文件中包含的依赖项 JAR 文件的路径以便 Java 虚拟机在运行时能够找到并加载这些依赖项。 在构建和部署 Java 应用程序时MANIFEST.MF 文件可以帮助指定各种元数据信息使得应用程序可以更好地被管理和执行。例如当您创建一个可执行的 JAR 文件时通过指定 Main-Class 属性可以告诉 Java 虚拟机该 JAR 文件的入口点是哪个类。 另外创建一个项目写一个主函数内容随意配置虚拟机选项。这里-javaagent:后面跟上上面项目jar包的绝对路径。 运行结果如图 可以看到premain方法中的代码成功的执行在了Main函数之前。这种使用premain方法在Main函数前执行的也被成为静态agent 帮助网安学习全套资料S信免费领取 ① 网安学习成长路径思维导图 ② 60网安经典常用工具包 ③ 100SRC分析报告 ④ 150网安攻防实战技术电子书 ⑤ 最权威CISSP 认证考试指南题库 ⑥ 超1800页CTF实战技巧手册 ⑦ 最新网安大厂面试题合集含答案 ⑧ APP客户端安全检测指南安卓IOS 动态Agent使用 首先是被代理部分单独的项目 package com.example;import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.IllegalClassFormatException; import java.lang.instrument.Instrumentation; import java.security.ProtectionDomain;public class AgentMain { public static void agentmain(String agentArgs, Instrumentation instrumentation) { instrumentation.addTransformer(new MyTransformer(),true);} public static class MyTransformer implements ClassFileTransformer { static int count 0;Override public byte[] transform( ClassLoader loader, String className, Class? classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { System.out.println(hello world);//这里就是我们能看到的输出。 return classfileBuffer; } } }接下来就是使用Maven打成jar包 默认情况下META-INFMANIFEST.MF文件中有这些内容 Manifest-Version: 1.0 Created-By: Maven JAR Plugin 3.3.0 Build-Jdk-Spec: 11 但是这些是不够的我们需要指出被代理的类。 Manifest-Version: 1.0 Agent-Class: com.example.AgentMain Can-Redefine-Classes: true Can-Retransform-Classes: true Agent-Class指定了代理的入口类。这个属性告诉 Java 虚拟机代理应该从哪个类的 premain 或 agentmain 方法开始执行。premain 方法用于静态代理在 JVM 启动时加载而 agentmain 方法用于动态代理在 JVM 运行时加载。代理的入口类必须包含其中一个方法。 Can-Redefine-Classes指定了代理是否可以重新定义类。如果设置为 true代理将允许重新定义已经加载的类这意味着你可以修改已经加载的类的字节码。这对于某些代理操作如热代码替换非常有用。 Can-Retransform-Classes指定了代理是否可以重新转换类。如果设置为 true代理将允许重新转换已经加载的类这意味着你可以多次修改已经加载的类的字节码。这对于一些特定的代理操作也是非常有用的如 AOP面向切面编程。 因为是动态加载所以我们不需要在虚拟机启动选项中指定jar包的路径。 接下来写主程序的测试类 package org.example;import com.sun.tools.attach.VirtualMachine;import java.io.File; import java.lang.management.ManagementFactory;public class TestMain { public static void main(String[] args) { String agentJarPath C:Users86186DesktopstudyJavauntitledtargetuntitled-1.0-SNAPSHOT.jar; File agentJarFile new File(agentJarPath); if (!agentJarFile.exists()) { System.err.println(Agent JAR file not found.); return; } String name ManagementFactory.getRuntimeMXBean().getName(); String pid name.split()[0];if (pid null) { System.err.println(Unable to find process ID.); return; } String targetClassName AgentMain; try { VirtualMachine vm VirtualMachine.attach(pid); vm.loadAgent(agentJarPath,targetClassName); vm.detach(); } catch (Exception e) { e.printStackTrace(); } }}这里在获取进程号的时候会因为版本的不同而出现错误java9以下默认是正常的java9以上会出现报错我们需要在虚拟机启动参数中加上-Djdk.attach.allowAttachSelftrue。 运行结果 为什么结果中有多个helloworld 这里有讲一下为什么我们在代码中之用了一次sout但是在结果中却出现了多个helloworld。 MyTransformer类中的transform方法中的输出语句只会在类被加载时执行一次但是它会对每个类文件调用一次。由于一个类可能会由多个ClassLoader加载或者同一个ClassLoader可能会加载多次因此会导致多次输出。 这种情况通常在Java应用程序中使用了多个ClassLoader时发生例如Web应用程序中的热部署或者OSGi环境中。每次类被加载transform方法都会被调用一次因此会看到多次输出。 我们可以修改一下代码做测试这里我在每个helloworld后添加了被加载类的名字 修改后的输出结果 实战示例修改目标虚拟机中执行的程序 第一步 首先我们写出我们正在执行的程序循环打印helloworld。 package org.example;import static java.lang.Thread.sleep;public class Main { public static void main(String[] args) throws InterruptedException { while(true) { hello(); sleep(1500); } } public static void hello(){ System.out.println(Hello World!); } }第二步 准备我们的agentmain和ClassFileTransformer实现类。 package com.example;import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.IllegalClassFormatException; import java.lang.instrument.Instrumentation; import java.lang.instrument.UnmodifiableClassException; import java.security.ProtectionDomain;public class AgentMain { public static void agentmain(String agentArgs, Instrumentation instrumentation) throws UnmodifiableClassException { Class [] classes instrumentation.getAllLoadedClasses();//获取目标JVM加载的全部类 for(Class cls : classes){if (cls.getName().equals(org.example.Main)){instrumentation.addTransformer(new HackTransform(),true); instrumentation.retransformClasses(cls); } // System.out.println(cls.getName()); }}}package com.example;import javassist.ClassClassPath; import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod;import java.io.IOException; import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.IllegalClassFormatException; import java.security.ProtectionDomain;public class HackTransform implements ClassFileTransformer {Override public byte[] transform(ClassLoader loader, String className, Class? classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { if (className.equals(org/example/Main)) { try { System.out.println(className);ClassPool classPool ClassPool.getDefault();if (classBeingRedefined ! null) { ClassClassPath ccp new ClassClassPath(classBeingRedefined); classPool.insertClassPath(ccp); }CtClass ctClass classPool.get(org.example.Main); System.out.println(ctClass);CtMethod ctMethod ctClass.getDeclaredMethod(hello);//设置方法体 String body {System.out.println([]Hacker!);}; ctMethod.setBody(body); ctClass.defrost();return ctClass.toBytecode();} catch (Exception e) { e.printStackTrace(); } }return null; } }第三步 把第二步中的两个类打成jar包。并修改其中MANIFEST.MF中的内容。 MANIFEST.MF中的内容 Manifest-Version: 1.0Agent-Class: com.example.AgentMainCan-Redefine-Classes: trueCan-Retransform-Classes: true 第四步 写我们的注入代码 package org.example;import com.sun.tools.attach.*;import java.io.IOException; import java.util.List;public class inject {public static void main(String[] args) throws IOException, AttachNotSupportedException, AgentLoadException, AgentInitializationException { //调用VirtualMachine.list()获取正在运行的JVM列表 ListVirtualMachineDescriptor list VirtualMachine.list(); for (VirtualMachineDescriptor vmd : list) { System.out.println(vmd.displayName());if (vmd.displayName().equals(org.example.Main)) {//连接指定JVM VirtualMachine virtualMachine VirtualMachine.attach(vmd.id()); String agentJarPath C:Users86186DesktopstudyJavauntitledtargetuntitled-1.0-SNAPSHOT.jar; //加载Agent virtualMachine.loadAgent(agentJarPath,com.example.AgentMain); //断开JVM连接 virtualMachine.detach(); }}} }第五步 执行即可先运行主java程序后运行注入程序
http://www.tj-hxxt.cn/news/221397.html

相关文章:

  • 南通市住房城乡建设局网站英雄联盟世界排名
  • 免费的个人主页网页制作网站东阳市城建设局网站
  • 肥西建设局官方网站上海优化外包
  • 做交流网站深圳平面设计公司推荐
  • 做摄影网站网站制作怎么办
  • 乌兰察布网站建设网站开发的基本功能
  • 手机网站布局技术做网站百度还是阿里巴巴好
  • 做网站可以做哪些方面的做网站的钱付款用途写什么
  • 怎么选择顺德网站建设乐清上班族网论坛
  • 网站做直链下载存储解决方案建站国外平台
  • 已经有域名 怎么做网站网页设计作品源代码彼岸花坊
  • 宿迁网站推广公司品牌关键词优化哪家便宜
  • 建设银行集团网站首页网站建设的工作职责是什么
  • 网站建设用什么程序语言石家庄是几线城市
  • 网站做电子链接标识申请好吗网络营销案例并分析
  • mcms怎么做网站集成微信的企业网站管理系统
  • 网站转化wordpress 批量创建目录结构
  • 房山做网站好网站开发公司
  • 惠州网站开发建筑网络计划图
  • 百度上面如何做网站wap商城网站模板素材
  • 广州黄埔网站建设资阳建网站
  • 宝安做棋牌网站建设哪家便宜自己建设公司网站
  • 旅游网站建设服务自己学网站建设
  • 怎么给客户谈做网站如何做一个wordpress
  • 培训学校网站建设阿里主机wordpress
  • 淘宝优惠券网站怎么做的产品设计手绘图片
  • 百度怎样收录网站找客源用哪个软件好
  • 深圳常平网站建设制作公司网络营销试题
  • 网页设计与网站建设完全学习手册pdf有什么免费做代理的网站
  • 加强心理咨询网站的建设牛商网建设的食品网站