精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一文讓你搞懂 Python 的 pyc 文件

安全 應(yīng)用安全
混淆之后多了兩條指令,其中偏移量為 8 的指令,參數(shù)為 255,表示加載常量池中索引為 255 的元素。如果常量池沒(méi)有這么多元素,那么顯然會(huì)發(fā)生索引越界,導(dǎo)致反編譯的時(shí)候報(bào)錯(cuò)。

pyc 文件的觸發(fā)

上一篇文章我們介紹了字節(jié)碼,當(dāng)時(shí)提到,py 文件在執(zhí)行的時(shí)候會(huì)先被編譯成 PyCodeObject 對(duì)象,并且該對(duì)象還會(huì)被保存到 pyc 文件中。

然而事實(shí)并不總是這樣,有時(shí)當(dāng)我們運(yùn)行一個(gè)簡(jiǎn)單的程序時(shí),并沒(méi)有產(chǎn)生 pyc 文件。因此我們猜測(cè):有些 Python 程序只是臨時(shí)完成一些瑣碎的工作,這樣的程序僅僅只會(huì)運(yùn)行一次,然后就不會(huì)再使用了,因此也就沒(méi)有保存至 pyc 文件的必要。

如果我們?cè)诖a中加上了一個(gè) import abc 這樣的語(yǔ)句,再執(zhí)行你就會(huì)發(fā)現(xiàn)解釋器為 abc.py 生成了 pyc 文件,這就說(shuō)明 import 語(yǔ)句會(huì)觸發(fā) pyc 的生成。

實(shí)際上,在運(yùn)行過(guò)程中,如果碰到 import abc 這樣的語(yǔ)句,那么 Python 會(huì)在設(shè)定好的 path 中尋找 abc.pyc 或者 abc.pyd 文件。但如果沒(méi)有這些文件,而是只發(fā)現(xiàn)了 abc.py,那么會(huì)先將 abc.py 編譯成 PyCodeObject,然后寫入到 pyc 文件中。

接下來(lái),再對(duì) abc.pyc 進(jìn)行 import 動(dòng)作。對(duì)的,并不是編譯成 PyCodeObject 對(duì)象之后就直接使用,而是先寫到 pyc 文件里,然后再將 pyc 文件里面的 PyCodeObject 對(duì)象重新在內(nèi)存中復(fù)制出來(lái)。

當(dāng)然啦,觸發(fā) pyc 文件生成不僅可以通過(guò) import,還可以通過(guò) py_compile 模塊手動(dòng)生成。比如當(dāng)前有一個(gè) tools.py,代碼如下。

a = 1
b = "你好啊"

如何將其編譯成 pyc 呢?

import py_compile

py_compile.compile("tools.py")

查看當(dāng)前目錄的 __pycache__ 目錄,會(huì)發(fā)現(xiàn) pyc 已經(jīng)生成了。

圖片圖片

然后 py文件名.cpython-版本號(hào).pyc 便是編譯之后的 pyc 文件名。

pyc 文件的導(dǎo)入

如果有一個(gè)現(xiàn)成的 pyc 文件,我們要如何導(dǎo)入它呢?

from importlib.machinery import SourcelessFileLoader

tools = SourcelessFileLoader(
    "tools", "__pycache__/tools.cpython-312.pyc"
).load_module()

print(tools.a)  # 1
print(tools.b)  # 你好啊

以上我們就成功手動(dòng)導(dǎo)入了 pyc 文件。

pyc 文件都包含哪些內(nèi)容

pyc 文件在創(chuàng)建的時(shí)候都會(huì)往里面寫入哪些內(nèi)容呢?

1)magic number

這是 Python 定義的一個(gè)整數(shù)值,不同版本的 Python 會(huì)定義不同的 magic number,這個(gè)值是為了保證 Python 能夠加載正確的 pyc。

比如 Python3.12 不會(huì)加載 3.10 版本的 pyc,因?yàn)?Python 在加載 pyc 文件的時(shí)候會(huì)首先檢測(cè)該 pyc 的 magic number。如果和自身的 magic number 不一致,則拒絕加載。

from importlib.util import MAGIC_NUMBER
print(MAGIC_NUMBER)  # b'\xcb\r\r\n'

with open("__pycache__/tools.cpython-312.pyc", "rb") as f:
    magic_number = f.read(4)
print(magic_number)  # b'\xcb\r\r\n'

