日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Living in the Matrix with Bytecode Manipulation--转

發布時間:2025/4/5 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Living in the Matrix with Bytecode Manipulation--转 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文地址:https://www.infoq.com/articles/Living-Matrix-Bytecode-Manipulation

You are probably all too familiar with the following sequence: You input a .java file into a Java compiler, (likely using javac or a build tool like ANT, Maven or Gradle), the compiler grinds away, and finally emits one or more .class files.?

Figure 1: What is Java bytecode?

If you run the build from the command line with verbose enabled, you can see the output as it parses your file until finally it prints your .class file.?

javac -verbose src/com/example/spring2gx/BankTransactions.java

The generated .class file contains the bytecode, essentially the instruction set for the Java virtual machine (JVM), and is what gets loaded by the Java runtime class loader when a program executes.

In this article we will investigate Java bytecode and how to manipulate it, and why anyone would ever want to do so.

Bytecode-manipulation frameworks

Some of the more popular frameworks for manipulating bytecode include:

  • ASM
  • AspectJ,
  • BCEL,
  • Byte Buddy,
  • CGLIB,
  • Cojen,
  • Javassist, and
  • Serp.

This article focuses on Javassist and ASM.

Why should you care about manipulating bytecode?

Many common Java libraries such as Spring and Hibernate, as well as most JVM languages and even your IDEs, use bytecode-manipulation frameworks. For that reason, and because it’s really quite fun, you might find bytecode manipulation a valuable skillset to have. You can use bytecode manipulation to perform many tasks that would be difficult or impossible to do otherwise, and once you learn it, the sky's the limit.?

One important use case is program analysis. For example, the popular FindBugs bug-locator tool uses ASM under the hood to analyze your bytecode and locate bug patterns. Some software shops have code-complexity rules such as a maximum number of if/else statements in a method or a maximum method size. Static analysis tools analyze your bytecode to determine the code complexity.

Another common use is class generation. For example, ORM frameworks typically use proxies based on your class definitions. Or consider security applications that provide syntax for adding authorization annotations. Such use cases lend themselves nicely to bytecode manipulation.

JVM languages such as Scala, Groovy, and Grails all use a bytecode-manipulation framework.

Consider a situation where you need to transform library classes without having the source code, a task routinely performed by Java profilers. For example, at New Relic, bytecode instrumentation is used to time method executions.

With bytecode manipulation, you can optimize or obfuscate your code, or you can introduce functionality such as adding strategic logging to an application. This article will focus on a logging example, which will provide the basic tools for using these bytecode manipulation frameworks.

Our example

Sue is in charge of ATM coding for a bank. She has a new requirement: add key data to the logs for some designated important actions.

Here is a simplified bank-transactions class. It allows a user to log in with a username and password, does some processing, withdraws a sum of money, and then prints out “transactions completed.” The important actions are the login and withdrawal.

