【江西和广西源码】【信息分发系统源码】【唐古拉源码】aware源码

时间:2024-11-27 00:45:08 编辑:web巡检 源码 来源:简单的API源码

1.Spring Configuration:@Import的用法和源码解析
2.Spring容器之refresh方法源码分析
3.从源码层面带你实现一个自动注入注解
4.学习编程|Spring源码深度解析 读书笔记 第5章:容器的功能扩展
5.Spring注解驱动开发二狗子让我给他讲讲@EnableAspectJAutoProxy注解
6.fastjson 1.2.24源码分析以及漏洞复现

aware源码

Spring Configuration:@Import的用法和源码解析

       Spring 3.0之后的@Configuration注解和注解配置体系替代了XML配置,本文主要讲解@Import的用法和源码解析。

       @Import的用法

       配置类(带有@Configuration注解)不仅可通过@Bean声明bean,还可通过@Import导入其他类。例如,WebMvcConfig类通过@Import导入其他配置类,江西和广西源码同时启用@EnableWebMvc。

       直接导入

       配置类上使用@Import可以导入一个或多个类,甚至可以出现在父类注解中。如WebMvcConfig导入DelegatingWebMvcConfiguration等。

       ImportBeanDefinitionRegistrar和ImportSelector

       @Import除了导入配置类,还可以导入实现了ImportBeanDefinitionRegistrar(如@EnableAspectJAutoProxy)和ImportSelector(如@EnableTransactionManagement)的类。

       源码解析

       ConfigurationClassPostProcessor负责处理@Configuration类,通过ConfigurationClassParser解析配置和导入,由ConfigurationClassBeanDefinitionReader注册BeanDefinition。在解析过程中,处理@Import避免循环导入,通过导入链和ImportStack进行判断。

       处理直接导入时,通过导入链判断循环。

       处理注册器和选择器时,提前触发Aware接口方法,然后在适当时机注册导入的类。

       总结来说,@Import提供了多种导入方式的灵活性,Spring的源码设计考虑了循环导入和重复解析的处理,展示了其强大的自定义配置能力。

Spring容器之refresh方法源码分析

       Spring容器的核心接口BeanFactory与ApplicationContext之间的关系是继承,ApplicationContext扩展了BeanFactory的信息分发系统源码功能,提供了初始化环境、参数、后处理器、事件处理以及单例bean初始化等更全面的服务,其中refresh方法是Spring应用启动的入口点,负责整个上下文的准备工作。

       让我们深入分析AbstractApplicationContext#refresh方法在启动过程中的具体操作:

准备刷新阶段: 包括系统属性和环境变量的检查和准备。

获取新的BeanFactory: 初始化并解析XML配置文件。

       customizeBeanFactory: 个性化BeanFactory设置,如覆盖定义、处理循环依赖等。

       loadBeanDefinitions: 通过解析XML文件,创建BeanDefinition对象并注入到容器中。

填充BeanFactory功能: 设置classLoader、表达式语言处理器,增强Aware接口处理,添加AspectJ支持和默认系统环境bean等。

激活BeanFactory后处理器: 分为BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor,分别进行BeanDefinition注册和BeanFactory增强。

注册BeanPostProcessors: 拦截Bean创建的后处理器,按优先级注册。

初始化其他组件: 包括MessageSource、ApplicationEventMulticaster和监听器。

初始化非惰性单例: 预先实例化这些对象。

刷新完成: 通知生命周期处理器并触发ContextRefreshedEvent。

       以上是refresh方法在Spring应用启动流程中的关键步骤。以上内容仅为个人理解,如需更多信息,唐古拉源码可参考CSDN博客链接。

从源码层面带你实现一个自动注入注解

       首先,需要了解到的是。SpringBean的生命周期

       在生命周期中。注入bean属性的位置是在以下代码:populateBean位置中

       那么我们在项目中使用注解产生一个bean的时候必定会经过以下代码进行一个bean的创建流程