pyc 文件的前 4 個(gè)字節(jié)便是 magic number。

2)pyc 文件的寫入時(shí)間

這個(gè)很好理解,在加載 pyc 之前會(huì)先比較源代碼的最后修改時(shí)間和 pyc 文件的寫入時(shí)間。如果 pyc 文件的寫入時(shí)間比源代碼的修改時(shí)間要早,說(shuō)明在生成 pyc 之后,源代碼被修改了,那么會(huì)重新編譯并寫入 pyc,而反之則會(huì)直接加載已存在的 pyc。

3)py 文件的大小

py 文件的大小也會(huì)被記錄在 pyc 文件中。

4)PyCodeObject 對(duì)象

編譯之后的 PyCodeObject 對(duì)象,這個(gè)不用說(shuō)了,肯定是要存儲(chǔ)的,并且是序列化之后再存儲(chǔ)。

因此 pyc 文件的結(jié)構(gòu)如下:

圖片圖片

我們實(shí)際驗(yàn)證一下:

import struct
from importlib.util import MAGIC_NUMBER
from datetime import datetime

with open("__pycache__/tools.cpython-312.pyc", "rb") as f:
    data = f.read()

# 0 ~ 4 字節(jié)是 MAGIC NUMBER
print(data[: 4])  # b'\xcb\r\r\n'
print(MAGIC_NUMBER)  # b'\xcb\r\r\n'

# 4 ~ 8 字節(jié)是 4 個(gè) \x00
print(data[4: 8])  # b'\x00\x00\x00\x00'

# 8 ~ 12 字節(jié)是 pyc 的寫入時(shí)間(小端存儲(chǔ)),一個(gè)時(shí)間戳
ts = struct.unpack("<I", data[8: 12])[0]
print(ts)  # 1726742711
print(
    datetime.fromtimestamp(ts)
)  # 2024-09-19 10:45:11

# 12 ~ 16 字節(jié)是 py 文件的大小
print(
    struct.unpack("<I", data[12: 16])[0]
)  # 22

結(jié)果和我們分析的一樣,前 16 字節(jié)是固定的,而 16 個(gè)字節(jié)往后就是 PyCodeObject 對(duì)象,并且是序列化之后的,因?yàn)樵搶?duì)象顯然無(wú)法直接存在文件中。

import marshal

with open("__pycache__/tools.cpython-312.pyc", "rb") as f:
    data = f.read()

# 通過(guò) marshal.loads 可以反序列化
# marshal.dumps 則表示序列化
code = marshal.loads(data[16:])
# 此時(shí)就拿到了 py 文件編譯之后的 PyCodeObject
print(code)
"""
<code object <module> at 0x..., file "tools.py", line 1>
"""
# 查看常量池
print(code.co_consts)  # (1, '你好啊', None)

# 符號(hào)表
print(code.co_names)  # ('a', 'b')

常量池和符號(hào)表都是正確的。

pyc 文件的寫入

下面通過(guò)源碼來(lái)查看 pyc 文件的寫入過(guò)程,既然要寫入,那么肯定要有文件句柄。

// Python/marshal.c

// FILE 是 C 自帶的文件句柄
// 可以把 WFILE 看成是 FILE 的包裝
typedef struct {
    FILE *fp;
    // 下面的字段在寫入數(shù)據(jù)的時(shí)候會(huì)看到
    int error; 
    int depth;
    PyObject *str;
    char *ptr;
    const char *end;
    char *buf;
    _Py_hashtable_t *hashtable;
    int version;
} WFILE;

首先是寫入 magic number、創(chuàng)建時(shí)間和文件大小,它們會(huì)調(diào)用 PyMarshal_WriteLongToFile 函數(shù)進(jìn)行寫入:

// Python/marshal.c
void
PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
{
    // magic number、創(chuàng)建時(shí)間和文件大小,只是一個(gè) 4 字節(jié)整數(shù)
    // 因此使用 char[4] 來(lái)保存
    char buf[4];
    // 聲明一個(gè) WFILE 類型的變量 wf
    WFILE wf;
    // 內(nèi)存初始化
    memset(&wf, 0, sizeof(wf));
    // 初始化內(nèi)部字段
    wf.fp = fp;  // 文件句柄
    wf.ptr = wf.buf = buf;  // buf 數(shù)組首元素的地址
    wf.end = wf.ptr + sizeof(buf);  // buf 數(shù)組尾元素的地址
    wf.error = WFERR_OK;
    wf.version = version;
    // 調(diào)用 w_long 將信息寫到 wf 里面
    // 寫入的信息可以是 magic number、時(shí)間和文件大小
    w_long(x, &wf);
    // 刷到磁盤上
    w_flush(&wf);
}