public void login(String password, String accountId, String userName) { // login logic } public void withdraw(String accountId, Double moneyToRemove) { // transaction logic }

To simplify the coding, Sue would like to create an?@ImportantLog?annotation for those method calls, containing input parameters that represent the indexes of the method arguments she wants to record. With that, she can annotate her?login?and?withdraw?methods.?

/*** A method annotation which should be used to indicate* important methods whose invocations should be logged.*/public @interface ImportantLog { /** * The method parameter indexes whose values should be logged. * For example,if we have the method * hello(int paramA, int paramB, int paramC), and we * wanted to log the values of paramA and paramC, then fields * would be ["0","2"]. If we only want to log the value of * paramB, then fields would be ["1"]. */ String[] fields(); }

For?login, Sue wants to record the account ID and the username so her fields will be set to “1” and “2”, (she doesn’t want to display the password!) For the?withdraw?method, her fields are “0” and “1” because she wants to output the first two fields: account ID and the amount of money to remove. Her audit log ideally will contain something like this:

To hook this up, Sue is going to use a Java agent. Introduced in JDK 1.5, Java agents allow you to modify the bytes that comprise the classes in a running JVM, without requiring any source code.

Without an agent, the normal execution flow of Sue’s program is:

  • Run Java on a main class, which is then loaded by a class loader.
  • Call the class’s main method, which executes the defined process.
  • Print “transactions completed.”
  • When you introduce a Java agent, a few more things happen — but let’s first see what’s required to create an agent. An agent must contain a class with a premain method. It must be packaged as a JAR file with a properly constructed manifest that contains a?Premain-Class?entry. There is a switch that must be set on launch to point to the JAR path, which makes the JVM aware of the agent.

    java -javaagent:/to/agent.jar com/example/spring2gx/BankTransactions

    Inside premain, register a?Transformer?that captures the bytes of every class as it is loaded, makes any desired modifications, and returns the modified bytes. In Sue’s example,?Transformercaptures?BankTransaction, which is where she makes her modifications and returns the modified bytes. Those are the bytes that are loaded by the class loader, and which the main method will execute to perform its original functionality in addition to Sue’s required augmented logging.

    When the agent class is loaded, its?premain?method is invoked before the application?mainmethod.

    Figure 2: Process with Java agent.

    It’s best to look at an example.

    The?Agent?class doesn’t implement any interface, but it must contain a?premain?method, as follows:

    The?Transformer?class contains a?transform?method, whose signature accepts a?ClassLoader, class name,?Class?object of the class being redefined,?ProtectionDomain?defining permissions, and the original bytes of the class. Returning?null?from the?transform?method tells the runtime that no changes have been made to that class.

    To modify the class bytes, supply your bytecode manipulation logic in?transform?and return the modified bytes.

    Javassist

    A subproject of JBoss, Javassist (short for “Java Programming Assistant”) consists of a high-level object-based API and a lower-level one that is closer to the bytecode. The more object-based one enjoys more community activity and is the focus of this article. For a complete tutorial, refer to the?Javassist website.

    In Javassist, the basic unit of class representation is the?CtClass?(“compile time class”). The classes that comprise your program are stored in a?ClassPool, essentially a container forCtClass?instances.

    The?ClassPool?implementation uses a?HashMap, in which the key is the name of the class and the value is the corresponding?CtClass?object.?

    A normal Java class contains fields, constructors, and methods. The corresponding?CtClassrepresents those as?CtField,?CtConstructor, and?CtMethod. To locate a?CtClass, you can grab it by name from the?ClassPool, then grab any method from the?CtClass?and apply your modifications.

    Figure 3.

    CtMethod?contains lines of code for the associated method. We can insert code at the beginning of the method using the?insertBefore?command. The great thing about Javassist is that you write pure Java, albeit with one caveat: the Java must be implemented as quoted strings. But most people would agree that’s much better than having to deal with bytecode! (Although, if you happen to like coding directly in bytecode, stay tuned for the ASM section.) The JVM includes a bytecode verifier to guard against invalid bytecode. If your Javassist-coded Java is not valid, the bytecode verifier will reject it at runtime.

    Similar to?insertBefore, there's an?insertAfter?to insert code at the end of a method. You can also insert code in the middle of a method by using?insertAt?or add a catch statement withaddCatch.

    Let's kick off your IDE and code your logging feature. We start with an?Agent?(containingpremain) and our?ClassTransformer.?

    package com.example.spring2gx.agent; public class Agent { public static void premain(String args, Instrumentation inst) { System.out.println("Starting the agent"); inst.addTransformer(new ImportantLogClassTransformer()); } } package com.example.spring2gx.agent; import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.IllegalClassFormatException; import java.security.ProtectionDomain; public class ImportantLogClassTransformer implements ClassFileTransformer { public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { // manipulate the bytes here return modified_bytes; }

    To add audit logging, first implement?transform?to convert the bytes of the class to a?CtClassobject. Then, you can iterate its methods and capture ones with the?@ImportantLogin?annotation on them, grab the input parameter indexes to log, and insert that code at the beginning of the method.

    public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] cfbuffer) throws IllegalClassFormatException { // convert byte array to a ct class object pool.insertClassPath(new ByteArrayClassPath(className,classfileBuffer)); // convert path slashes to dots. CtClass cclass = pool.get(className.replaceAll("/", ".")); if (!cclass.isFrozen()) { // check each method of ct class for annotation @ImportantLog for (CtMethod currentMethod : cclass.getDeclaredMethods()) { // Look for annotation @ImportantLog Annotation annotation = getAnnotation(currentMethod); if (annotation != null) { // if @ImportantLog annotation present on method, then // get important method parameter indexes List parameterIndexes = getParamIndexes(annotation); // add logging statement to beginning of the method currentMethod.insertBefore( createJavaString(currentMethod, className, parameterIndexes)); } } return cclass.toBytecode(); } return null; }

    Javassist annotations can be declared as “invisible” or “visible”. Invisible annotations, which are only visible at class loading time and compile time, are declared by passing in theRententionPolicy.CLASS?argument to the annotation. Visible annotations (RententionPolicy.RUNTIME) are loaded and visible at run time. For this example, you only need the attributes at compile time, so make them invisible.?

    The?getAnnotation?method scans for your?@ImportantLog?annotation and returns null if it doesn’t find the annotation.

    private Annotation getAnnotation(CtMethod method) { MethodInfo methodInfo = method.getMethodInfo(); AnnotationsAttribute attInfo = (AnnotationsAttribute) methodInfo .getAttribute(AnnotationsAttribute.invisibleTag); if (attInfo != null) { return attInfo.getAnnotation("com.example.spring.mains.ImportantLog"); } return null; }

    With the annotation in hand, you can retrieve the parameter indexes. Using Javassist’sArrayMemberValue, the member value fields are returned as a String array, which you can iterate to obtain the field indexes you had embedded in the annotation.?

    private List getParamIndexes(Annotation annotation) { ArrayMemberValue fields = (ArrayMemberValue) annotation.getMemberValue(“fields”); if (fields != null) { MemberValue[] values = (MemberValue[]) fields.getValue(); List parameterIndexes = new ArrayList(); for (MemberValue val : values) { parameterIndexes.add(((StringMemberValue) val).getValue()); } return parameterIndexes; } return Collections.emptyList(); }

    You are finally? in a position to? insert your log statement in?createJavaString.

    1 private String createJavaString(CtMethod currentMethod, 2 String className, List indexParameters) { 3 StringBuilder sb = new StringBuilder(); 4 sb.append("{StringBuilder sb = new StringBuilder"); 5 sb.append("(\"A call was made to method '\");"); 6 sb.append("sb.append(\""); 7 sb.append(currentMethod.getName()); 8 sb.append("\");sb.append(\"' on class '\");"); 9 sb.append("sb.append(\""); 10 sb.append(className); 11 sb.append("\");sb.append(\"'.\");"); 12 sb.append("sb.append(\"\\n Important params:\");"); 13 14 for (String index : indexParameters) { 15 try { 16 int localVar = Integer.parseInt(index) + 1; 17 sb.append("sb.append(\"\\n Index: \");"); 18 sb.append("sb.append(\""); 19 sb.append(index); 20 sb.append("\");sb.append(\" value: \");"); 21 sb.append("sb.append($" + localVar + ");"); 22 } catch (NumberFormatException e) { 23 e.printStackTrace(); 24 } 25 } 26 sb.append("System.out.println(sb.toString());}"); 27 return sb.toString(); 28 } 29 }

    Your implementation creates a?StringBuilder, appending some preamble followed by the required method name and class name. One thing to note is that if you're inserting multiple Java statements, you need to surround them with squiggly brackets (see lines 4 and 26).

    (Brackets are not required for just a single statement.)

    That pretty much covers the code for adding audit logging using Javassist. In retrospect, the positives are:

    • Because it uses familiar Java syntax, there’s no bytecode to learn.
    • There wasn't too much programming to do.
    • Good documentation on Javassist exists.

    The negatives are:

    • Not using bytecode limits capabilities.
    • Javassist is slower than other bytecode-manipulation frameworks.

    ASM

    ASM began life as a Ph.D. project and was open-sourced in 2002. It is actively updated, and supports Java 8 since the 5.x version. ASM consists of an event-based library and an object-based one, similar in behavior respectively to SAX and DOM XML parsers. This article will focus on the event-based library. Complete documentation can be found?here.

    A Java class contains many components, including a superclass, interfaces, attributes, fields, and methods. With ASM, you can think of each of these as events; you parse the class by providing a?ClassVisitor?implementation, and as the parser encounters each of those components, a corresponding “visitor” event-handler method is called on the?ClassVisitor(always in this sequence).?

    package com.sun.xml.internal.ws.org.objectweb.asm; public interface ClassVisitor { void visit(int version, int access, String name, String signature, String superName, String[] interfaces); void visitSource(String source, String debug); void visitOuterClass(String owner, String name, String desc); AnnotationVisitor visitAnnotation(String desc, boolean visible); void visitAttribute(Attribute attr); void visitInnerClass(String name, String outerName, String innerName, int access); FieldVisitor visitField(int access, String name, String desc, String signature, Object value); MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions); void visitEnd(); }

    Let’s get a feel for the process by passing Sue’s?BankTransaction?(defined at the beginning of the article) into a?ClassReader?for parsing.

    Again, start with the?Agent premain:

    import java.lang.instrument.Instrumentation; public class Agent { public static void premain(String args, Instrumentation inst) { System.out.println("Starting the agent"); inst.addTransformer(new ImportantLogClassTransformer()); } }

    Then pass the output bytes to a no-op?ClassWriter?to put the parsed bytes back together in the byte array, producing a rehydrated?BankTransaction?that as expected is virtually identical to our original class.

    Figure 4.

    import jdk.internal.org.objectweb.asm.ClassReader; import jdk.internal.org.objectweb.asm.ClassWriter; import jdk.internal.org.objectweb.asm.ClassVisitor; import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.IllegalClassFormatException; import java.security.ProtectionDomain; public class ImportantLogClassTransformer implements ClassFileTransformer { public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { ClassReader cr = new ClassReader(classfileBuffer); ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_FRAMES); cr.accept(cw, 0); return cw.toByteArray(); } }

    Now let’s modify our?ClassWriter?to do something a little more useful by adding a?ClassVisitor(named?LogMethodClassVisitor) to call our event handler methods, such as?visitField?orvisitMethod, as the corresponding components are encountered during parsing.

    Figure 5.

    public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { ClassReader cr = new ClassReader(classfileBuffer); ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_FRAMES); ClassVisitor cv = new LogMethodClassVisitor(cw, className); cr.accept(cv, 0); return cw.toByteArray(); }

    For your logging requirement, you want to check each method for the indicative annotation and add any specified logging. You only need to overwrite?ClassVisitor?visitMethod?to return aMethodVisitor?that supplies your implementation. Just like there are several components of a class, there are several components of a method, corresponding to the method attributes, annotations, and compiled code. ASM’s?MethodVisitor?provides hooks for visiting every opcode of the method, so you can get pretty granular in your modifications.

    public class LogMethodClassVisitor extends ClassVisitor { private String className; public LogMethodIfAnnotationVisitor(ClassVisitor cv, String className) { super(Opcodes.ASM5, cv); this.className = className; } @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { // put our logic in here } }

    Again, the event handlers are always called in the same predefined sequence, so you always know all of the attributes and annotations on the method before you have to actually?visit?the code. (Incidentally, you can chain together multiple instances of?MethodVisitor, just like you can chain multiple instances of?ClassVisitor.) So in your?visitMethod, you’re going to hook in thePrintMessageMethodVisitor, overriding?visitAnnotations to capture your annotations and insert any required logging code.

    Your?PrintMessageMethodVisitor?overrides two methods. First comes?visitAnnotation, so you can check the method for your?@ImportantLog?annotation. If present, you need to extract the field indexes from that field’s property. When?visitCode?executes, the presence of the annotation has already been determined and so it can add the specified logging. ThevisitAnnotation?code hooks in an?AnnotationVisitor?that exposes the field arguments on the@ImportantLog?annotation.

    public AnnotationVisitor visitAnnotation(String desc, boolean visible) { if ("Lcom/example/spring2gx/mains/ImportantLog;".equals(desc)) { isAnnotationPresent = true; return new AnnotationVisitor(Opcodes.ASM5, super.visitAnnotation(desc, visible)) { public AnnotationVisitor visitArray(String name) { if (“fields”.equals(name)){ return new AnnotationVisitor(Opcodes.ASM5, super.visitArray(name)) { public void visit(String name, Object value) { parameterIndexes.add((String) value); super.visit(name, value); } }; }else{ return super.visitArray(name); } } }; } return super.visitAnnotation(desc, visible); }

    Now, let's look at the?visitCode?method. First, it must check if the?AnnotationVisitor?flagged the annotation as present. If so, then add your bytecode.?

    public void visitCode() { if (isAnnotationPresent) { // create string builder mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); mv.visitTypeInsn(Opcodes.NEW, "java/lang/StringBuilder"); mv.visitInsn(Opcodes.DUP); // add everything to the string builder mv.visitLdcInsn("A call was made to method \""); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/StringBuilder", "", "(Ljava/lang/String;)V", false); mv.visitLdcInsn(methodName); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false); }

    This is the scary part of ASM — you actually have to write bytecode, so that’s something new to learn. You have to know about the stack, local variables, etc. It’s a fairly simple language, but if you just want to hack around, you can actually get the existing bytecode pretty easily with?javap:

    javap -c com/example/spring2gx/mains/PrintMessage

    I recommend writing the code you need in a Java test class, compiling that, and running it though?javap -c?to see the exact bytecode. In the code sample above, everything in blue is actually the bytecode. On each line, you get a one-byte opcode followed by zero or more arguments. You will need to determine those arguments for the target code, and they can usually be extracted by doing a?javap-c -v?on the original class (-v?for verbose, which displays the constant pool).

    I encourage you to look at the?JVM spec, which defines every opcode. There are operations likeload?and?store?(which move data between your operand stack and your local variables), overloaded for each parameter type. For example,?ILOAD?moves an integer value from the stack into a local variable field whereas?LLOAD?does the same for a long value.

    There are also operations like?invokeVirtual,?invokeSpecial,?invokeStatic, and the recently added?invokeDynamic, for invoking standard instance methods,? constructors, static methods, and dynamic methods in dynamically typed JVM languages, respectively. There are also operations for creating new classes using the new operator, or to duplicate the top operand on the stack.

    In sum, the positives of ASM are:

    • It has a small memory footprint.
    • It’s typically pretty quick.
    • It’s well documented on the web.
    • All of the opcodes are available, so you can really do a lot with it.
    • There’s lots of community support.

    The really only one negative, but it’s a big one: you’re writing bytecode, so you have to understand what's going on under the hood and as a result developers tend to take some time to ramp up.?

    Lessons learned

    • When you're dealing with bytecode manipulation, it's important to take small steps. Don't write lots of bytecode and expect it to immediately pass verification and work. Write one line at a time, think about what's in your stack, think about your local variables, and then write another line. If it's not passing the verifier, change one thing at a time; otherwise you'll never get it to work. Also keep in mind that besides the JVM verifier, ASM maintains a separate bytecode verifier, so it's good to run both and verify that your bytecode passes both of them.
    • It's important to think about class loading when you're modifying classes. When you use a Java agent, its transformer will touch every class as it is loaded into the JVM, no matter which class loader is loading it. So you need to make sure that the class loader can also see that object. Otherwise, you're going to run into trouble.?
    • If you're using Javassist and an application server that has multiple class loaders, you have to be concerned about your class pool being able to see your class objects. You might have to register a new classpath to your class pool to get it to see your class objects. You can chain your class pools like Java chains class loaders, so if it doesn't find the?CTClass?object in its class pool, it can go look at its parents.
    • Finally, it’s important to note that the JDK has its own capability to transform classes, and some limitations will apply to any class that the JDK has already transformed; you can modify the implementation of methods but, unlike original transformations, re-transformations are not permitted to change the class structure, for example by adding new fields or methods, or by modifying signatures.

    Bytecode manipulation can make life easier. You can find bugs, add logging (as discussed), obfuscate source code, perform preprocessing like Spring or Hibernate, or even write your own language compiler. You can restrict your API calls, analyze code to see if multiple threads are accessing a collection, lazy-load data from the database, and find differences between JARs by inspecting them.

    So I encourage you to make a bytecode-manipulation framework your friend. Someday, one might save your job.

    轉載于:https://www.cnblogs.com/davidwang456/p/6146005.html

    總結

    以上是生活随笔為你收集整理的Living in the Matrix with Bytecode Manipulation--转的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    人人干天天干 | 中文字幕 第二区 | 成人黄色av网站 | 中文字幕久久久精品 | 国产在线自| 国产日韩精品一区二区在线观看播放 | 射射射综合网 | 激情av一区二区 | av中文字幕电影 | 亚洲精品综合欧美二区变态 | 99久久精品久久亚洲精品 | 视频在线观看一区 | 精品国产99国产精品 | 国产高h视频 | 色婷婷av国产精品 | 久久免费美女视频 | 一区二区中文字幕在线观看 | 亚洲尺码电影av久久 | 久久国产精品99久久久久 | 免费手机黄色网址 | 69精品视频在线观看 | 在线观看国产 | 久久黄色a级片 | 日韩欧美高清 | 日韩在线大片 | 日日夜夜天天射 | 久草免费看 | 麻豆视传媒官网免费观看 | 亚洲国产网站 | 五月天欧美精品 | 天天骚夜夜操 | 91精品国产乱码在线观看 | 狠狠操天天射 | 亚洲精品在线二区 | 国产一区二区三区午夜 | 国产精品毛片一区二区在线 | 天天插夜夜操 | 免费看三级 | av中文在线观看 | 西西www444| 国产专区视频 | 亚洲黄色成人av | 亚洲日韩精品欧美一区二区 | 激情五月婷婷综合网 | 欧美精品久久久久久久久久 | 成人一区影院 | 久久久久久久网站 | 久草精品在线观看 | 毛片基地黄久久久久久天堂 | 欧美日本中文字幕 | 69精品久久久 | 在线免费观看的av | 中文字幕日韩国产 | 成人在线网站观看 | 国产在线97 | 婷婷伊人综合亚洲综合网 | 特级a老妇做爰全过程 | 欧美日韩一区二区三区视频 | 国产精品乱码久久久久 | 91大神精品视频 | 青春草视频在线播放 | 国产精品一区二区久久精品爱涩 | 午夜精品久久久久久久久久久久 | 国产精品视频专区 | 久国产在线播放 | 日韩欧美视频 | 在线观看麻豆av | 国产91精品欧美 | 欧美日韩国产页 | 91污视频在线观看 | 99久久这里有精品 | 91麻豆操| 国产黄色特级片 | 国产麻豆视频免费观看 | 久久久久久久久久久电影 | 精品无人国产偷自产在线 | 国产精品一区二区三区四区在线观看 | www.亚洲黄| av福利在线导航 | 欧洲精品亚洲精品 | 国产久草在线 | 91麻豆精品国产91 | 久久久亚洲网站 | 亚洲视频99 | 国产韩国日本高清视频 | 久久久久中文 | 国产精品女同一区二区三区久久夜 | 成人网色| 国产一级二级视频 | 亚洲高清视频在线观看免费 | 最近中文字幕免费视频 | 91精品国产乱码 | 欧美在线观看视频免费 | 精品久久99 | 久久资源在线 | 久久免费看a级毛毛片 | 五月婷婷影院 | 久草视频在线资源 | 成年人在线看片 | 国产午夜精品福利视频 | 91亚洲永久精品 | 亚洲天堂网在线视频观看 | 欧美亚洲成人免费 | 国产亚洲一级高清 | 久久久精品国产免费观看一区二区 | 亚洲小视频在线 | 伊人色综合久久天天网 | 日韩三级在线 | 在线欧美a | 精品国偷自产国产一区 | 久久精品成人欧美大片古装 | 色偷偷网站视频 | 色婷婷综合久色 | 亚洲色视频 | 播五月综合 | 久久五月精品 | 一区二区三区电影 | 九九久久久久久久久激情 | 99精品久久精品一区二区 | 国产成人福利在线观看 | 免费观看十分钟 | 91中文字幕在线 | 久久伊人八月婷婷综合激情 | 日韩精品一区二区三区三炮视频 | 国产午夜免费视频 | av免费网 | 91精品国产自产在线观看 | 婷婷在线看 | 亚洲黄色成人av | 在线观看成人小视频 | 五月婷丁香 | 九九爱免费视频在线观看 | 国产精品网红福利 | 国产人成免费视频 | 日本电影黄色 | 91精品成人久久 | 一本色道久久精品 | 久久免费激情视频 | av3级在线 | 五月婷婷狠狠 | 欧美一区二视频在线免费观看 | 日韩一区二区三区免费视频 | 69国产精品视频 | 97在线视频免费观看 | av中文字幕在线看 | 久久高清视频免费 | 国产无套视频 | 在线看日韩av| 久久婷婷色 | 国产精品免费在线观看视频 | 五月激情六月丁香 | 日韩高清成人 | 久久久久免费精品国产 | 中文字幕在线观看完整版电影 | 午夜精品99久久免费 | 天天操天天干天天爱 | 在线91色| 国产在线视频在线观看 | 成人性生活大片 | 久久人人爽人人片av | 国产午夜三级一区二区三 | 亚洲精品乱码久久久久久久久久 | 久久久免费观看 | 久久久久久久免费观看 | 亚洲狠狠 | 天天做天天干 | 久久久国产高清 | 成人午夜剧场在线观看 | 天天草天天干天天 | 99亚洲国产精品 | 国产精品成人一区二区 | 狠狠狠狠狠狠狠 | 日日夜夜精品免费视频 | 欧美激情综合网 | 久久你懂得| 欧美黄色成人 | 五月激情丁香图片 | 中文乱码视频在线观看 | 日产乱码一二三区别免费 | 日韩在线观看av | 亚洲精品福利在线 | 久久这里精品视频 | 欧美91精品久久久久国产性生爱 | 国产成人亚洲精品自产在线 | 成年人在线视频观看 | 欧美日韩在线观看视频 | 在线播放一区二区三区 | 色天天综合久久久久综合片 | 中文字幕中文字幕在线中文字幕三区 | 亚洲激情影院 | 91视频在线免费下载 | 欧美精品久久天天躁 | 日产乱码一二三区别在线 | 高清av中文在线字幕观看1 | 99精品在线视频观看 | 18网站在线观看 | 亚洲精品小区久久久久久 | 免费视频一级片 | 99热这里只有精品久久 | 91热| 99热只有精品在线观看 | 国产精品一区二区中文字幕 | www.黄色 | 高清免费在线视频 | 久草精品视频 | 天天激情 | 久久老司机精品视频 | 视频精品一区二区三区 | av一级一片 | 在线观看日韩中文字幕 | 亚洲国产午夜视频 | 亚洲欧洲国产视频 | 日韩在线观看网址 | 欧美日韩二三区 | 99热在线这里只有精品 | 久久黄色网址 | www.com黄色 | 欧美9999 | 就色干综合 | 亚洲国产精品va在线看黑人动漫 | 玖玖视频免费在线 | 日韩在线免费高清视频 | 国产精品欧美久久久久无广告 | 久久黄网站| 天天天在线综合网 | 国产麻豆精品在线观看 | 在线免费观看黄色小说 | 国产精品久久久久久久久久了 | 国产精品99久久久久久小说 | 国产麻豆精品在线观看 | 成年人免费电影 | 色综合久久精品 | 亚洲视频一 | 亚洲天堂免费视频 | 国产高清在线观看av | 中文字幕日韩免费视频 | 毛片无卡免费无播放器 | 91精品视频网站 | 国产在线精品一区二区不卡了 | 免费av福利 | 最近日本韩国中文字幕 | 国产九九在线 | av在线8 | 91精品啪在线观看国产线免费 | 国产成人一区二 | 在线免费观看国产精品 | 国产美女主播精品一区二区三区 | 国产精品毛片完整版 | 久久国产精品影视 | 又紧又大又爽精品一区二区 | 久久久久久不卡 | 精品伊人久久久 | 激情网站 | 黄色aa久久 | 97精品伊人 | 国产精品毛片一区二区三区 | 狠狠色狠狠色综合系列 | 久综合网| 国产盗摄精品一区二区 | 激情综合网婷婷 | 久久久久二区 | 欧美久久久久久久久久久 | 黄色一区三区 | 911久久| 成人av在线影院 | 天天干天天搞天天射 | 亚洲精品裸体 | 日韩欧美一区视频 | 精品999在线观看 | 成人黄色av免费在线观看 | 日韩av电影中文字幕在线观看 | 黄色小说在线免费观看 | 国产91精品在线播放 | 亚洲另类久久 | 中文字幕人成乱码在线观看 | 九九久久久久久久久激情 | 国产黄在线观看 | 亚洲精品乱码久久久久 | 精品毛片一区二区免费看 | 2018好看的中文在线观看 | av资源在线看 | 四虎最新入口 | 国产黄色av网站 | 久久图| 日日夜夜天天综合 | 久久精品在线免费观看 | 国产69精品久久99的直播节目 | 免费高清在线观看成人 | 午夜影院先 | 黄色av免费电影 | 亚洲精品系列 | 国产中文字幕亚洲 | 国产一区二区在线免费观看 | 丝袜足交在线 | 最新午夜| 日本不卡123区 | 欧美日韩国产二区 | 热久在线 | 成人毛片在线视频 | 一级成人免费 | 欧洲视频一区 | 91在线视频免费 | 精品1区2区3区 | 国产精品久久久一区二区三区网站 | 伊人色**天天综合婷婷 | 伊人国产在线观看 | 精品国产区 | 中文字幕中文字幕在线中文字幕三区 | 国产精品久久久久久高潮 | 日三级在线 | 欧美日韩中字 | 国产精品免费视频久久久 | 97超级碰 | 天天操天天弄 | 精品中文字幕在线播放 | 久久综合国产伦精品免费 | 日韩二区在线播放 | 99在线视频网站 | 日韩视频在线不卡 | 成人精品视频久久久久 | 99久精品视频 | 免费观看91视频 | 久草网视频在线观看 | 精品视频 | aaa亚洲精品一二三区 | 欧美最猛性xxxxx免费 | 69视频网站| 大胆欧美gogo免费视频一二区 | 精品999 | 91在线看黄 | 天天干天天操天天操 | 三三级黄色片之日韩 | 91精品一区二区三区蜜臀 | 丁香六月国产 | 天天av综合网 | adn—256中文在线观看 | 99精品视频精品精品视频 | 香蕉久久国产 | 国产精品久久久久久久久久妇女 | 日本在线观看视频一区 | 日韩精品最新在线观看 | 免费在线国产 | 亚洲成av人电影 | 欧美日韩国产精品一区二区 | 久久精品毛片 | 能在线观看的日韩av | 亚洲午夜av久久乱码 | 美女免费视频一区二区 | 五月天色网站 | 99精品国自产在线 | 亚洲一区二区三区在线看 | 日批视频在线播放 | 在线电影 一区 | 日日夜夜天天干 | 美女视频黄是免费的 | 干av在线 | 91综合色 | 黄色网在线免费观看 | 中文网丁香综合网 | 国产你懂的在线 | 日韩高清毛片 | 香蕉91视频 | 黄色在线网站噜噜噜 | 99国内精品久久久久久久 | 在线观看一区 | 久久久一本精品99久久精品66 | 99精品一区二区三区 | 久久久亚洲国产精品麻豆综合天堂 | 日本中文字幕在线播放 | 天天操夜夜操 | 日韩电影精品一区 | 日韩电影一区二区在线 | 日韩大片免费观看 | 在线黄色免费av | 成年一级片 | 9色在线视频 | 久久久久久久av麻豆果冻 | 国产精品男女 | 99精品黄色| a视频在线观看 | 日日爽夜夜操 | 激情五月av | 免费a v观看 | 久久久久久蜜av免费网站 | 99精品在线视频播放 | 激情伊人五月天久久综合 | 日本福利视频在线 | 成人在线观看日韩 | 国产精品网站 | 国产精品自产拍在线观看蜜 | 日日操日日插 | 亚洲欧美国产精品18p | 中文字幕资源在线 | 视频三区在线 | 在线观看日本高清mv视频 | 国产精品成人品 | 亚洲va综合va国产va中文 | 中文综合在线 | 日韩精品一区二区三区免费视频观看 | 国产理论在线 | 91日韩免费 | 国模视频一区二区三区 | 免费91在线观看 | ww亚洲ww亚在线观看 | 四川bbb搡bbb爽爽视频 | 激情网站网址 | 五月婷社区 | 欧美午夜a| 99免在线观看免费视频高清 | 亚洲一区视频免费观看 | 国产精品中文字幕在线播放 | 另类老妇性bbwbbw高清 | 久久久久综合视频 | 国产精品黄 | 国产精品扒开做爽爽的视频 | 日韩在线一二三区 | 日韩网站一区二区 | 在线欧美a | 国产精品免费观看网站 | 亚洲mv大片欧洲mv大片免费 | 日日夜夜91 | 免费高清男女打扑克视频 | 国产不卡精品视频 | 激情在线免费视频 | 天天操天天是 | 在线观看免费成人av | 人人插人人看 | 丁香激情综合久久伊人久久 | 狠狠狠色狠狠色综合 | 91日本在线播放 | 国产免费小视频 | 久久精品在线免费观看 | 欧美成人在线网站 | 91视频在线看| 五月天婷婷丁香花 | 国产高清av免费在线观看 | 久久国产精品一区二区 | 五月婷香蕉久色在线看 | 国产黄色av | 中文字幕在线观看免费 | 国产免费三级在线观看 | 日日躁夜夜躁xxxxaaaa | 高清国产在线一区 | 亚洲国产一区二区精品专区 | 美女福利视频一区二区 | 日韩精品极品视频 | 日韩av片无码一区二区不卡电影 | 黄色美女免费网站 | 免费av黄色 | 亚洲精品一区二区三区高潮 | 日本不卡一区二区 | 久久免费大片 | 亚洲精品影视 | 黄色片亚洲 | 日韩精品不卡在线观看 | 成人在线观看影院 | 99视频免费在线观看 | www.伊人色.com | 久久黄色小说视频 | 免费日韩电影 | 手机av片| 91久久精品一区 | 91精选在线观看 | 91网站在线视频 | 久久蜜臀一区二区三区av | 国产专区一 | 亚洲另类视频在线 | 99久久久久久久久 | 五月婷婷中文网 | 三上悠亚一区二区在线观看 | 六月天色婷婷 | 精品一区av| 99亚洲精品在线 | 国产精品 日韩 | 青青河边草免费直播 | 五月天电影免费在线观看一区 | 中文字幕字幕中文 | 91精彩在线视频 | 精品一区二区三区久久 | 亚洲成成品网站 | 亚洲成免费| 精品国产午夜 | 欧美一区二区三区四区夜夜大片 | 成人av免费在线看 | 精品久久在线 | 四虎国产精品永久在线国在线 | 国产精品久久久久久欧美 | 免费观看成人 | 国产色资源| 日韩成人在线免费观看 | 久久久www成人免费精品 | 国产视频综合在线 | 日韩二区三区在线观看 | 亚洲美女免费精品视频在线观看 | 又长又大又黑又粗欧美 | 国产精品久久精品国产 | 国产麻豆电影在线观看 | 精品一区电影 | 一级黄色片在线免费看 | www.av中文字幕.com | 久久精品视频网站 | 色婷婷激情网 | 91精品亚洲影视在线观看 | 91丨九色丨国产丨porny精品 | 日本久久中文字幕 | 日韩免费电影网站 | 91成人在线视频观看 | 国产精品自产拍在线观看 | 亚洲日日射 | 久久国产精品久久w女人spa | 久久网站免费 | www.亚洲黄色 | 免费看黄色小说的网站 | 一级欧美日韩 | 五月天丁香亚洲 | 国产精品久久三 | 亚洲一区二区三区精品在线观看 | 国产伦精品一区二区三区免费 | 久久综合九九 | 色偷偷av男人天堂 | 成人午夜毛片 | 一级黄色片在线免费观看 | 久久99国产精品免费 | 九九亚洲精品 | 成人久久18免费 | 9在线观看免费高清完整 | 亚洲国产欧美一区二区三区丁香婷 | 在线观看免费黄视频 | 九色琪琪久久综合网天天 | 中文字幕在线观看一区二区 | 免费观看视频的网站 | 午夜狠狠干 | 精品福利在线视频 | 亚洲精品大片www | 在线日韩亚洲 | 中文在线a∨在线 | 亚洲专区 国产精品 | 欧美精品亚洲精品日韩精品 | 国产高清精品在线 | 在线观看亚洲国产精品 | 奇人奇案qvod| 免费看麻豆 | 免费的国产精品 | 日韩区视频 | 黄色小说在线观看视频 | www.亚洲黄 | 欧美日韩久久 | 国内精品免费久久影院 | 国产视频一区精品 | 亚洲片在线观看 | 日日爽天天 | 国产精品自产拍在线观看 | 亚洲精品国产视频 | 精品视频免费久久久看 | 久久精品综合一区 | 九九久久视频 | 国外av在线 | 激情偷乱人伦小说视频在线观看 | 最近久乱中文字幕 | 狠狠狠狠狠狠狠干 | 国产资源网站 | 欧美精品v国产精品 | 欧美日韩aaaa | 狠狠色丁香婷婷综合橹88 | 欧美一二三视频 | 欧美成人视| 69视频网站 | 黄色的视频 | 天天爽天天摸 | 激情久久伊人 | 五月天天色 | 久久av免费| 国产最新精品视频 | 国产精品高清一区二区三区 | 欧美少妇的秘密 | 国产精品粉嫩 | 亚洲精品视频在线观看网站 | 日日草天天干 | 欧美999 | 亚洲精品免费观看 | 成人毛片一区 | 一区二区毛片 | www久久国产 | 天天操天天综合网 | 99免在线观看免费视频高清 | 深夜免费福利视频 | 久久亚洲综合国产精品99麻豆的功能介绍 | 久久免费av电影 | www.夜夜操.com | 国产剧情av在线播放 | 中文字幕在线观看一区二区三区 | 中文字幕亚洲精品日韩 | 黄色av网站在线观看免费 | 亚洲区另类春色综合小说校园片 | 天堂网在线视频 | www日韩视频| 毛片的网址 | 国产精品精品久久久久久 | 伊人婷婷综合 | 婷婷中文字幕综合 | 国产人成在线观看 | 麻豆系列在线观看 | 成人av资源网| 2020天天干夜夜爽 | 五月天久久激情 | 久久狠狠一本精品综合网 | 狠狠躁天天躁综合网 | 97色涩| 免费网址在线播放 | 日韩在线视频免费观看 | 高潮久久久久久 | 国产精品 中文字幕 亚洲 欧美 | 中文字幕国产视频 | 亚洲涩涩一区 | 男女啪啪免费网站 | 国产精品一区二区精品视频免费看 | 久草免费手机视频 | 欧美做受xxx | 日本中文在线 | 亚洲精品国产电影 | 欧美五月婷婷 | 久久午夜精品影院一区 | 天天操夜操视频 | 亚洲男男gaygayxxxgv | 中文字幕在线资源 | 射久久久 | 国产专区精品视频 | 久久精品在线视频 | 碰天天操天天 | 97精品在线 | 激情视频久久 | 久久久久久免费 | 在线v片| 黄色字幕网 | 久久久久国产精品一区二区 | 国产日本在线观看 | 免费黄色在线网址 | 91视视频在线直接观看在线看网页在线看 | 亚洲 综合 国产 精品 | 国产精品午夜av | 久久99亚洲精品久久 | 国产一级做a爱片久久毛片a | 婷婷草 | 国产精品99久久久久久小说 | 婷婷av网| 黄色软件视频大全免费下载 | 欧美日韩精品网站 | 国产亚州精品视频 | 91视频在线播放视频 | 91天天操 | 91av电影在线观看 | 亚洲乱码在线 | 欧美性色黄| av中文字幕在线观看网站 | 午夜狠狠操 | 日韩高清国产精品 | 免费国产在线精品 | 美女视频黄的免费的 | 久福利| 99久久久久久久久久 | 天干啦夜天干天干在线线 | 国产短视频在线播放 | 亚洲黄色片在线 | 99久久er热在这里只有精品15 | 久久精品一区八戒影视 | 日本不卡一区二区三区在线观看 | 欧美国产精品久久久久久免费 | 成人av电影免费在线播放 | 久久伦理视频 | 一级片黄色片网站 | 天天综合网 天天 | 又粗又长又大又爽又黄少妇毛片 | 国产正在播放 | 成在人线av | 中文字幕亚洲欧美日韩 | 五月婷婷激情网 | 久久精彩 | 亚洲性少妇性猛交wwww乱大交 | www.久久久com | 久久久久综合 | 国产精品av免费观看 | 国产精品久久久久一区 | 日本69hd | 97国产在线观看 | 人人插人人澡 | a电影免费看 | 四虎精品成人免费网站 | 久久精品视频免费播放 | 欧美亚洲一区二区在线 | 在线电影中文字幕 | 久久综合色影院 | 狠狠成人 | 国产精品久久久久久久妇 | 69国产在线观看 | 字幕网av | 亚洲精品毛片一级91精品 | 国产精品美女久久久 | 久久精品视频在线观看免费 | 日韩网站视频 | avlulu久久精品 | 国产美女精品在线 | 亚洲一区二区天堂 | 精品在线你懂的 | 色综合www | 国产精品免费久久久久影院仙踪林 | 国产免费av一区二区三区 | 色婷婷狠狠五月综合天色拍 | 99国产情侣在线播放 | 91精品国产自产在线观看永久 | 亚洲精品videossex少妇 | 亚洲开心激情 | 日日综合 | 欧美性精品| 国产色啪 | 免费人成在线观看网站 | 久久精品伊人 | 五月婷婷免费 | 美女亚洲精品 | 国产一在线精品一区在线观看 | 色综合久久88色综合天天人守婷 | 精品国产成人av在线免 | 国产精品情侣视频 | 国语精品久久 | 狠狠网 | 亚洲影视九九影院在线观看 | 日韩激情久久 | 99视频国产精品免费观看 | 亚洲精品在线观看网站 | 超碰在线观看99 | 国产91综合一区在线观看 | 成人黄色短片 | 国语久久| 最新真实国产在线视频 | 麻豆视频在线免费看 | 日韩激情视频 | 九9热这里真品2 | 国产精品va在线观看入 | 91x色| 波多野结衣日韩 | 国产美腿白丝袜足在线av | 国产精品精品国产婷婷这里av | 国产精品va最新国产精品视频 | 久艹视频在线观看 | 超碰最新网址 | 五月婷网 | 激情网站免费观看 | 成人播放器 | 婷婷5月激情5月 | 久久亚洲欧美 | 日日操夜夜操狠狠操 | 97精品国产97久久久久久粉红 | 69视频在线播放 | 在线免费视频一区 | 三日本三级少妇三级99 | 韩国三级一区 | 精品自拍网 | 国产福利网站 | 在线观看视频h | 五月婷影院 | 天天天操天天天干 | 在线亚洲精品 | 操老逼免费视频 | 久久视频6 | 波多野结衣视频一区二区 | 日韩欧美第二页 | 久久96| 91黄色在线视频 | 欧美日韩国产免费视频 | 国语麻豆 | 91一区啪爱嗯打偷拍欧美 | 国产69久久久 | 涩涩成人在线 | 96av麻豆蜜桃一区二区 | 久久午夜羞羞影院 | 国产一区高清在线观看 | 国产日产精品一区二区三区四区 | 亚洲波多野结衣 | 91麻豆看国产在线紧急地址 | 国产视频一二区 | 91麻豆网| 天天摸天天干天天操天天射 | 99色免费 | 成人精品国产免费网站 | av 一区二区三区四区 | 黄色福利视频网站 | www黄色软件 | 伊人五月综合 | 久久99精品久久久久久三级 | 色综合久久综合中文综合网 | 久香蕉 | 五月天综合激情网 | 超碰在线日韩 | 九月婷婷综合网 | 国产日韩欧美在线观看 | 久久久久久毛片 | 亚洲精品免费看 | 九七在线视频 | 免费裸体视频网 | 麻豆久久久久 | 91精品推荐 | 97视频人人免费看 | 91亚洲精品久久久蜜桃网站 | 很黄很黄的网站免费的 | 亚洲最大成人免费网站 | 久艹在线观看视频 | 最近高清中文在线字幕在线观看 | 日韩视频中文字幕在线观看 | 久久久久在线 | www久草| 日韩在线三级 | 毛片视频网址 | 欧美激情综合色综合啪啪五月 | 亚洲人视频在线 | 美女免费网站 | 国产日本亚洲 | 国产专区精品视频 | 中文字幕国产一区二区 | 91精品免费在线 | 中文字幕在线免费看线人 | 国产视频精品视频 | 久久国产精品久久精品 | 亚州中文av | 天堂中文在线视频 | 最新av免费在线观看 | 午夜精品久久久久久久久久久久 | 制服丝袜在线91 | 欧美国产一区在线 | 友田真希av| 五月天激情开心 | 国产成人三级在线 | 91中文字幕永久在线 | wwwwwww色 | 久久深夜福利免费观看 | 久久国产精品99久久久久久进口 | 日韩免费观看一区二区三区 | 亚洲成av人片在线观看 | av免费网站观看 | 91最新视频在线观看 | 日韩在线观看网址 | 国产专区欧美专区 | 精品国内自产拍在线观看视频 | 国产成人一区二区三区在线观看 | 四虎在线观看视频 | 色资源网在线观看 | 免费久久久久久久 | 日本公乱妇视频 | 久久国产精品免费看 | 久久在线免费视频 | 在线国产一区二区 | 久草久 | 中文字幕免费久久 | 久草在线免费看视频 | 免费国产亚洲视频 | 精品久久国产一区 | 香蕉影院在线 | 日日夜夜网 | 精品国产一二三四区 | 日韩精品免费一区二区三区 | 中文网丁香综合网 | 最近高清中文在线字幕在线观看 | 国产手机精品视频 | 在线免费看黄网站 | 日韩免费一区二区 | 国产一级做a爱片久久毛片a | 亚洲va在线va天堂 | 日韩二区在线播放 | 国产精品久久久久久999 | 欧美日韩国产精品一区 | 黄色一级片视频 | 成人黄性视频 | 成人a在线观看高清电影 | 国产精品丝袜久久久久久久不卡 | 日日干视频 | 国产青草视频在线观看 | 国产黄色理论片 | 91女神的呻吟细腰翘臀美女 | 日日夜av| 色网站在线免费观看 | 久久伊人精品一区二区三区 | 青青草国产精品 | 亚州精品天堂中文字幕 | 中文字幕亚洲五码 | 一级片免费观看 | 国产伦理久久 | 欧美大片在线看免费观看 | 日韩中文字幕免费在线播放 | 久久美女高清视频 | 97超碰人人澡人人 | 精品久久久久一区二区国产 | 一区二区三区动漫 | 久久字幕网 | 国产日韩欧美精品在线观看 | 精品国产一区二区三区久久久久久 | 国产亚洲精品久久久久久 | 黄色av免费电影 | 一区二区三区在线免费 | 日韩高清成人在线 | 五月婷香蕉久色在线看 | 婷婷久久国产 | 日韩影视在线观看 | 亚洲一区二区精品在线 | 国产精品18久久久久久久网站 | 国语黄色片 | 久久综合久久综合这里只有精品 | 成人中文字幕在线 | 日韩免费高清在线 | 自拍超碰在线 | 手机av观看 | 在线观看色网站 | 天堂视频中文在线 | www.福利 | 日韩欧美中文 | 国产免费观看高清完整版 | 日日夜夜综合 | 国内精品久久久久影院优 | 中文字幕999 | 日韩网站在线免费观看 | 日韩网站一区 | 高清视频一区 | 免费精品国产 | 国产精品久久久久久久7电影 | 黄色网免费 | 99热这里是精品 | 香蕉影院在线播放 | 亚洲精品乱码久久久久久蜜桃动漫 | 亚洲污视频 | 日日碰狠狠添天天爽超碰97久久 | www.com久久| 人人草天天草 | 色网免费观看 | 国产精品伦一区二区三区视频 | 免费看毛片在线 | 成人资源在线 | 国产婷婷一区二区 | 午夜精品久久久久久久99婷婷 | 国产精品二区在线 | 亚洲免费在线播放视频 | 日韩欧美视频在线免费观看 | 黄色特级一级片 | 香蕉视频最新网址 | 91桃色免费观看 | 国产中文字幕网 | 日韩av一区二区在线影视 | 久久免费中文视频 | 国产999久久久 | 在线观看中文字幕一区二区 | 丁香5月婷婷 | 狠狠色丁香 | 99视频偷窥在线精品国自产拍 | 欧美日韩中文在线 | 精品国产一区二 | 日韩在线观看中文 | 久久精品国产一区二区电影 | 日韩视频一区二区三区在线播放免费观看 | 一区二区网 | 五月婷婷综合激情网 | 麻豆久久一区 | 久久久久久久久久影视 | 亚洲 欧洲 国产 精品 | 91在线一区二区 | 国产91精品一区二区 | 欧美精品久久久久久久久久 | 这里只有精品视频在线观看 | 国产色视频网站2 | 丝袜美腿亚洲综合 | 欧美日本国产在线观看 | 精品一区二区在线播放 | 久久99久久99精品免视看婷婷 | 99国产精品久久久久久久久久 | 99日韩精品 | 精品国产一区二区久久 | 国产精品男女 | 久久精品国产一区 | 日本一区二区免费在线观看 | 婷婷久久久 | 手机av电影在线 | 伊人五月天婷婷 | 色视频国产直接看 | 在线免费观看黄色大片 | 黄色一级大片在线免费看国产一 | 亚洲免费在线看 | 99久久精品免费看国产免费软件 | 一区二区三区日韩精品 | 久久黄色免费 | 伊人国产在线播放 | 夜夜躁天天躁很躁波 | 国产黄在线 | 97超碰人人网 | 美女视频黄免费的久久 | 69视频永久免费观看 | 97香蕉久久超级碰碰高清版 | 国产一二区免费视频 | 久九视频| 日韩精品一区二区三区丰满 | 激情一区二区三区欧美 | 久久免费av电影 | 丁香婷婷激情国产高清秒播 | 国产色区 |