/**省略代码**///开始初始化bean实例对象ObjectexposedObject=bean;try{ //<5>对bean进行填充,将各个属性值注入,其中,可能存在依赖于其他bean的属性populateBean(beanName,mbd,instanceWrapper);//<6>调用初始化方法exposedObject=initializeBean(beanName,exposedObject,mbd);}catch(Throwableex){ if(exinstanceofBeanCreationException&&beanName.equals(((BeanCreationException)ex).getBeanName())){ throw(BeanCreationException)ex;}else{ thrownewBeanCreationException(mbd.getResourceDescription(),beanName,"Initializationofbeanfailed",ex);}}/**省略代码**/

       在生命周期中populateBean进行填充bean数据。把其他依赖引入进来

       BeanPostProcessor是一个bean创建时候的一个钩子。

       以下代码是循环调用实现了BeanPostProcessor子类InstantiationAwareBeanPostProcessor#postProcessProperties方法

       Spring在以下代码中有自动注入的拓展点。关键就是实现InstantiationAwareBeanPostProcessor#postProcessProperties

/**省略代码**/for(BeanPostProcessorbp:getBeanPostProcessors()){ if(bpinstanceofInstantiationAwareBeanPostProcessor){ InstantiationAwareBeanPostProcessoribp=(InstantiationAwareBeanPostProcessor)bp;//对所有需要依赖检查的属性进行后处理PropertyValuespvsToUse=ibp.postProcessProperties(pvs,bw.getWrappedInstance(),beanName);if(pvsToUse==null){ //从bw对象中提取PropertyDescriptor结果集//PropertyDescriptor:可以通过一对存取方法提取一个属性if(filteredPds==null){ filteredPds=filterPropertyDescriptorsForDependencyCheck(bw,mbd.allowCaching);}pvsToUse=ibp.postProcessPropertyValues(pvs,filteredPds,bw.getWrappedInstance(),beanName);if(pvsToUse==null){ return;}}pvs=pvsToUse;}}/**省略代码**/

       我们展开来讲一下@Autowired的实现是怎么样的吧:

       实现类为AutowiredAnnotationBeanPostProcessor.java

       从上面可以得知,填充bean的时候。时调用了方法ibp.postProcessPropertyValues()

       那么AutowiredAnnotationBeanPostProcessor#postProcessPropertyValues()则会被调用

       调用findAutowiringMetadata获取class以及父类带有@Autowired或者@Value的属性或者方法:

/**省略代码**/publicPropertyValuespostProcessProperties(PropertyValuespvs,Objectbean,StringbeanName){ //获取所有可以注入的元数据InjectionMetadatametadata=findAutowiringMetadata(beanName,bean.getClass(),pvs);try{ //注入数据metadata.inject(bean,beanName,pvs);}catch(BeanCreationExceptionex){ throwex;}catch(Throwableex){ thrownewBeanCreationException(beanName,"Injectionofautowireddependenciesfailed",ex);}returnpvs;}privateInjectionMetadatafindAutowiringMetadata(StringbeanName,Class<?>clazz,@NullablePropertyValuespvs){ //缓存名字获取StringcacheKey=(StringUtils.hasLength(beanName)?beanName:clazz.getName());InjectionMetadatametadata=this.injectionMetadataCache.get(cacheKey);//获取是否已经读取过这个class类的InjectionMetadata有的话直接从缓存中获取出去if(InjectionMetadata.needsRefresh(metadata,clazz)){ synchronized(this.injectionMetadataCache){ //双重检查metadata=this.injectionMetadataCache.get(cacheKey);if(InjectionMetadata.needsRefresh(metadata,clazz)){ if(metadata!=null){ metadata.clear(pvs);}//构建自动注入的元数据metadata=buildAutowiringMetadata(clazz);this.injectionMetadataCache.put(cacheKey,metadata);}}}returnmetadata;}privateInjectionMetadatabuildAutowiringMetadata(finalClass<?>clazz){ if(!AnnotationUtils.isCandidateClass(clazz,this.autowiredAnnotationTypes)){ returnInjectionMetadata.EMPTY;}List<InjectionMetadata.InjectedElement>elements=newArrayList<>();Class<?>targetClass=clazz;do{ finalList<InjectionMetadata.InjectedElement>currElements=newArrayList<>();//循环targetClass的所有field并执FieldCallback逻辑(函数式编程接口,传入的是一个执行函数)ReflectionUtils.doWithLocalFields(targetClass,field->{ //获得字段上面的Annotation注解MergedAnnotation<?>ann=findAutowiredAnnotation(field);if(ann!=null){ //判断是否为静态属性如果是,则不进行注入if(Modifier.isStatic(field.getModifiers())){ if(logger.isInfoEnabled()){ logger.info("Autowiredannotationisnotsupportedonstaticfields:"+field);}return;}//注解是否为必须依赖项booleanrequired=determineRequiredStatus(ann);currElements.add(newAutowiredFieldElement(field,required));}});//循环targetClass的所有Method并执MethodCallback逻辑(函数式编程接口,传入的是一个执行函数)ReflectionUtils.doWithLocalMethods(targetClass,method->{ MethodbridgedMethod=BridgeMethodResolver.findBridgedMethod(method);if(!BridgeMethodResolver.isVisibilityBridgeMethodPair(method,bridgedMethod)){ return;}MergedAnnotation<?>ann=findAutowiredAnnotation(bridgedMethod);if(ann!=null&&method.equals(ClassUtils.getMostSpecificMethod(method,clazz))){ //判断是否为静态方法如果是,则不进行注入if(Modifier.isStatic(method.getModifiers())){ if(logger.isInfoEnabled()){ logger.info("Autowiredannotationisnotsupportedonstaticmethods:"+method);}return;}//判断静态方法参数是否为0if(method.getParameterCount()==0){ if(logger.isInfoEnabled()){ logger.info("Autowiredannotationshouldonlybeusedonmethodswithparameters:"+method);}}booleanrequired=determineRequiredStatus(ann);PropertyDescriptorpd=BeanUtils.findPropertyForMethod(bridgedMethod,clazz);currElements.add(newAutowiredMethodElement(method,required,pd));}});//数据加到数组最前方父类的的注解都放在靠前的位置elements.addAll(0,currElements);//如果有父类则设置targetClass为父类。如此循环targetClass=targetClass.getSuperclass();}while(targetClass!=null&&targetClass!=Object.class);returnInjectionMetadata.forElements(elements,clazz);}/**省略代码**/

       真正注入数据的是metadata.inject(bean,beanName,pvs);

       调用的是InjectionMetadata#inject方法

publicvoidinject(Objecttarget,@NullableStringbeanName,@NullablePropertyValuespvs)throwsThrowable{ Collection<InjectedElement>checkedElements=this.checkedElements;//带有注解的方法或者属性列表Collection<InjectedElement>elementsToIterate=(checkedElements!=null?checkedElements:this.injectedElements);if(!elementsToIterate.isEmpty()){ for(InjectedElementelement:elementsToIterate){ element.inject(target,beanName,pvs);}}}

       循环调用之前加入的带有注解的方法或者属性构建的对象AutowiredFieldElement#inject,AutowiredMethodElement#inject

/***属性上有注解构建的处理对象*/privateclassAutowiredFieldElementextendsInjectionMetadata.InjectedElement{ privatefinalbooleanrequired;privatevolatilebooleancached;@NullableprivatevolatileObjectcachedFieldValue;publicAutowiredFieldElement(Fieldfield,booleanrequired){ super(field,null);this.required=required;}@Overrideprotectedvoidinject(Objectbean,@NullableStringbeanName,@NullablePropertyValuespvs)throwsThrowable{ //获取属性名Fieldfield=(Field)this.member;Objectvalue;//Bean不是单例的话,会重复进入注入的这个操作,if(this.cached){ try{ value=resolvedCachedArgument(beanName,this.cachedFieldValue);}catch(NoSuchBeanDefinitionExceptionex){ //Unexpectedremovaloftargetbeanforcachedargument->re-resolvevalue=resolveFieldValue(field,bean,beanName);}}else{ //首次创建的时候进入该方法value=resolveFieldValue(field,bean,beanName);}if(value!=null){ //属性如果不为public的话,则设置为可访问ReflectionUtils.makeAccessible(field);field.set(bean,value);}}@NullableprivateObjectresolveFieldValue(Fieldfield,Objectbean,@NullableStringbeanName){ //构建DependencyDescriptor对象DependencyDescriptordesc=newDependencyDescriptor(field,this.required);desc.setContainingClass(bean.getClass());//注入bean的数量。有可能字段上是一个ListSet<String>autowiredBeanNames=newLinkedHashSet<>(1);Assert.state(beanFactory!=null,"NoBeanFactoryavailable");//获得beanFactory类型转换类TypeConvertertypeConverter=beanFactory.getTypeConverter();Objectvalue;try{ //查找依赖关系value=beanFactory.resolveDependency(desc,beanName,autowiredBeanNames,typeConverter);}catch(BeansExceptionex){ thrownewUnsatisfiedDependencyException(null,beanName,newInjectionPoint(field),ex);}synchronized(this){ if(!this.cached){ ObjectcachedFieldValue=null;if(value!=null||this.required){ cachedFieldValue=desc;//填入依赖关系registerDependentBeans(beanName,autowiredBeanNames);//判断如果注入依赖是只有一个if(autowiredBeanNames.size()==1){ StringautowiredBeanName=autowiredBeanNames.iterator().next();if(beanFactory.containsBean(autowiredBeanName)&&beanFactory.isTypeMatch(autowiredBeanName,field.getType())){ cachedFieldValue=newShortcutDependencyDescriptor(desc,autowiredBeanName,field.getType());}}}this.cachedFieldValue=cachedFieldValue;this.cached=true;}}returnvalue;}}/***方法上有注解构建的处理对象*/privateclassAutowiredMethodElementextendsInjectionMetadata.InjectedElement{ privatefinalbooleanrequired;privatevolatilebooleancached;@NullableprivatevolatileObject[]cachedMethodArguments;publicAutowiredMethodElement(Methodmethod,booleanrequired,@NullablePropertyDescriptorpd){ super(method,pd);this.required=required;}@Overrideprotectedvoidinject(Objectbean,@NullableStringbeanName,@NullablePropertyValuespvs)throwsThrowable{ //检查属性是不会在之前就已经注入过了。如果主如果则不进行二次覆盖if(checkPropertySkipping(pvs)){ return;}Methodmethod=(Method)this.member;Object[]arguments;if(this.cached){ try{ arguments=resolveCachedArguments(beanName);}catch(NoSuchBeanDefinitionExceptionex){ //Unexpectedremovaloftargetbeanforcachedargument->re-resolvearguments=resolveMethodArguments(method,bean,beanName);}}else{ //首次创建的时候进入该方法arguments=resolveMethodArguments(method,bean,beanName);}if(arguments!=null){ try{ //属性如果不为public的话,则设置为可访问ReflectionUtils.makeAccessible(method);//调用方法并传入参数method.invoke(bean,arguments);}catch(InvocationTargetExceptionex){ throwex.getTargetException();}}}@NullableprivateObject[]resolveCachedArguments(@NullableStringbeanName){ Object[]cachedMethodArguments=this.cachedMethodArguments;if(cachedMethodArguments==null){ returnnull;}Object[]arguments=newObject[cachedMethodArguments.length];for(inti=0;i<arguments.length;i++){ arguments[i]=resolvedCachedArgument(beanName,cachedMethodArguments[i]);}returnarguments;}@NullableprivateObject[]resolveMethodArguments(Methodmethod,Objectbean,@NullableStringbeanName){ //获取方法上有几个参数intargumentCount=method.getParameterCount();Object[]arguments=newObject[argumentCount];DependencyDescriptor[]descriptors=newDependencyDescriptor[argumentCount];Set<String>autowiredBeans=newLinkedHashSet<>(argumentCount);Assert.state(beanFactory!=null,"NoBeanFactoryavailable");TypeConvertertypeConverter=beanFactory.getTypeConverter();for(inti=0;i<arguments.length;i++){ //方法参数,从方法参数中取出i构造MethodParameter对象MethodParametermethodParam=newMethodParameter(method,i);DependencyDescriptorcurrDesc=newDependencyDescriptor(methodParam,this.required);currDesc.setContainingClass(bean.getClass());descriptors[i]=currDesc;try{ //获取方法中i参数的内容Objectarg=beanFactory.resolveDependency(currDesc,beanName,autowiredBeans,typeConverter);if(arg==null&

学习编程|Spring源码深度解析 读书笔记 第5章:容器的功能扩展

       深入理解Spring容器的扩展功能:学习笔记

       作者:牛客网-张学友

       在Spring框架中,容器功能的扩展是其强大和灵活的关键。首先,项目管理源码javaApplicationContext相较于BeanFactory,提供了更多功能,它是BeanFactory的子类,包含了其所有功能并有所扩充。主要区分点在于ApplicationContext的启动过程和其特有的扩展功能。

       通过`ClassPathXmlApplicationContext`的实例化,开启源码探索之旅。在构造函数和`refresh`方法中,Spring对配置文件解析,并实现了一系列扩展,如环境变量处理、配置文件加载、Spring Expression Language (SPEL)的支持、属性编辑器的注册以及ApplicationContextAwareProcessor的使用等。这些扩展不仅增强了容器的灵活性,还为开发者提供了更丰富的控制选项。

       例如,`refresh`方法中包含了初始化准备工作、BeanFactory的获取和定制、XML文件解析、bean定义填充、Spring表达式解析、属性编辑器注册、BeanPostProcessor的处理、依赖处理和国际化功能等。这些步骤体现了Spring框架的高度可扩展性,使得用户可以根据项目需求定制容器行为。

       总结来说,源码熊登录网站Spring容器的功能扩展涉及到了配置文件处理、表达式语言、事件监听、国际化等多个方面,使得开发过程更加便捷且易于定制。想了解更多细节,可以参考作者的原文链接和更多读书笔记资源。

Spring注解驱动开发二狗子让我给他讲讲@EnableAspectJAutoProxy注解

       在配置类上添加@EnableAspectJAutoProxy注解,能够开启注解版的AOP功能。这意味着,如果在AOP中要启用注解版的AOP功能,就需要在配置类上添加@EnableAspectJAutoProxy注解。让我们来看看@EnableAspectJAutoProxy注解的源码,如下所示。

       从源码可以看出,@EnableAspectJAutoProxy注解使用@Import注解引入了AspectJAutoProxyRegister.class对象。那么,AspectJAutoProxyRegistrar是做什么的呢?我们点击到AspectJAutoProxyRegistrar类的源码中,如下所示。

       可以看到AspectJAutoProxyRegistrar类实现了ImportBeanDefinitionRegistrar接口。我们回顾ImportBeanDefinitionRegistrar接口的定义,如下所示。

       通过ImportBeanDefinitionRegistrar接口,我们可以实现将自定义的组件添加到IOC容器中。也就是说,@EnableAspectJAutoProxy注解使用AspectJAutoProxyRegistrar对象自定义组件,并将相应的组件添加到IOC容器中。

       在AspectJAutoProxyRegistrar类的registerBeanDefinitions()方法中设置断点,我们以debug的方法来运行AopTest类的testAop()方法。当程序运行到断点位置时,我们可以看到程序已经暂停,IDEA的左下角显示了方法的调用栈。

       在registerBeanDefinitions()方法中,首先调用AopConfigUtils类的registerAspectJAnnotationAutoProxyCreatorIfNecessary()方法来注册registry。在registerAspectJAnnotationAutoProxyCreatorIfNecessary()方法中,直接调用了重载的registerAspectJAnnotationAutoProxyCreatorIfNecessary()方法。在重载的registerAspectJAnnotationAutoProxyCreatorIfNecessary()方法中,传入了AnnotationAwareAspectJAutoProxyCreator.class对象。

       在registerOrEscalateApcAsRequired()方法中,接收到的Class对象的类型为:org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator。然后,我们继续跟进代码。

       在registerOrEscalateApcAsRequired()方法中,首先判断registry是否包含org.springframework.aop.config.internalAutoProxyCreator类型的bean。接下来,我们继续看代码。

       最终,AopConfigUtils类的registerOrEscalateApcAsRequired()方法中,会通过registry调用registerBeanDefinition()方法注册组件,并注册的bean的名称为org.springframework.aop.config.internalAutoProxyCreator。

       接下来,我们继续看AspectJAutoProxyRegistrar类的registerBeanDefinitions()源码。我们通过AnnotationConfigUtils类的attributesFor方法来获取@EnableAspectJAutoProxy注解的信息。接下来,我们继续判断proxyTargetClass属性的值是否为true,如果为true则调用AopConfigUtils类的forceAutoProxyCreatorToUseClassProxying()方法;继续判断exposeProxy属性的值是否为true,如果为true则调用AopConfigUtils类的forceAutoProxyCreatorToExposeProxy()方法。

       综上所述,向Spring的配置类上添加@EnableAspectJAutoProxy注解后,会向IOC容器中注册AnnotationAwareAspectJAutoProxyCreator。

       了解了这些之后,我们就可以关注「冰河技术」微信公众号,后台回复不同的关键字获取相应的PDF文档。这些文档都是由冰河原创并整理的超硬核教程,包括《深入浅出Java 种设计模式》、《Java8新特性教程》和《亿级流量下的分布式限流解决方案》,都是面试必备的资料。

       最后,如果你觉得这篇文章对你有帮助,别忘了点个赞,给个在看和转发,让更多的人看到,一起学习,一起进步!

fastjson 1.2.源码分析以及漏洞复现

       反序列化,这个过程将字节序列恢复为Java对象。例如在使用Python做自动化测试时,通过字符串名字调用相同名字的方法。Fastjson的功能允许通过字符串引用如`@type":"com.sun.rowset.JdbcRowSetImpl`来执行内部方法。由此,我们能利用Fastjson提供的便利,通过调用对应的函数来验证漏洞。

       在渗透测试中,漏洞的验证通常需要满足几个条件:判断指纹和指纹回显,Fastjson的特性使得这一步变得简单。然而,在利用过程中,要考虑到Fastjson本身的限制、JDK的限制以及可能的安全配置限制。因此,POC验证方案需考虑这些限制的版本和配置。

       Fastjson通过JSON抽象类实现JSONAware接口,并提供两个常用方法:`toJSONString`用于对象转换为JsonString,`parseObject`用于将JSON字符串转换为对象。这次的漏洞主要与反序列化相关。

       反序列化的执行发生在`DefaultJSONParser.java`类中。关键代码中,固定键`@type`对应反序列化类的全路径,其中`typeName`为传入类的全路径。在Fastjson 1.2.版本中,`loadClass`方法未进行任何过滤,允许传入任何JVM加载的类,并执行`setKey`方法,其中Key为可变参数。

       要利用这个反序列化漏洞,需要满足以下条件:JVM加载的类、有非静态set方法和传入一个参数。使用RPC远程执行代码的思路实现POC,此处使用了`com.sun.rowset.JdbcRowSetImpl`实现。

       JNDI全称为Java Naming and Directory Interface,主要提供应用程序资源命名与目录服务。其底层实现之一是RMI(Remote Method Invocation),用于Java环境的远程方法调用。在`com.sun.rowset.JdbcRowSetImpl`类中,关注点在于`getDataSourceName()`和`setAutoCommit()`方法。`getDataSourceName()`用于传值,`setAutoCommit()`用于确认调用set方法。

       实现过程包括引用`com.sun.rowset.JdbcRowSetImpl`类、设置`dataSourceName`传值以及通过`autoCommit`属性触发执行方法。完成方法确认后,使用`marshalsec`项目启动RMI服务并加载远程类。

       POC的实现步骤如下:首先确认目标是否使用Fastjson且存在漏洞;利用Fastjson的反序列化功能传输引用类和执行方法;使用`com.sun.rowset.JdbcRowSetImpl`执行验证POC的脚本,并观察回显结果;最后,完成漏洞利用。

       具体操作包括搭建环境,如使用CentOS虚拟机作为RMI服务器和远程调用服务,KALI机器作为靶机和抓包测试。进行指纹确认、安装maven、构建RMI服务器和客户端、调用测试文件,并观察DNS日志以验证漏洞成功利用。通过DNS日志确认漏洞利用成功后,可以进一步尝试反弹shell,实现远程控制。

       综上所述,Fastjson的反序列化漏洞是一个可以被利用的安全问题,通过合理的利用,可以实现远程代码执行。了解和研究这类漏洞有助于增强对Fastjson以及类似技术的防御能力。

cs1.5怎么弄到可以射出线拉你过去

       这是安装了一个插件

       我也玩这个的

       不记得下载的地方了

       呵呵

       你QQ多少?

       我发给你

       我QQ

       下完后

       会有三个文件

       把它们在CS目录中覆盖strike就好了

       插件信息:

       ; 允许使用 AMX Mod 插件

       amxmod_compat.amxx ; 兼容amx插件

       ; 自定义类 - 添加第三方插件到这里

       GHW_New_Smokes.amxx ;鬼烟雾

       ;hold_the_bomb.amxx ;用户将被安葬

       ;X-Kills.amxx ;每你,你的frag将增加2个

       ;weapon_jam.amxx ;枪前果酱

       ;GHW_BN.amxx ;特殊手榴弹

       ;Set_Buyzone.amxx ; 1.5设置买枪区插件 [-不推荐使用-]

       cs_onehitknifekills.amxx ;一刀斩啦~ =[-推荐使用-]=

       advanced_slowmo.amxx ;死亡慢动作

       BloodFootSteps.amxx ;血脚印

       easyinfo.amxx ;它显示一个不错的信息thingie就左手角落

       no_team_flash.amxx ;你不会射出你的队友们

       jumpkick.amxx ;踢人插件命令+jump

       credits.amxx ;武器升级插件

       ------------------------------------------------------------------------------------

       amx_super.amxx ;很多NB的命令,不能一一列出,因为太多了-_-!

       custom_spray_sound.amxx ;喷图音效

       lighting_smoke_nades.amxx ;烟雾爆炸时有彩色光影,和真实闪光效果差不多

       blood_thirsty.amxx ;被刀捅的人掉血,屏幕闪红色

       flashbang_dlight.amxx ;闪光爆炸时的真实效果 { 推荐}

       PreventAttackServer.amxx ;防炸1.5服务器{ 不是很好使,继续-_-!}

       ;nomore_grenade.amxx ;每局只能买1雷2闪光1烟雾

       5Buy_Nades_Limit.amxx ; 每局只能买2雷2闪光8烟雾

       adminlisten.amxx ;op看见任何人说话

       grenades_are_heavy.amxx ;o3,o4,o5砸人掉血,被砸人屏幕视角变化

       colored_flashbangs.amxx ;彩色闪光

       start_health.amx ; 玩家出生自动HP值

       2weapons_glow.amxx ;[AMXX]2使用M4-AK发光插件 =[-推荐使用-]=

       ;weaponcloak.amxx ;武器斗篷透明插件

       SpeedUP.amxx ; 速度 =[-推荐使用-]=

       4plugin_bonus1.amxx ; 前名杀人加钱奖励播放音效插件

       amx_ejl_spacedudehook.amx ; 蜘蛛侠钩子 命令 bind "f" "+hook" =[-推荐使用-]=

       covertopsv.amxx :AMXX对敌人死尸换衣服插件bind V getclothes =[-推荐使用-]=

       buym4ak.amxx :[CT可买AK插件]在游戏里按< Y >输入</AK>或按< Y >输入</M4>就行

       restartgame.amxx ; 自动刷新三次 命令 amx_restartgame

       imessage.amxx ; Lu Lu:QQ

       ;scrollmsg.amxx ; Lu Lu:QQ

       scrollmsg.amx ;

       awppunish.amxx ; 使用AWP则健康惩罚amx_awp_mode ab

       awpaware.amx ; 使用AWP身体发光 =[-推荐使用-]=

       zoom_info.amxx ; 显示AWP开镜资料 =[-推荐使用-]=

       noweapdropondeath.amxx ; 死后不掉落任何武器 =[-推荐使用-]=

       unlimitedmoney.amxx ; 无限金钱2 =[-推荐使用-]=

       TimeProjector_cn.amxx ; 在右上角显示时间 =[-推荐使用-]=

       slaylosers.amxx ; C4任务失败处死插件 =[-推荐使用-]=

       sillyc4.amxx ; 拆C4的时候会显示一传密码数字 =[-推荐使用-]=

       bcd_hud.amxx ; C4秒数倒数显示插件{ 推荐} =[-推荐使用-]=

       bombcountdown.amxx ; C4秒数倒数显示插件{ 推荐

       BombReward.amxx ; C4被拆奖励全体警察元

       c4_kill.amxx ; C4炸死人也算到玩家Frags

       ;plant_anywhere.amxx ; C4随意安 (amx_plantanywhere 1)

       hy_ct_pickc4.amxx ; 警察捡C4安装C4{ 推荐} =[-推荐使用-]=

       death_timer.amxx ; 死后出现红色画面.排名.剩余时间 =[-推荐使用-]=

       bullet_damage.amxx ;伤害显视插件 =[-推荐使用-]=

       awp_crosshair.amxx :AWP十字准线 =[-推荐使用-]=

       hitplace_details.amxx :死后 知道自己比人射中几多枪 =[-推荐使用-]=

       weapon_icon_v1.0b.amxx :游戏时左边显示武器图像插件 =[-推荐使用-]=

       ;weapon_icon.amxx ;显示武器图像插件

       armordrop.amxx :[AMXX]CS 防具掉出插件

       zoom_info.amxx ;显示AWP开镜资料 =[-推荐使用-]=

       amx_adminpush.amxx :AMXX推人插件 =[-推荐使用-]=

       knife_after_throw_nade.amxx ;扔雷换刀插件 =[-推荐使用-]=

       user_defuse.amxx ;自动发放警察拆弹刀 =[-推荐使用-]=

       slaylogo.amxx :AMXX喷尸者自杀插件

       wartracers.amxx ; 一粒一粒的弹道插件 =[-推荐使用-]=

       deathbeams.amxx ; 死亡射线插件 =[-推荐使用-]=

       amx_dib.amx ; 显示死亡原因弹道 =[-推荐使用-]=

       knife_after_throw_nade.amxx ; 扔雷换刀插件 =[-推荐使用-]= \

       grentrail.amxx ; 手雷彩色拖尾= =[-推荐使用-]=

       leader_glow.amxx ;排名第一的人身体发光

       ;SniperWar.amxx ; AWP盲狙插件- amx_sniper_war 1 不能使用瞄准镜 { 推荐}

       ;tracer_fire.amx ; 彩色弹道 命令 amx_tracers n n为0到4

       plugin_bonus.amxx :前名杀人加血插件

       plugin_gore.amxx :彩色血腥插件1 =[-推荐使用-]=

       ammodepl.amxx ;没子弹 语音提示

       stats.amx ;stats状态显示插件for1.5

       nonadesthruwalls.amxx ;禁止手雷穿墙伤害

       ;reloadbar.amxx ;换弹似拆c4

       ;one_name.amxx ;禁止改名

       Allied_Forces_showip,SteamID.amxx ;入场&离场显示IP

       ;laser_sight.amxx :[AMXX]红外线插件! 正say /buyls =[-推荐使用-]=

       ;ultimate_sounds.amxx ;最终的声音插件

       ;backweapons.amxx ; 全新背枪插件

       ---------------------------------------------------------------------------------------------------------------------

       ;Bullet_tracer.amxx ;血弹道{ 推荐} =[-推荐使用-]=

       ;he_damage_effect.amxx ;被手雷炸中个震动+声音插件

       ;throw_like_a_girl.amxx ; 手雷反弹插件{ 推荐}

       ;BombSite_Radar.amxx ;放C4点会在雷达上红色闪烁显示包点所在位置{ 推荐}

       ;amx_knivesonly.amxx ;刀战模式(用法:amx_knivesonly 1,1=开 0=关)

       ;admin_changename.amxx ;改玩家名字 用法amx_name <name> <newname>

       ;CrazyBouncingNades.amxx ;其中爆炸

       ;admin_mark.amxx ;T+特别头盔amx_admin_mark 1 [0关

       ;vampire.amxx ;这将是有益的

       ;anticamping.amx ;Camper会有心跳,以警示别人

       ;tru-sprite-show.amxx :改--头上图案插件!! 正amx_sprite #1 flag =[-推荐使用-]=

       :death_explode.amxx ; 玩家死后自爆 [-不推荐使用-]

       ;liuyangyang1.amxx ; 烟火骷髅暴雷 [-不推荐使用-]

       :amx_startm4a1.amxx ; 开局免费赠送M4a1 [-不推荐使用-]

       ;magic_marker.amxx :涂鸦插件只要在cs中按右键便可以任意涂鸦。 =[-推荐使用-]=

       ;jetpack_cn.amxx :火焰推行器bind u buyjet =[-推荐使用-]=

       ;chicken_bombs.amxx ;超级手雷

       ;liuyangyang.amxx ; 1.5防炸插件

       ;portal.amxx ; AMXX时空门插件

       ;Bullet_Whizz.amxx ; 子弹在空中的声音

       ;full_server_idler_kicker.amxx ;已满服务器自动t不动玩家

       ;ghw_basic_commands.amxx ;基本命令(amx_friendlyfire 等)

       ;customflashlight.amxx ;更好地手电效果

       ;kickthenades.amxx ;按e踢雷(o3,o4,o5),得离雷近一点

       ;grenade_trail.amxx ;新版手雷轨迹(可以调每种雷的颜色,详见源代码)

       ;amxx_atac_cfg.1.1..amxx ;自残惩罚1

       ;atac.2.5.5.5.amxx ;自残惩罚2

       ;chicken_bombs.amxx ;手雷变小鸡,还可以把人砸动哦

       ;key_bind.amxx ;绑定按键 一般不推荐用

       ;csnadedrops.amxx ;死了之后掉手雷,烟雾,闪光

       ;noobjectives.amxx ;去掉任务目标c4 ,去掉计时器(小地图推荐blood=)

       ;anticamping_multi.amxx ; 蹲坑监视

       ;say_menu.amxx ; 按Y键后输入menu可以打开管理员菜单或玩家菜单

       ;votemenu.amxx ; 投票踢出玩家和投票封禁玩家

       high_ping_kicker.amxx ; 踢高Ping

       ---------------------------------------------------------------------------------------------------------------------

搜索关键词:西祠胡同评论源码