所以該函數(shù)只是初始化了一個(gè) WFILE 對(duì)象,真正寫入則是調(diào)用的 w_long。

// Python/marshal.c
static void
w_long(long x, WFILE *p)
{   
    w_byte((char)( x      & 0xff), p);
    w_byte((char)((x>> 8) & 0xff), p);
    w_byte((char)((x>>16) & 0xff), p);
    w_byte((char)((x>>24) & 0xff), p);
}

w_long 則是調(diào)用 w_byte 將 x 逐個(gè)字節(jié)地寫到文件里面去。

當(dāng)頭信息寫完之后,就該寫 PyCodeObject 對(duì)象了,這個(gè)過(guò)程由 PyMarshal_WriteObjectToFile 函數(shù)負(fù)責(zé)。

// Python/marshal.c
void
PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
{
    char buf[BUFSIZ];
    WFILE wf;
    if (PySys_Audit("marshal.dumps", "Oi", x, version) < 0) {
        return; /* caller must check PyErr_Occurred() */
    }
    memset(&wf, 0, sizeof(wf));
    wf.fp = fp;
    wf.ptr = wf.buf = buf;
    wf.end = wf.ptr + sizeof(buf);
    wf.error = WFERR_OK;
    wf.version = version;
    if (w_init_refs(&wf, version)) {
        return; /* caller must check PyErr_Occurred() */
    }
    // 寫入頭信息由 PyMarshal_WriteLongToFile 負(fù)責(zé),它內(nèi)部會(huì)調(diào)用 w_long
    // 寫入 PyCodeObject 由當(dāng)前函數(shù)負(fù)責(zé),它內(nèi)部會(huì)調(diào)用 w_object
    w_object(x, &wf);
    w_clear_refs(&wf);
    w_flush(&wf);
}

然后我們看一下 w_object 函數(shù)。

// Python/marshal.c
static void
w_object(PyObject *v, WFILE *p)
{
    char flag = '\0';

    p->depth++;

    if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
        p->error = WFERR_NESTEDTOODEEP;
    }
    else if (v == NULL) {
        w_byte(TYPE_NULL, p);
    }
    else if (v == Py_None) {
        w_byte(TYPE_NONE, p);
    }
    else if (v == PyExc_StopIteration) {
        w_byte(TYPE_STOPITER, p);
    }
    else if (v == Py_Ellipsis) {
        w_byte(TYPE_ELLIPSIS, p);
    }
    else if (v == Py_False) {
        w_byte(TYPE_FALSE, p);
    }
    else if (v == Py_True) {
        w_byte(TYPE_TRUE, p);
    }
    else if (!w_ref(v, &flag, p))
        w_complex_object(v, flag, p);

    p->depth--;
}

可以看到 w_object 和 w_long 一樣,本質(zhì)上都是調(diào)用了 w_byte。當(dāng)然 w_byte 只能寫入一些簡(jiǎn)單數(shù)據(jù),如果是列表、字典之類的數(shù)據(jù),那么會(huì)調(diào)用 w_complex_object 函數(shù),也就是代碼中的最后一個(gè) else if 分支。

w_complex_object 這個(gè)函數(shù)的源代碼很長(zhǎng),我們看一下整體結(jié)構(gòu),具體邏輯就不貼了,后面會(huì)單獨(dú)截取一部分進(jìn)行分析。

