1.Spring Configuration:@Import的用法和源码解析
2.Spring容器之refresh方法源码分析
3.从源码层面带你实现一个自动注入注解
4.学习编程|Spring源码深度解析 读书笔记 第5章:容器的功能扩展
5.Spring注解驱动开发二狗子让我给他讲讲@EnableAspectJAutoProxy注解
6.fastjson 1.2.24源码分析以及漏洞复现
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的kiwisdr开源源码功能,提供了初始化环境、参数、后处理器、事件处理以及单例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应用启动流程中的关键步骤。以上内容仅为个人理解,如需更多信息,flink源码深度分析可参考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框架中,容器功能的扩展是其强大和灵活的关键。首先,打金雷霆源码ApplicationContext相较于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
---------------------------------------------------------------------------------------------------------------------