// Python/marshal.c
static void
w_complex_object(PyObject *v, char flag, WFILE *p)
{
    Py_ssize_t i, n;
    // 如果是整數(shù)的話,執(zhí)行整數(shù)的寫入邏輯
    if (PyLong_CheckExact(v)) {
        // ......
    }
    // 如果是浮點(diǎn)數(shù)的話,執(zhí)行浮點(diǎn)數(shù)的寫入邏輯
    else if (PyFloat_CheckExact(v)) {
        // ......
    }
    // 如果是復(fù)數(shù)的話,執(zhí)行復(fù)數(shù)的寫入邏輯
    else if (PyComplex_CheckExact(v)) {
        // ......
    }
    // 如果是字節(jié)序列的話,執(zhí)行字節(jié)序列的寫入邏輯
    else if (PyBytes_CheckExact(v)) {
        // ......
    }
    // 如果是字符串的話,執(zhí)行字符串的寫入邏輯
    else if (PyUnicode_CheckExact(v)) {
        // ......
    }
    // 如果是元組的話,執(zhí)行元組的寫入邏輯
    else if (PyTuple_CheckExact(v)) {
       // ......
    }
    // 如果是列表的話,執(zhí)行列表的寫入邏輯
    else if (PyList_CheckExact(v)) {
        // ......
    }
    // 如果是字典的話,執(zhí)行字典的寫入邏輯
    else if (PyDict_CheckExact(v)) {
        // ......
    }
    // 如果是集合的話,執(zhí)行集合的寫入邏輯
    else if (PyAnySet_CheckExact(v)) {
        // ......
    }
    // 如果是 PyCodeObject 對(duì)象的話
    // 執(zhí)行 PyCodeObject 對(duì)象的寫入邏輯
    else if (PyCode_Check(v)) {
        //......
    }
    // 如果是 Buffer 的話,執(zhí)行 Buffer 的寫入邏輯
    else if (PyObject_CheckBuffer(v)) {
        //......
    }
    else {
        W_TYPE(TYPE_UNKNOWN, p);
        p->error = WFERR_UNMARSHALLABLE;
    }
}

源代碼雖然長(zhǎng),但是邏輯非常單純,就是對(duì)不同的對(duì)象、執(zhí)行不同的寫動(dòng)作,然而其最終目的都是通過(guò) w_byte 寫到 pyc 文件中。了解完函數(shù)的整體結(jié)構(gòu)之后,我們?cè)倏匆幌戮唧w細(xì)節(jié),看看它在寫入對(duì)象的時(shí)候到底寫入了哪些內(nèi)容?

// Python/marshal.c
static void
w_complex_object(PyObject *v, char flag, WFILE *p)
{
    // ......
    else if (PyList_CheckExact(v)) {
        W_TYPE(TYPE_LIST, p);
        n = PyList_GET_SIZE(v);
        W_SIZE(n, p);
        for (i = 0; i < n; i++) {
            w_object(PyList_GET_ITEM(v, i), p);
        }
    }
    else if (PyDict_CheckExact(v)) {
        Py_ssize_t pos;
        PyObject *key, *value;
        W_TYPE(TYPE_DICT, p);
        /* This one is NULL object terminated! */
        pos = 0;
        while (PyDict_Next(v, &pos, &key, &value)) {
            w_object(key, p);
            w_object(value, p);
        }
        w_object((PyObject *)NULL, p);
    }  
    // ......
}

以列表和字典為例,它們?cè)趯懭氲臅r(shí)候?qū)嶋H上寫的是內(nèi)部的元素,其它對(duì)象也是類似的。

def foo():
    lst = [1, 2, 3]

# 把列表內(nèi)的元素寫進(jìn)去了
print(
    foo.__code__.co_consts
)  # (None, (1, 2, 3))

當(dāng)然啦,對(duì)于 3.12 版本來(lái)說(shuō),內(nèi)部的元素會(huì)以元組的形式被收集起來(lái)。

但很明顯,如果只是將元素收集起來(lái)顯然是不夠的,否則 Python 在加載的時(shí)候怎么知道它是一個(gè)列表呢?所以在寫入的時(shí)候不能光寫數(shù)據(jù),還要將類型信息也寫進(jìn)去。我們?cè)倏匆幌律厦媪斜砗妥值涞膶懭脒壿嫞锩娑颊{(diào)用了 W_TYPE,它負(fù)責(zé)寫入類型信息。

因此無(wú)論對(duì)于哪種對(duì)象,在寫入具體數(shù)據(jù)之前,都會(huì)先調(diào)用 W_TYPE 將類型信息寫進(jìn)去。如果沒(méi)有類型信息,那么當(dāng)解釋器加載 pyc 文件的時(shí)候,只會(huì)得到一坨字節(jié)流,而無(wú)法解析字節(jié)流中隱藏的結(jié)構(gòu)和蘊(yùn)含的信息。

所以在往 pyc 文件里寫入數(shù)據(jù)之前,必須先寫入一個(gè)標(biāo)識(shí),諸如 TYPE_LIST, TYPE_TUPLE, TYPE_DICT 等等,這些標(biāo)識(shí)正是對(duì)應(yīng)的類型信息。

如果解釋器在 pyc 文件中發(fā)現(xiàn)了這樣的標(biāo)識(shí),則預(yù)示著上一個(gè)對(duì)象結(jié)束,新的對(duì)象開(kāi)始,并且也知道新對(duì)象是什么樣的對(duì)象,從而也知道該執(zhí)行什么樣的構(gòu)建動(dòng)作。當(dāng)然,這些標(biāo)識(shí)也是可以看到的,在底層已經(jīng)定義好了。

圖片圖片

到了這里可以看到,Python 對(duì) PyCodeObject 對(duì)象的導(dǎo)出實(shí)際上是不復(fù)雜的。因?yàn)椴还苁裁磳?duì)象,最后都會(huì)歸結(jié)為兩種簡(jiǎn)單的形式,一種是數(shù)值寫入,一種是字符串寫入。

上面都是對(duì)數(shù)值的寫入,比較簡(jiǎn)單,僅僅需要按照字節(jié)依次寫入 pyc 即可。然而在寫入字符串的時(shí)候,Python 設(shè)計(jì)了一種比較復(fù)雜的機(jī)制,有興趣可以自己閱讀源碼,這里不再介紹。

字節(jié)碼混淆

最后再來(lái)說(shuō)一下字節(jié)碼混淆,我們知道 pyc 是可以反編譯的,而且目前也有現(xiàn)成的工具。但這些工具它會(huì)將每一個(gè)指令都解析出來(lái),所以字節(jié)碼混淆的方式就是往里面插入一些惡意指令(比如加載超出范圍的數(shù)據(jù)),讓反編譯工具在解析的時(shí)候報(bào)錯(cuò),從而失去作用。

但插入的惡意指令還不能影響解釋器執(zhí)行,因此還要插入一些跳轉(zhuǎn)指令,從而讓解釋器跳過(guò)惡意指令。

圖片圖片

混淆之后多了兩條指令,其中偏移量為 8 的指令,參數(shù)為 255,表示加載常量池中索引為 255 的元素。如果常量池沒(méi)有這么多元素,那么顯然會(huì)發(fā)生索引越界,導(dǎo)致反編譯的時(shí)候報(bào)錯(cuò)。

但對(duì)于解釋器來(lái)說(shuō),是可以正常執(zhí)行的,因?yàn)樵趫?zhí)行到偏移量為 6 的指令時(shí)出現(xiàn)了一個(gè)相對(duì)跳轉(zhuǎn),直接跳到偏移量為 10(6 + 4)的指令了。

因此對(duì)于解釋器執(zhí)行來(lái)說(shuō),混淆前后是沒(méi)有區(qū)別的。但對(duì)于反編譯工具而言則無(wú)法正常工作,因?yàn)樗鼤?huì)把每一個(gè)指令都解析一遍。根據(jù)這個(gè)思路,我們可以插入很多很多的惡意指令,然后再利用跳轉(zhuǎn)指令來(lái)跳過(guò)這些不合法指令。當(dāng)然混淆的手段并不止這些,我們還可以添加一下虛假的分支,然后在執(zhí)行時(shí)跳轉(zhuǎn)到真實(shí)的分支當(dāng)中。

而這一切的目的,都是為了防止別人根據(jù) pyc 文件反推出源代碼。不過(guò)這種做法屬于治標(biāo)不治本,如果真的想要保護(hù)源代碼的話,可以使用 Cython 將其編譯成 pyd ,這是最推薦的做法。

責(zé)任編輯:武曉燕 來(lái)源: 古明地覺(jué)的編程教室
相關(guān)推薦

2025-06-04 03:21:00

RAGRetrievalGeneratio

2021-10-20 08:49:30

Vuexvue.js狀態(tài)管理模式

2022-09-29 10:26:59

iOSScaffoldflutter

2024-04-12 12:19:08

語(yǔ)言模型AI

2025-05-22 06:23:48

2022-03-24 08:51:48

Redis互聯(lián)網(wǎng)NoSQL

2025-05-21 09:32:28

2021-03-22 10:05:59

netstat命令Linux

2023-09-08 08:20:46

ThreadLoca多線程工具

2023-09-15 12:00:01

API應(yīng)用程序接口

2022-05-05 16:47:24

Docker網(wǎng)絡(luò)空間容器

2021-12-01 11:40:14

Python 輸入輸出

2020-05-15 16:37:13

PowerBI數(shù)據(jù)分析

2023-07-04 08:56:07

指針類型Golang

2021-09-11 10:41:27

PythonPickle模塊

2023-04-03 15:04:00

RPCPHP語(yǔ)言

2023-08-24 16:50:45

2024-06-05 11:43:10

2022-08-15 15:39:23

JavaScript面向?qū)ο?/a>數(shù)據(jù)

2020-03-18 14:00:47

MySQL分區(qū)數(shù)據(jù)庫(kù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

欧美ab在线视频| 国产精品日韩精品在线播放 | 国产日韩一区在线| 精品欧美一区二区久久久久| 国产suv精品一区| 欧美在线不卡一区| 精品一区二区三区无码视频| 国产在线黄色| 国产成人免费视频网站| 日韩av电影国产| 九九视频免费在线观看| 极品美女一区二区三区| 精品国产sm最大网站| 黄色一级免费大片| 国产探花在线观看| 中文字幕视频一区二区三区久| 国产98在线|日韩| 中文字幕一区二区三区免费看| 欧美日韩精品一本二本三本| 中国china体内裑精亚洲片| 日韩综合第一页| 伊人久久大香线蕉综合影院首页| 欧美日韩在线视频一区| 黄色一级大片免费| 日本在线观看www| 久久综合av免费| 国产精品久久波多野结衣| 91丨porny丨在线中文| 亚洲欧美日韩在线观看a三区| 久久99精品久久久久久青青91| 免费视频91蜜桃| 日韩超碰人人爽人人做人人添| 欧美一区在线视频| 超碰人人草人人| 精品欧美一区二区三区在线观看| 精品久久久久久久久久| 久久久久久www| 欧美男男video| 亚洲乱码中文字幕| 亚洲综合五月天| 女女色综合影院| 久久久久亚洲蜜桃| 欧美日韩国产免费一区二区三区| 手机看片一区二区| 成人av在线影院| 97人人澡人人爽| www.欧美国产| 成人免费毛片嘿嘿连载视频| 亚洲淫片在线视频| 99在线无码精品入口| 韩国欧美一区二区| 91精品啪aⅴ在线观看国产| 国产又粗又黄又爽| 国产中文一区二区三区| 亚洲字幕一区二区| 亚洲av永久无码国产精品久久| 国产精品一二二区| av蓝导航精品导航| 欧美 日韩 国产 成人 在线| 成人av第一页| 欧美亚洲丝袜| 波多野结衣在线网站| 国产精品久久久久永久免费观看| 午夜欧美一区二区三区免费观看| 91caoporm在线视频| 国产精品灌醉下药二区| 国产av不卡一区二区| 深夜国产在线播放| 黄网动漫久久久| 北条麻妃av高潮尖叫在线观看| 性欧美freehd18| 欧美久久一区二区| av在线天堂网| 亚洲图区在线| 最新国产精品拍自在线播放| 欧美激情精品久久| 国产精品毛片在线看| 国产精品99蜜臀久久不卡二区| 中文字幕乱码人妻二区三区| 国产成人免费视频网站 | 在线免费看黄网站| 亚洲免费观看高清完整版在线观看熊 | 国产区精品在线观看| 精品久久久久久亚洲综合网站| 成人av在线资源网站| 亚洲国产激情一区二区三区| www在线视频| 欧美性极品xxxx做受| 精品亚洲一区二区三区四区| 2020最新国产精品| 国产一区二区三区三区在线观看| 性色av无码久久一区二区三区| 亚洲黄色av| 国产美女91呻吟求| 日韩中文字幕影院| 国产精品久久久久久久蜜臀| 成人午夜精品久久久久久久蜜臀| 你懂得影院夜精品a| 91精品国产一区二区三区香蕉 | 99久久亚洲精品日本无码| 99精品国产视频| 正义之心1992免费观看全集完整版| caoprom在线| 欧美日韩精品三区| 蜜臀av一区二区三区有限公司| 亚洲成人精品| 国产精品久久一| 午夜视频福利在线| 亚洲男帅同性gay1069| 免费观看成人在线视频| 中文在线综合| 日韩在线高清视频| 久久亚洲精品石原莉奈| 成人的网站免费观看| 桥本有菜av在线| 欧美日韩视频免费观看| 亚洲精品www久久久| 男人操女人的视频网站| 日本不卡中文字幕| 免费一区二区三区| xxx性欧美| 日韩欧美高清dvd碟片| 久久久久久久久福利| 亚洲综合欧美| 成人av资源网| 羞羞视频在线观看免费| 在线成人高清不卡| www.4hu95.com四虎| 狂野欧美一区| 欧美精品成人一区二区在线观看| 99thz桃花论族在线播放| 日韩欧美国产wwwww| 少妇被躁爽到高潮无码文| 久久激情五月激情| 亚洲精品中字| 日韩毛片网站| 日韩天堂在线视频| 国产又黄又大又爽| 1024成人网| 亚洲高清av一区二区三区| 国产精品97| 成人网址在线观看| 在线观看男女av免费网址| 91精品国产色综合久久ai换脸 | 国产精品久久国产愉拍| 精品国产综合| 国产在线看片免费视频在线观看| 亚洲国模精品一区| 日本少妇久久久| 99re热这里只有精品视频| 男人插女人视频在线观看| 大奶在线精品| 97精品久久久| 九色在线视频蝌蚪| 欧美日韩一区不卡| 欧美特黄一级片| 国产精品亚洲一区二区三区妖精| 国产乱人伦精品一区二区三区| 深夜激情久久| 69久久夜色精品国产69乱青草| 日韩av免费观影| 欧美在线视频日韩| 蜜臀久久精品久久久用户群体| 国产精品99久久久久久久女警 | 免费精品视频在线| 在线视频欧美一区| 凹凸成人在线| 欧美中文字幕视频| aaa日本高清在线播放免费观看| 欧美精品成人一区二区三区四区| 国产这里有精品| 99视频精品全部免费在线| 日本熟妇人妻xxxxx| 三区四区不卡| 国产精品久久国产精品| 3d性欧美动漫精品xxxx软件| 日韩亚洲一区二区| 国内爆初菊对白视频| 色综合中文字幕| 三级黄色录像视频| www.欧美.com| 在线观看日本一区二区| 激情综合视频| 日韩国产欧美一区| 一区二区在线视频观看| 日本91av在线播放| av片在线观看网站| 亚洲欧美国产一本综合首页| av中文字幕第一页| 91精品办公室少妇高潮对白| 91日韩中文字幕| 久久午夜免费电影| 男插女视频网站| 日韩精品一二区| 日韩精品视频在线观看视频| 精品国产一区二区三区| 国产福利一区二区三区在线观看| 外国电影一区二区| 久久久久久亚洲| 超碰在线国产| 亚洲美腿欧美激情另类| 国内精品久久久久久久久久| 日本电影亚洲天堂一区| 国产午夜福利片| 中文字幕一区二区在线播放| xxxxxx黄色| 国产乱码精品一区二区三区忘忧草| 国模杨依粉嫩蝴蝶150p| 在线日韩欧美| 免费在线精品视频| 波多野结衣的一区二区三区 | 国产精品99久久久久久动医院| 国语精品中文字幕| 秋霞一区二区| 成人精品一区二区三区电影免费| 在线精品亚洲欧美日韩国产| 欧美国产第一页| 欧美激情免费| 中日韩午夜理伦电影免费| 日本人妖在线| 亚洲精品美女久久久久| а√中文在线资源库| 欧美精品在线视频| 中文字幕网址在线| 欧美系列一区二区| 免费一级a毛片| 日韩欧美高清视频| 国产精品100| 午夜精品久久久久| 欧美成人aaaaⅴ片在线看| 一区二区三区精品视频在线| 婷婷伊人五月天| 亚洲欧美日韩在线| 男人av资源站| 亚洲日本一区二区| 成人免费毛片东京热| 亚洲久草在线视频| 成熟的女同志hd| 日本黄色小视频在线观看| 久久久久高清精品| 国产特级黄色录像| 日本一区二区三区四区在线视频| 中文字幕在线看高清电影| 久久久久久一级片| 青娱乐国产视频| 国产精品久久久久久久久图文区| 国产探花视频在线播放| 国产精品久久久久久久裸模| 免费成人深夜夜行网站| 亚洲日本乱码在线观看| 一区二区三区免费高清视频| 亚洲成人自拍网| 久久久精品福利| 欧美中文字幕一区| 91麻豆一区二区| 日韩欧美国产麻豆| 五月婷婷伊人网| 亚洲性猛交xxxxwww| 亚洲图片88| 欧美美最猛性xxxxxx| 成人三级小说| 欧美怡红院视频一区二区三区| 天天免费亚洲黑人免费| 国产精品丝袜久久久久久高清| 成人在线日韩| 国产精品久久久久久久免费大片 | 亚洲欧洲黄色网| 一级日本在线| 高清欧美性猛交| 日韩欧美2区| 亚洲一区二区三区香蕉| 色狠狠久久av综合| 亚洲午夜精品一区二区三区| 欧美日韩一区二区三区四区在线观看 | 在线看日韩精品电影| 国产乱人乱偷精品视频| 亚洲成人久久久| 福利片在线观看| 欧美精品999| 麻豆精品蜜桃| 成人欧美一区二区三区视频| 视频一区欧美| 色婷婷777777仙踪林| 久久aⅴ乱码一区二区三区| 岛国av免费在线| 97成人超碰视| 色欲人妻综合网| 91国产免费看| 成人精品在线播放| 中文字幕亚洲综合| 啊啊啊久久久| 91精品视频播放| 中日韩免视频上线全都免费| 国内精品国产三级国产99| 久久久精品性| 久久久久亚洲AV成人网人人小说| 欧美激情一区在线观看| 五月天婷婷丁香| 欧美久久免费观看| 美国成人毛片| 性色av一区二区三区免费| 在线高清欧美| 日本一区网站| 国产欧美日韩亚洲一区二区三区| 在线播放av中文字幕| 国产午夜精品久久久久久久| 香蕉免费毛片视频| 欧美一区二区播放| 在线观看h片| 日本韩国欧美精品大片卡二| aiai久久| 欧美一二三不卡| 韩国精品一区二区| 妺妺窝人体色WWW精品| 亚洲妇熟xx妇色黄| 国产高清不卡视频| 久久天天躁狠狠躁夜夜躁2014| 91p九色成人| 欧美精品v日韩精品v国产精品| 日韩一级精品| 动漫av在线免费观看| 亚洲免费观看高清完整版在线观看| 中文字幕免费播放| 一区二区三区四区精品| 在线看片福利| 美女主播视频一区| 国产欧美亚洲一区| 手机在线成人av| 亚洲国产你懂的| 亚洲xxx在线| 色综合天天狠天天透天天伊人| **国产精品| 中文字幕av久久| 国产盗摄视频一区二区三区| 一级黄色录像视频| 日韩欧美久久一区| 欧美1—12sexvideos| 国产日韩精品一区观看| 激情欧美丁香| 国产成人精品无码片区在线| 精品久久久久久久大神国产| 天堂√在线中文官网在线| 99久久免费国产| 久久久一二三区| 欧美精品一区二区三区蜜桃视频| 免费不卡av| 国产亚洲福利社区| 国产精品嫩草99av在线| 国产精品无码一区二区三区免费| 黑人巨大精品欧美一区二区| 亚洲色图另类小说| 国产99久久久欧美黑人| 成人三级视频| 亚洲黄色av片| 一区二区三区日韩精品视频| 免费的黄色av| 欧洲成人免费aa| 欧美少妇xxxx| 视频免费1区二区三区| 亚洲国产精品自拍| 色吊丝在线永久观看最新版本| 国产精品 欧美在线| 日韩精品四区| 成人免费播放视频| 狠狠躁夜夜躁人人爽天天天天97| 加勒比一区二区三区在线| 成人黄色激情网| 国产精品激情| 欧美多人猛交狂配| 在线播放国产精品二区一二区四区 | 亚洲婷婷伊人| 一个色综合久久| 亚洲国产一区二区a毛片| 欧洲亚洲在线| 96精品久久久久中文字幕| 亚洲国产精品第一区二区| 91网站免费入口| 欧美精品在线视频| 亚洲欧美电影| 91成人在线视频观看| 久久这里只精品最新地址| 国产精品一品二区三区的使用体验| 性色av一区二区三区| 99久久99久久精品国产片桃花| 完美搭档在线观看| 欧美日韩视频在线第一区 | 精品久久久久久中文字幕一区奶水 | 欧美激情一区不卡| 精品人妻aV中文字幕乱码色欲| 欧洲一区二区视频| 中文字幕一区二区三三| 亚洲综合色一区| 日韩一卡二卡三卡| 成人av观看| 国产成人在线小视频| 国产精品家庭影院| 黄视频在线观看免费| 国产精品有限公司| 国内精品久久久久影院色| 999视频在线|