免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

Android APK 加固原理(三):方法級(jí)代碼抽取——PVM1 虛擬化打包到底是什么?

Android APK 加固原理(三):方法級(jí)代碼抽取——PVM1 虛擬化打包到底是什么? Android APK 加固原理三方法級(jí)代碼抽取——PVM1 虛擬化打包到底是什么系列文章?第一篇《Android APK 加固原理一Native Shell 如何隱藏和恢復(fù) DEX》第二篇《Android APK 加固原理二從 DEX 解密到 ART 加載如何縮短代碼明文暴露窗口》第三篇《Android APK 加固原理三方法級(jí)代碼抽取——PVM1 虛擬化打包到底是什么》第四篇《Android APK 加固原理四真正的代碼虛擬化——PVM2 Native Interpreter 技術(shù)解析》第五篇《Android APK 加固原理五SO.text段加密、ELF 加載與運(yùn)行時(shí)動(dòng)態(tài)解密》第六篇《Android APK 加固原理六RASP 運(yùn)行時(shí)安全防護(hù)——如何檢測(cè) Frida、Hook 與運(yùn)行時(shí)攻擊》第七篇《從 APK 加密到代碼虛擬化XopProtector 多層 Android 應(yīng)用保護(hù)體系解析》項(xiàng)目地址https://github.com/xopJack/XopProtector一、前言為什么有了 DEX 加密還需要 PVM1在前兩篇文章中我們已經(jīng)分析了 Android APK 加固最基礎(chǔ)的一層防護(hù)第一層是把原始 DEX 從 APK 中拿走。第二層是把 DEX 加密讓逆向工具無法直接從 APK 中得到完整的 classes.dex。但是僅僅做到 DEX 加密并不能解決所有問題。因?yàn)?Android 應(yīng)用最終還是需要運(yùn)行。無論 DEX 在 APK 中如何加密應(yīng)用啟動(dòng)以后代碼最終還是需要進(jìn)入 Android Runtime也就是 ART 的執(zhí)行體系。因此攻擊者真正關(guān)心的問題會(huì)逐漸從“APK 里面有沒有完整 DEX”轉(zhuǎn)變?yōu)椤斑\(yùn)行時(shí)能不能把 DEX 恢復(fù)出來”進(jìn)一步又會(huì)變成“能不能只針對(duì)關(guān)鍵方法進(jìn)行分析”這也是方法級(jí)保護(hù)存在的意義。XopProtector 在整體保護(hù)體系中增加了 PVM1原始 DEX ↓ 定位目標(biāo)方法 ↓ 抽取方法 Dalvik 指令 ↓ PVM1 編碼 ↓ AES-GCM 加密 ↓ 原方法體替換成安全占位 Stub ↓ 生成 code.bin ↓ 運(yùn)行時(shí) Native Shell 解密 ↓ 恢復(fù) Dalvik 指令 ↓ 寫回 DEX ↓ ART 執(zhí)行因此PVM1 的核心思想并不是“讓代碼永遠(yuǎn)不出現(xiàn)”。而是把關(guān)鍵方法從正常 DEX 的 code_item 中抽離出來讓靜態(tài) DEX 分析工具看到的只是一個(gè)占位方法真正的方法實(shí)現(xiàn)被移動(dòng)到獨(dú)立的加固數(shù)據(jù)區(qū)中并在運(yùn)行時(shí)恢復(fù)。XopProtector 源碼明確將--vmp-prefix定義為 PVM1并特別說明它是 ?**“decode → write Dalvik”**?而不是 Interpreter。二、先搞清楚PVM1 到底是什么很多人看到“VMP”“Virtual Machine”“虛擬化”這些詞第一反應(yīng)就是原始代碼 ↓ 虛擬指令 ↓ Virtual Machine ↓ Interpreter這種理解對(duì)于 XopProtector 的PVM2才成立。對(duì)于 ?PVM1?并不是這樣。XopProtector 的VmCodec.java對(duì) PVM1 的注釋非常直接Lightweight method-level VM packing (PVM1) Dalvik → non-Dalvik image Runtime unpacks inside .bitcode before writing DEX. This is virtualized packing, not a full bytecode interpreter.也就是說PVM1 更準(zhǔn)確的技術(shù)定義應(yīng)該是Method-Level Virtualized Packing方法級(jí)虛擬化打包而不是True Code Virtualization真正的代碼虛擬化。這兩個(gè)概念一定要區(qū)分。三、PVM1 和 PVM2 到底有什么區(qū)別這是整個(gè)系列最容易混淆的地方??梢灾苯佑孟旅孢@張表理解特性PVM1PVM2保護(hù)粒度方法級(jí)方法級(jí)是否抽取原始指令是是是否生成虛擬化數(shù)據(jù)是是是否存在 Interpreter否是是否恢復(fù) Dalvik是否是否寫回 DEX是否最終執(zhí)行者ARTNative Interpreter核心目的提高靜態(tài)逆向成本改變代碼執(zhí)行模型對(duì)運(yùn)行時(shí) Hook 的抵抗能力中等更強(qiáng)性能開銷相對(duì)較小更高實(shí)現(xiàn)復(fù)雜度較低很高XopProtector README 對(duì)兩者的定義非常明確--vmp-prefix PVM1 unpack → write Dalvik not an interpreter --true-vmp-prefix PVM2 JNI trampoline native interpret因此PVM1 是“代碼搬家 編碼保護(hù) 運(yùn)行時(shí)恢復(fù)”。而PVM2 是“代碼翻譯 自定義指令集 Native Interpreter”。這也是為什么 XopProtector 把 PVM1 和 PVM2 設(shè)計(jì)成兩個(gè)不同階段。四、PVM1 的核心從“類級(jí)保護(hù)”下降到“方法級(jí)保護(hù)”傳統(tǒng) DEX 加密往往是classes.dex ↓ 整體加密運(yùn)行時(shí)整個(gè) DEX ↓ 整體解密 ↓ 交給 ART這種方式的缺點(diǎn)很明顯一旦整個(gè) DEX 被恢復(fù)攻擊者就獲得了大量可分析代碼。而 PVM1 改變了保護(hù)粒度。它不再簡單地把整個(gè) DEX 看成一個(gè)整體而是進(jìn)一步進(jìn)入DEX ├── Class A │ ├── method A() │ ├── method B() │ └── method C() │ ├── Class B │ ├── method D() │ └── method E() │ └── Class C └── method F()然后選擇其中關(guān)鍵方法method B() method D() method F()進(jìn)行抽取。最終形成DEX ├── 普通方法 → 正常保留 │ ├── PVM1 方法 → 抽空 │ ↓ │ code.bin │ └── PVM2 方法 → 后續(xù)真正虛擬化因此PVM1 的第一個(gè)重要思想就是保護(hù)從“DEX 級(jí)”進(jìn)一步下降到了“Method 級(jí)”。五、第一步找到需要保護(hù)的方法XopProtector 的 Packer 是在構(gòu)建階段工作的。源碼中的PackerMain會(huì)讀取 DEX并遍歷其中的 ClassDef、ClassData 以及 DirectMethods / VirtualMethods。核心流程可以抽象為APK ↓ 解包 ↓ classes.dex ↓ 解析 DEX ↓ 遍歷 ClassDef ↓ 定位目標(biāo) Class ↓ 遍歷 DirectMethod ↓ 遍歷 VirtualMethod ↓ 提取 code_item源碼中的walkDexMethods()就承擔(dān)了這一職責(zé)。它會(huì)遍歷dex.classDefs()然后讀取classData.getDirectMethods() classData.getVirtualMethods()再逐個(gè)調(diào)用extractOne(...)處理方法。六、PVM1 并不是所有方法都保護(hù)這是一個(gè)非常重要的設(shè)計(jì)。XopProtector 并不是無腦把所有方法都轉(zhuǎn)換成 PVM1。源碼中存在vmpPrefixes對(duì)應(yīng)--vmp-prefix也就是說可以按照類描述符前綴選擇需要進(jìn)行 PVM1 處理的代碼。例如--vmp-prefix Lcom/example/security/那么Lcom/example/security/Foo; Lcom/example/security/Pay; Lcom/example/security/License;等類中的方法就可能進(jìn)入 PVM1 流程。源碼中明確維護(hù)了vmpPrefixes trueVmpPrefixes hollowPrefixes三個(gè)不同維度。這實(shí)際上構(gòu)成了普通代碼 ↓ Hollow PVM1 代碼 ↓ PVM1 Packing PVM2 代碼 ↓ True VMP因此可以針對(duì)不同代碼價(jià)值選擇不同保護(hù)等級(jí)。七、第二步讀取方法真正的 Dalvik 指令找到目標(biāo)方法以后PVM1 并不是簡單地復(fù)制整個(gè) MethodId。它真正需要保護(hù)的是方法的 code_item 中的 Dalvik instruction stream。源碼中com.android.dex.Codecodedex.readCode(method);然后short[]unitscode.getInstructions();再根據(jù)units.length * 2計(jì)算實(shí)際指令區(qū)域大小。之后通過method.getCodeOffset()16定位到 code_item 中真正的 instructions 區(qū)域。然后raf.seek(insnsOffset);raf.readFully(original);把原始 Dalvik 指令讀取出來。所以這里可以把 PVM1 的第一核心動(dòng)作總結(jié)成Method ↓ CodeItem ↓ instructions ↓ byte[]也就是把原方法的 Dalvik 指令從 DEX 中物理抽取出來。八、第三步PVM1 編碼到底做了什么現(xiàn)在進(jìn)入 PVM1 最核心的VmCodec。XopProtector 的 PVM1 數(shù)據(jù)擁有一個(gè)非常明顯的 MagicPVM1源碼privatestaticfinalbyte[]MAGIC{P,V,M,1};編碼后的數(shù)據(jù)結(jié)構(gòu)可以簡單理解成---------------- | PVM1 | ---------------- | encoded byte 0 | ---------------- | encoded byte 1 | ---------------- | encoded byte 2 | ---------------- | ... | ----------------值得注意的是PVM1 編碼后的數(shù)據(jù)長度基本等于原始 Dalvik 指令長度 4 字節(jié) Magic。它并沒有像真正的虛擬機(jī)那樣把一條 Dalvik 指令重新編譯成復(fù)雜的 VM 指令流。這也是為什么稱它為Virtualized Packing而不是True Virtualization源碼明確說明 PVM1 編碼結(jié)果是same length 4即原始長度加上PVM1四字節(jié)頭。九、PVM1 的第一層編碼基于 Method Index 的 Key StreamPVM1 的編碼并不是簡單byte ^ 0x55它會(huì)根據(jù)methodIdx以及byte offset生成一個(gè)簡單的動(dòng)態(tài)字節(jié)流。源碼keystream(methodIdx, i)其核心計(jì)算為(methodIdx * 131 i * 17 0xA5) 0xff因此Key f(methodIndex, byteOffset)然后encodedByte originalByte ^ key這樣不同 Method Index 的編碼結(jié)果就不會(huì)完全相同。十、PVM1 的第二層Nibble Swap除了 XORPVM1 還做了一層非常輕量的字節(jié)變換。源碼中if((i1)0){b((b4)0xf0)|((b4)0x0f);}也就是對(duì)偶數(shù)位置的字節(jié)進(jìn)行高低 4 bit 交換。例如原始 1010 0011經(jīng)過 Nibble Swap0011 1010所以 PVM1 的實(shí)際編碼邏輯可以抽象為Dalvik Byte ↓ XOR KeyStream ↓ 偶數(shù)位置 Nibble Swap ↓ PVM1 Blob解碼時(shí)反過來PVM1 Blob ↓ Nibble Swap ↓ XOR KeyStream ↓ 原始 Dalvik Byte因此這個(gè)過程本質(zhì)上是為了破壞原始 Dalvik 指令的線性特征讓靜態(tài)掃描器無法直接把這一段數(shù)據(jù)當(dāng)作正常 DEX 指令流解析。十一、但是 PVM1 真正的安全邊界并不在這個(gè) XOR這一點(diǎn)非常重要。如果只看methodIdx i 131 17 0xA5 XOR你會(huì)發(fā)現(xiàn)這并不是現(xiàn)代密碼學(xué)意義上的強(qiáng)加密。實(shí)際上 XopProtector 的真正安全邊界來自后面那一層AES-GCMPVM1 編碼只是Dalvik ↓ PVM1 Transform ↓ AES-GCM源碼中extractOne()的流程非常清楚original Dalvik instructions ↓ VmCodec.encode() ↓ PVM1 blob ↓ CryptoUtils.aesGcmEncrypt() ↓ stored也就是說PVM1 負(fù)責(zé)改變數(shù)據(jù)形態(tài)AES-GCM 負(fù)責(zé)真正的數(shù)據(jù)機(jī)密性。十二、第四步原始方法代碼被真正“抹掉”這是 PVM1 最關(guān)鍵的一步。如果只是復(fù)制一份代碼那么原 DEX 里面仍然存在原始代碼。保護(hù)就沒有意義。所以 XopProtector 在提取完方法指令以后會(huì)直接修改原來的 DEX。流程原始 Method Code ↓ 讀取 ↓ 保存到 PVM1 ↓ 原位置寫入 Stub源碼中writeReturnStub(...)會(huì)把原始 instructions 替換成一個(gè)與返回類型匹配的占位代碼。例如void → return-void int → const/4 v0, 0 → return v0 object → const/4 v0, 0 → return-object v0剩余空間則用nop類指令填充。十三、為什么不能直接把方法體全部清零這是 Android ART 加載過程中的一個(gè)關(guān)鍵問題。DEX 并不是Class Method Code隨便寫什么都可以。ART 在加載、驗(yàn)證以及后續(xù)執(zhí)行過程中會(huì)檢查 Method 的結(jié)構(gòu)和 code_item。如果直接code_item 0或者破壞整個(gè) CodeItem很容易造成DEX 驗(yàn)證失敗 VerifyError Class loading failure Crash所以加固系統(tǒng)常見的思路是不破壞方法結(jié)構(gòu)只替換真正的業(yè)務(wù)指令。XopProtector 也是這樣做的。例如原方法intadd(inta,intb){returnab;}原來的 Dalvik 指令可能類似add-int returnPVM1 后變成const/4 v0, 0 return v0 nop nop ...真正的add-int已經(jīng)被拿走。這就是所謂Hollow / Method Hollowing也就是方法空洞化。十四、因此 PVM1 最重要的結(jié)構(gòu)變化是這樣的加固之前classes.dex Method A ↓ CodeItem ↓ 真正業(yè)務(wù) Dalvik 指令加固之后classes.dex Method A ↓ CodeItem ↓ 安全 Stub與此同時(shí)assets/protector/code.bin ↓ PVM1 ↓ AES-GCM ↓ 真正的 Dalvik 指令形成┌─────────────────────┐ │ classes.dex │ │ │ │ Method A │ │ ↓ │ │ Stub / Hollow │ └──────────┬──────────┘ │ │ runtime restore ↓ ┌─────────────────────┐ │ code.bin │ │ │ │ Method Index │ │ Plain Size │ │ Flags │ │ AES-GCM Blob │ └─────────────────────┘十五、PVM1 的第五步生成 code.bin方法被抽取以后需要一個(gè)地方保存這些方法。XopProtector 使用code.bin作為運(yùn)行時(shí)方法代碼倉庫。源碼中的writeCodeBin()會(huì)將不同 DEX 中的保護(hù)方法進(jìn)行組織。當(dāng)前代碼使用的是code.bin v4。其結(jié)構(gòu)可以抽象為Header ↓ version ↓ dex count ↓ dex offsets ↓ Dex Blob每個(gè)方法記錄大致包含methodIndex plainInsnsSize storedInsnsSize flags insns也就是Method Index ↓ 告訴 Runtime “這個(gè)代碼屬于哪個(gè)方法” Plain Size ↓ 解密以后需要恢復(fù)多少字節(jié) Stored Size ↓ 當(dāng)前加密數(shù)據(jù)長度 Flags ↓ 告訴 Runtime PVM1 / PVM2 / 其他類型 Insns ↓ AES-GCM 加密后的方法數(shù)據(jù)源碼中writeCodeBin()明確寫入了methodIndex plainInsnsSize insns.length flags insns并且支持多 DEX。十六、為什么必須保存 Method Index這是整個(gè)方法級(jí)保護(hù)體系的“索引核心”。DEX 中的方法是通過method_ids進(jìn)行編號(hào)的。例如method_id #100 method_id #101 method_id #102PVM1 不需要在code.bin中保存一套完整的 Java/Kotlin 方法名。它可以直接利用methodIndex關(guān)聯(lián)DEX Method ? code.bin Record因此 Runtime 可以實(shí)現(xiàn)methodIndex 102 ↓ 找到 code.bin 中 #102 ↓ AES-GCM decrypt ↓ PVM1 decode ↓ 得到真實(shí) Dalvik instructions ↓ 恢復(fù) Method #102這就是 PVM1 的“方法級(jí)映射關(guān)系”。十七、PVM1 運(yùn)行時(shí)到底發(fā)生了什么這部分是整個(gè)機(jī)制最值得分析的地方。很多人會(huì)誤以為啟動(dòng) APP ↓ 整個(gè) code.bin 解密 ↓ 整個(gè) DEX 恢復(fù)實(shí)際上從源碼結(jié)構(gòu)來看XopProtector 的 Runtime 是圍繞code.bin code_map Method ART Hook組織起來的。Native Shell 啟動(dòng)以后會(huì)先定位dexes.zip code.bin config.json然后加載相關(guān) Key。之后code.bin ↓ read_file() ↓ codeitem::parse() ↓ state.code_mapRuntime 將保護(hù)方法建立成內(nèi)部映射。源碼protector::codeitem::parse(...)解析完成以后state.code_map就成為運(yùn)行時(shí)的方法保護(hù)索引。十八、Runtime 為什么要 Hook ART這里就涉及 Android 加固真正困難的地方。如果Method A在 DEX 中已經(jīng)被替換成return 0那么 ART 自己執(zhí)行的時(shí)候自然只會(huì)執(zhí)行return 0它不知道真正代碼在哪里。所以必須在ART 加載 / 定義 Class / Method的關(guān)鍵路徑上進(jìn)行干預(yù)。XopProtector 在初始化階段會(huì)protector::hook::install_hooks();然后再解析和應(yīng)用code.bin源碼明確說明在解析 / 應(yīng)用 code.bin 前安裝 ART hooks以便 DefineClass 時(shí)進(jìn)行 patch。因此整個(gè)體系實(shí)際上形成DEX ↓ ART ↓ Hook ↓ 識(shí)別被保護(hù) Method ↓ 查 code_map ↓ 恢復(fù)真實(shí) Dalvik ↓ 交給 ART十九、PVM1 的運(yùn)行時(shí)恢復(fù)流程可以把它完整畫成App 啟動(dòng) │ ▼ Native Shell 初始化 │ ▼ 讀取 code.bin │ ▼ codeitem::parse │ ▼ 建立 code_map │ ▼ 安裝 ART Hook │ ▼ ART 加載目標(biāo) Class │ ▼ 檢查 Method 是否受保護(hù) │ ┌──────┴──────┐ │ │ 否 是 │ │ ▼ ▼ 正常執(zhí)行 查詢 code_map │ ▼ AES-GCM 解密 │ ▼ PVM1 Decode │ ▼ 得到真實(shí) Dalvik 指令 │ ▼ Patch CodeItem │ ▼ ART 執(zhí)行這就是 PVM1 最核心的運(yùn)行時(shí)機(jī)制。二十、PVM1 的“虛擬化”到底體現(xiàn)在哪里現(xiàn)在回到最開始的問題PVM1 到底算不算虛擬化答案是算但屬于非常輕量級(jí)的“虛擬化打包”而不是完整 VM 虛擬化。因?yàn)樗_實(shí)把原始代碼Dalvik instructions轉(zhuǎn)換成了PVM1 image原始代碼不再直接位于原 Method CodeItem 中。但是它沒有Dalvik opcode ↓ PVM opcode ↓ VM Register ↓ VM Stack ↓ Dispatcher ↓ Handler這一整套機(jī)制。因此PVM1 Dalvik → protected image → Dalvik而PVM2 Dalvik → custom VM bytecode → Native Interpreter這才是真正意義上的Code Virtualization二十一、為什么 PVM1 比真正虛擬化簡單很多假設(shè)原始代碼intcalc(inta,intb){intxab;returnx*10;}PVM1 的目標(biāo)只是隱藏 add-int mul-int return然后運(yùn)行時(shí)恢復(fù) add-int mul-int returnART 繼續(xù)執(zhí)行。所以 PVM1 并不需要理解add-int mul-int if goto invoke new-instance monitor try/catch的語義。它只需要保存 ↓ 解碼 ↓ 恢復(fù)因此實(shí)現(xiàn)成本相對(duì)較低。二十二、真正的 PVM2 為什么會(huì)復(fù)雜得多假設(shè) PVM2 也拿到add-int mul-int return它不會(huì)把這些指令恢復(fù)到 DEX。而是轉(zhuǎn)換成自己的VM_ADD VM_MUL VM_RETURN然后Native Interpreter switch(opcode) { case VM_ADD: ... case VM_MUL: ... case VM_RETURN: ... }于是ART ↓ JNI Trampoline ↓ Native Interpreter ↓ VM Opcode ↓ Handler整個(gè)執(zhí)行模型都發(fā)生改變。XopProtector 當(dāng)前 PVM2 文檔也明確說明PVM2 方法不會(huì)恢復(fù)到 Dalvik而是通過 JNI trampoline 進(jìn)入 Native Interpreter讀取code.bin中的 PVM2 image。這就是下一篇文章真正需要討論的內(nèi)容。二十三、PVM1 對(duì)靜態(tài)逆向的意義假設(shè)沒有 PVM1classes.dex ↓ jadx ↓ Java/Kotlin-like code攻擊者可以直接看到calculateToken()validateLicense()checkSignature()generateKey()而加入 PVM1 后classes.dex ↓ 目標(biāo)方法 ↓ Stub靜態(tài)分析工具看到的可能只是return0;或者returnnull;真實(shí)邏輯已經(jīng)不在 Method CodeItem 中。所以靜態(tài)反編譯結(jié)果 ≠ 真實(shí)業(yè)務(wù)邏輯這就是 PVM1 最直接的價(jià)值。二十四、但是 PVM1 并不是“不可逆”這一點(diǎn)在技術(shù)文章中必須客觀說明。PVM1 的最終執(zhí)行路徑仍然是PVM1 ↓ Decode ↓ Dalvik ↓ ART所以從攻擊者角度靜態(tài)分析 ↓ 難度增加 運(yùn)行時(shí)動(dòng)態(tài)分析 ↓ 仍然可以觀察 最終恢復(fù)后的 Dalvik ↓ 仍然存在因此PVM1 的目標(biāo)不是讓代碼永遠(yuǎn)無法獲得而是增加靜態(tài)分析和自動(dòng)化脫殼的成本。這也符合 XopProtector 項(xiàng)目本身的定位加固的作用是提高逆向成本而不是保證應(yīng)用絕對(duì)不可破解。二十五、PVM1 最大的價(jià)值其實(shí)是“方法級(jí)明文控制”如果把保護(hù)過程畫成時(shí)間軸APK │ │ 加密狀態(tài) ▼ App 啟動(dòng) │ ▼ Runtime 解密 │ ▼ PVM1 Method Decode │ ▼ Dalvik Method 明文 │ ▼ ART 執(zhí)行關(guān)鍵區(qū)別是以前整個(gè) DEX ↓ 大量代碼同時(shí)明文PVM1Method A ↓ 需要時(shí)恢復(fù) Method B ↓ 需要時(shí)恢復(fù) Method C ↓ 需要時(shí)恢復(fù)因此保護(hù)對(duì)象從“整個(gè)代碼包”變成“一個(gè)個(gè)關(guān)鍵方法”。這就是方法級(jí)加固最重要的工程價(jià)值。二十六、從源碼看PVM1 實(shí)際上是“三層保護(hù)疊加”如果把 XopProtector 的 PVM1 單獨(dú)拆開可以得到第一層 Method Hollowing ↓ 從 DEX 中移除真實(shí)實(shí)現(xiàn) 第二層 PVM1 Transform ↓ XOR Nibble Swap ↓ 破壞原始 Dalvik 數(shù)據(jù)特征 第三層 AES-GCM ↓ 真正的數(shù)據(jù)機(jī)密性所以它并不是PVM1 XOR也不是PVM1 AES而是Method │ ▼ ┌───────────────┐ │ Method Extract│ └───────┬───────┘ ▼ ┌───────────────┐ │ PVM1 Transform │ │ XOR Nibble │ └───────┬───────┘ ▼ ┌───────────────┐ │ AES-GCM │ └───────┬───────┘ ▼ code.bin而 DEX 中只留下Stub二十七、PVM1 和傳統(tǒng)“代碼抽取”有什么區(qū)別如果只說“PVM1 就是把代碼抽出來?!逼鋵?shí)不夠準(zhǔn)確。因?yàn)槠胀ùa抽取可能只是DEX ↓ 抽取 Method ↓ 保存到其他文件但是 PVM1 還增加了Method Index PVM1 Encoding AES-GCM Method Hollowing ART Runtime Restore所以完整體系是代碼抽取 代碼變形 加密存儲(chǔ) 原位置空洞化 運(yùn)行時(shí)恢復(fù)這才構(gòu)成完整的 PVM1。二十八、PVM1 的完整生命周期把整個(gè)源碼實(shí)現(xiàn)濃縮成一條鏈【構(gòu)建階段】 APK │ ▼ 解包 DEX │ ▼ 遍歷 ClassDef │ ▼ 找到目標(biāo) Method │ ▼ 讀取 CodeItem │ ▼ 提取 Dalvik Instructions │ ▼ VmCodec.encode │ ▼ PVM1 Blob 生成 │ ▼ AES-GCM 加密 │ ▼ code.bin │ ├───────────────┐ │ │ ▼ ▼ 原 Method 被抹掉 Stub │ ▼ DEX 重寫 │ ▼ APK 重新打包 【運(yùn)行階段】 App 啟動(dòng) │ ▼ Native Shell │ ▼ 讀取 code.bin │ ▼ codeitem::parse │ ▼ 建立 code_map │ ▼ 安裝 ART Hook │ ▼ ART 加載 Class │ ▼ 找到受保護(hù) Method │ ▼ 查詢 code_map │ ▼ AES-GCM 解密 │ ▼ PVM1 Decode │ ▼ 得到真實(shí) Dalvik │ ▼ Patch Method │ ▼ ART │ ▼ 正常執(zhí)行這條鏈基本就是 XopProtector PVM1 的核心原理。二十九、PVM1 真正解決了什么問題可以總結(jié)成四個(gè)字靜態(tài)不可見。更準(zhǔn)確地說1. 靜態(tài) DEX 中不再存在完整方法實(shí)現(xiàn)攻擊者拿到 DEX 后目標(biāo)方法已經(jīng)被替換成 Stub。2. 方法實(shí)現(xiàn)被移動(dòng)到獨(dú)立數(shù)據(jù)區(qū)真實(shí)代碼進(jìn)入code.bin而不是繼續(xù)留在原來的 CodeItem 中。3. PVM1 破壞原始 Dalvik 數(shù)據(jù)形態(tài)通過XOR KeyStream Nibble Swap讓數(shù)據(jù)不再表現(xiàn)為正常 Dalvik instruction stream。4. AES-GCM 提供真正的機(jī)密性即使攻擊者找到code.bin也不能簡單通過strings dexdump jadx直接獲得原始代碼。三十、但 PVM1 還有一個(gè)天然弱點(diǎn)這也是為什么 XopProtector 后面還需要 PVM2。PVM1加密 ↓ 恢復(fù) ↓ Dalvik ↓ ART所以最終真實(shí) Dalvik還是要出現(xiàn)。因此攻擊者如果把分析重點(diǎn)從APK 靜態(tài)分析轉(zhuǎn)向Runtime ↓ ART Hook ↓ Method Restore ↓ Memory Dump就可能重新獲取真實(shí)方法。所以 PVM1 的安全模型是提高靜態(tài)分析成本 增加脫殼復(fù)雜度 縮短攻擊者直接獲得代碼的路徑 但是 最終仍然回到 ART Dalvik 執(zhí)行體系這也是 PVM1 與 PVM2 最根本的安全邊界。三十一、PVM1 → PVM2是 Android 加固的一次質(zhì)變可以把整個(gè)演進(jìn)過程理解為第一階段 DEX 加密 攻擊者 APK ↓ 找到解密點(diǎn) ↓ 得到 DEX 第二階段 PVM1 攻擊者 APK ↓ 找到 code.bin ↓ 找到 Runtime Restore ↓ 獲取 Dalvik 第三階段 PVM2 攻擊者 APK ↓ 找到 JNI Trampoline ↓ 找到 Native Interpreter ↓ 理解自定義 VM ↓ 分析 VM Opcode ↓ 恢復(fù)原始語義所以難度是逐層提升的。三十二、PVM1 最值得學(xué)習(xí)的工程設(shè)計(jì)從工程實(shí)現(xiàn)角度看PVM1 并沒有試圖一步做到極端復(fù)雜。它采取的是一種非常實(shí)用的思路DEX 加密 ↓ 解決“APK 靜態(tài)暴露” PVM1 ↓ 解決“關(guān)鍵方法暴露” PVM2 ↓ 解決“恢復(fù)后仍然是 Dalvik” SO 加密 ↓ 解決 Native 代碼暴露 RASP ↓ 解決運(yùn)行時(shí)攻擊也就是說不同保護(hù)技術(shù)解決不同攻擊面。這比單純依賴一種“超級(jí)加密算法”更加符合商業(yè) APK 加固系統(tǒng)的工程思路。三十三、源碼層面的關(guān)鍵文件如果你準(zhǔn)備繼續(xù)深入研究 XopProtector那么 PVM1 最值得看的幾個(gè)源碼位置是packer/ └── src/main/java/com/yqsh/protector/packer/ │ ├── PackerMain.java │ ├── walkDexMethods() │ ├── extractOne() │ ├── writeReturnStub() │ └── writeCodeBin() │ └── VmCodec.java ├── encode() └── decode()其中PackerMain.java負(fù)責(zé)掃描 DEX ↓ 定位 Method ↓ 抽取指令 ↓ 替換 Stub ↓ 生成 code.binVmCodec.java負(fù)責(zé)PVM1 Encode PVM1 DecodeNative 側(cè)則對(duì)應(yīng)native/src/main/cpp/vm/ └── vm_codec.cpp負(fù)責(zé)運(yùn)行時(shí)PVM1 DecodeNative Runtimenative/src/main/cpp/runtime/ └── engine.cpp負(fù)責(zé)初始化 ↓ 加載 code.bin ↓ 建立 code_map ↓ 安裝 Hook ↓ 進(jìn)入運(yùn)行時(shí)保護(hù)流程這些源碼結(jié)構(gòu)可以非常清晰地證明PVM1 并不是一個(gè)獨(dú)立的 VM而是 Packer Native Runtime ART Hook 三者協(xié)同完成的方法級(jí)保護(hù)機(jī)制。三十四、最終總結(jié)一句話理解 XopProtector PVM1如果只用一句話解釋PVM1 就是在構(gòu)建階段把關(guān)鍵方法的 Dalvik 指令從 DEX 中抽出來經(jīng)過 PVM1 變換和 AES-GCM 加密后保存到code.bin原 Method 只留下與返回類型匹配的安全 Stub應(yīng)用運(yùn)行時(shí)由 Native Shell 解析code.bin通過 ART Hook 找到目標(biāo) Method解密并恢復(fù)真實(shí) Dalvik 指令再交給 ART 執(zhí)行。整個(gè)過程可以最終濃縮成PVM1 ┌───────────────────┐ │ 原始 Method │ └─────────┬─────────┘ │ ▼ 提取 Dalvik Code │ ▼ PVM1 Encode XOR NibbleSwap │ ▼ AES-GCM │ ▼ code.bin │ │ ┌─────────▼─────────┐ │ 原 DEX Method │ │ │ │ 真實(shí) Code 被移除 │ │ ↓ │ │ Stub │ └───────────────────┘ Runtime Native Shell │ ▼ code.bin │ ▼ code_map │ ▼ ART Hook │ ▼ 找到目標(biāo) Method │ ▼ AES-GCM Decode │ ▼ PVM1 Decode │ ▼ 恢復(fù) Dalvik │ ▼ Patch Method │ ▼ ART │ ▼ 執(zhí)行代碼所以PVM1 不是“讓代碼不再執(zhí)行”而是讓代碼不再以正常 DEX Method 的形式存在。這就是它和傳統(tǒng) DEX 加密最大的區(qū)別。而下一階段真正值得研究的問題就是如果連“恢復(fù) Dalvik”這一步都不要了能不能讓被保護(hù)方法從始至終都不回到 DEX而是直接由 Native 自己解釋執(zhí)行答案就是PVM2。PVM2 不再是加密 → 解密 → 恢復(fù) Dalvik → ART而會(huì)變成原始 Dalvik ↓ PVM2 Compiler ↓ 自定義 VM Image ↓ JNI Trampoline ↓ Native Interpreter ↓ VM Opcode ↓ 執(zhí)行XopProtector 當(dāng)前源碼中的 PVM2 已經(jīng)進(jìn)一步加入了多 ISA、Opcode Morphing、RASP Gate、解釋執(zhí)行以及 PVM2 Image等機(jī)制。PVM2 v3 還會(huì)為每個(gè) APK 生成 opcode 映射并根據(jù)isa_id選擇不同 Native dispatch 入口。這才是真正意義上的 Android 代碼虛擬化。下一篇《Android APK 加固原理四真正的代碼虛擬化——PVM2 Native Interpreter 技術(shù)解析》將重點(diǎn)拆解Dalvik ↓ PVM2 Compiler ↓ VM Opcode ↓ PVM2 Image ↓ JNI Trampoline ↓ Native Interpreter ↓ Dispatcher ↓ Opcode Handler ↓ 寄存器 / 對(duì)象 / Field / Method ↓ 最終執(zhí)行并重點(diǎn)解釋為什么 PVM2 和 PVM1 已經(jīng)不是同一個(gè)層級(jí)的加固技術(shù)。參考源碼本文分析以 XopProtector 當(dāng)前公開源碼為基礎(chǔ)重點(diǎn)涉及packer/PackerMain.javapacker/VmCodec.javanative/vm/vm_codec.cppnative/runtime/engine.cppPVM2 設(shè)計(jì)文檔項(xiàng)目公開 README 明確將--vmp-prefix定義為 PVM1將--true-vmp-prefix定義為 PVM2。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
九月婷婷久久| 色色色热| 色五月色开心开心五月| 婷婷色网站| 亚洲超级碰| 亚洲中文字幕av| 五月花综合网| 97资源碰碰在线| av九九| 玖玖九九99| 激情宗合网激情五月天| 丁香五月色| 色五月天婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷 | av在线免费播放| 99久久久国产大片| 综合激情在线观看| 91综合视频丁香| 九九99热| 五月婷婷丁香啪啪| 97 天堂| 97操碰在线视频| 久久这有这里精品| 五月天综合网| 久久99久久99精品免观看粉嫩| 99九九综合久久九九| 天天日日人| 婷婷五月综合丁香久久| 夜夜穞天天穞狠狠穞AV美女按摩| 精品99*| 69五月天视频| 曰韩少妇内射免费播放| 激情久久久久久| 五月涩涩网| 九月丁香亭亭| 日本人妻A片成人免费看片| 99ER热精品视频| 天堂中文国产| 国产婷婷综合在线免费视频| 精品人妻久久久久久| 熟女五月天久久综合| 性爱网五月天| 999热在线视频| 色444综合网| 少妇性按摩无码中文A片| 久久92| 丁香五月亚洲| 色吧五月婷婷| xx人人xx| 99九九精品| 日日色五月天| 三级成人网站| 丁香六月av| 久久网日本| 狠狠色噜噜狠狠| 久久婷婷五月丁香蜜桃网| 99热精品在线播放| 亚洲视频一区| www.激情五月天.com| 色婷婷成人做爰A片免费看网站 | 五月激情婷婷开心五月| 操碰97| 久热超碰91| 超级碰碰碰久久网站| 99热这里是精品| 色婷婷香蕉| 26uuu精品一区二区| 丁香五月成人av| 欧美3AaAa大片| 人人天堂操| 日韩砖区| 色青五月天| 蜜臀九九九九| 久大香蕉| 中国丰满熟女A片免费观| 日日夜夜干| 91超级碰| 免费日本aⅴ中文字幕| 成人做爰A片免费看视频| 99精品在线观看| 六月色色| txt五月激情四射网综合俺也来了 五月天婷婷丁香人人操91 | 五月丁香久久| 国内精品免费一区二区2009| 色婷婷AV在线观看| 7777激情基地| 五月婷婷欲色| 香蕉操亚洲| 国产精品视频免费看| 97色女人在线| 激情都市另类| 色婷婷av在线| 婷婷基地五月色| 五月丁香拍拍激情综合| 99热都是精品| 亚洲综合激情五月久久| 亚洲免费av观看| 7777激情基地| 婷婷五月丁香在线视频| 亚洲成人免费电影| 粉嫩av蜜桃av蜜臀av| Av狠狠色丁香婷| 99re久热只有精品6在线直播| 第六色在线| 婷婷五月超碰| 中文字幕在线日亚洲9| 亚洲VA欧美VA| 日本WWW九九九| 五月婷婷性爱| 色五月婷婷AV| 26uuu激情五月天| 欧美人人草| 人妻aV在线| 丁香五月婷婷色| 日本97在线看片| 99热综合网| 3p日韩网站视频| 五月天啪啪啪| 亚洲日韩操B| 丁香五月手机在线| 日韩AAAAAAAAAAA片| 色情婷婷| 成人版视频在线观看| 九月婷婷久久| 婷婷久久色| 久久精品99国产精品日本| 五月综合激情| 偷拍99在线视频观看| 97人人操人人爽| 丁香五月综合亚洲| 双性美人被调教到喷水A片| 超碰9在| 丁香六月色香蕉视频| 51avj视频大全| 成人精品在线| 色色色色色热| 91精品在线看| 激情五月天的婷婷| 久狠狠狠| 五月天基地| 丁香六月婷婷高清| 久久久99精品免费观看| 激情婷婷五月女| 日本一级| 秋霞A V毛片| 五月婷婷六月天| 97色啪| 性爱久久| 激情网第九色| 狠狠干夜夜干| 色欲丁香| 丁香五月电影| 婷婷五月成人| 99性爱| 五月激情射| 五月丁香av在线| 色婷婷亚洲婷婷| 丁香激情六月天婷婷| 亚洲激情综合| 精品乱码久久久久| 天天日天天插天天操| 久久综合影院 | 五月婷婷香蕉| 开心五月激情| 成功精品影院| 五月婷婷无码专区| 日韩AV免费| www.99热这里精品| 五月激情在线| 五月黄色婷婷| 激情五月婷婷综合| 久久色五月天| 色色射| 久久久ww| 99热只有| 婷婷五月天亚洲精品| 国产又粗又大又爽又黄| 婷婷激情丁五月| 成人丁香婷婷| 色5月婷婷| 中文字幕无码人妻少妇免费视频 | 激情图片亚洲| 婷婷干| 丁香欧美| 色五月婷婷激情基地| 狠狠色噜噜狠狠狠狠综合| 色婷婷丁香五月天在线观看| 激情骚五月| 久久人人九九| 少妇人妻人伦A片| 99在线免费观看| 国产操逼网站| 五月婷婷之综合激情| 婷婷五月综激情| 婷婷久久免费| 久久精品爱爱| 潮汕成人AV片在线| 99热6精品| 狠狠干2007| 色色婷婷综合| 婷婷久热| 人人人va亚洲视频在线| 五月丁香无码| 人人爱人人摸人人澡| 丁香花综合永久入口| 色五月丁香五月天| 99热这里只有精品268| 亚洲国产精品VA在线看黑人| 久久久久9| 91九色精品熟女内射| 99色视频| 99干在线视频| 99热婷婷| 五月婷婷熟女| 综合色七七| 五月精品| 狠狠五月激情婷婷直播片| 五月丁香婷婷啪啪网| 九九色婷婷| 五月天自拍视频| www.久久色.com| 欧美性爱五月天| 男女久久婷婷五月天| 97爱综合| 中字幕视频在线永久在线观看免费 | 色婷婷精| 丁香激情五月天| 婷婷五月天成人小说| 国产成人av在线播放| 91日韩在线| 五月开心色| 色综合婷婷| 五月天大香蕉av| 色婷婷欧美| 五月丁香婷中文| 人妻激情视频| 超碰在线免费观看3 9| 色噜噜狠狠色综合网| 欧美亚洲999| 日韩 mm 不卡| 奇米影视777在线_在线观看午夜_h小视频在线观看_岛国大片 | 丁香六月婷婷激情综合| 黑人无码一区| 色婷婷精品视频在线播放| 日本狠狠色| 九九婷婷网五月天| 深爱五月日韩| 久久网址99热| www.91热久久| 精品九九久久| ztEJj| 日日夜夜干| 婷婷五月色色| 色欲影香| 人人澡玖玖一| 琪琪色五月天| 色色免费网站| 五月婷婷AV| 人人干99| 91碰碰| 九色色| 激情纯色婷婷五月天在线不卡视频| 色你久久| 91大神操美女| 99久久婷| 桃色Av色哟哟| 插插插色综合网| 久久婷婷激情五月天一区二区| 久久久婷婷色五月资源网| 丁香花社区av| 婷婷爱五月| 99色色色色| 色五月婷婷啪啪五月| 99热99思午夜精品| 99视频这里只有久久精品 | 国产视频色色色色色色色| 久久久激情视频| 99性爱| 六月婷婷中文字幕| 99热啪啪| 狠狠色色色| 野战J办公桌椅H| 韩日另类| 九月大香蕉| 97人人干。| 丁香色五月AV在线| 午夜丁香婷婷| 亚洲精品久久久无码| 日韩人妻无码专区| 中国女人内射6XXXXX| 五月天激情网站| 亚洲色无码A片一区二区麻豆| 色五月丁香五月五月婷婷| 丁香五月区| 青草青草久热这里只有精品| 五月丁香啪啪啪啪| 人人爽天天爽| 久久丁香| 99热8在线| 玖玖九九超碰| 激情综合啪啪| 婷婷五月视频| 亚洲六月婷婷| 色情激情五月婷婷| 99精品在线| 色97综合婷婷天天色| 狠狠穞A片一區二區三區| 99热主页日本| 五月色丁香综合| 桃色激情婷婷伊人网| 岛国资源网| 五月丁香人人婷婷在线观看| 色五月超碰| 亚洲激情四射| 一区操| 亚洲午夜电影| 色99色| 成人午夜天| 91色性感五月婷婷丁香| 91热99| 99色视频在线观看| 久草性爱| 99热黄| 国产五月天婷婷| 久久久网站| 丁香五月天五码婷婷| 亚洲国产99| www夜夜| 99综合色色色| 97丁香五月天| WWW久久久| www.ywav| www。五月天。com| 啪啪一区| 三级毛片7979| 99日韩网站| 日韩色色视频| 1024久婷| www,五月丁,com| 五月丁香美女视频| 另类五月激情| 思思久久99热只有频精品66| 99热99干| 婷婷五月综激情| 色色色激情网| 久久五月天激情视频| 国产精品成人AV在线| 曰韩五月丁香色婷婷无码| 婷婷九月色| 欧美丁香婷婷五月天| 福利视频在线播放| 同性gv国产精品一区二区| 九九AV在线| 婷婷五月激情综合啪啪| 婷婷色爱| 日韩有码一区| 天天做天天爱综合| 日日操夜夜操不卡| 人妻VideOssS人妻高清| 久久婷婷免费| 懂色AⅤ| 麻豆AV一区二区三区| 激情丁香五月激情婷婷| 亚洲久久激情| 大香蕉婷婷五月| 亚洲激情网站| 丁香五月婷婷国产在线| 思思久日精品视频| 五月天婷婷激情六月久久| 先锋资源996| 日韩一级片| 大香蕉久久| 99视频久久| 色五月超碰| 97性视频| 久久久网站| 色婷婷综合久久久久| 五月婷婷|欧美| 婷婷亚洲综合| 久久99婷婷| 欧美99热| 婷婷五月激情六月丁香| 香蕉久久国产AV一区二区| 五月婷婷激情综合| 色99欧洲色19| 淫水导航| 五月婷婷黄色毛片| 激情九色| 天天综合网、天天综合色 | 五月婷婷中文网| 亚洲成av人影院| 婷婷黄色五月天在线视频| 性色做爰片在线观看WW| www.五月天激情| 激情婷婷视频在线| AVDV久久| 亚洲免费99| 欧美三级大片AA在线看| 色99在线视频| 狠狠色丁婷婷日日,伊人激情综合网 | 都市激情五月婷婷综合| 丁香六月欧美| 这里只有精品免费视频| 天堂婷婷丁香六月网| 伊人狼人干| 五月天婷婷激情| 欧美色宗和激情| 九九99视频精品| 91夫妻视频| 深爱激情网五月天| 色婷婷97| 色天使久久综合| 丁香五月偷拍| 无码G高清天| 9999热精品| 亚洲综合在线播放| 丁香伊人综合| 九九色欲网| 伊人激情AV一区二区三区| 小视频一区| 99碰| 色婷网站| 五月婷婷色五月| 九九草热在线观看| 99热网址| 性爱111111| 五月天丁香成人| 狠色狠色狠狠色综合网| 玖玖婷婷视频| 日本V在线观看不卡视频网站| 亚洲综合99| 深爱女色婷婷丁香五月亚洲图区| 七月激情六月婷婷综合在线播放| 色天天综合成人网| 色综合婷婷| 久久婷婷五月丁香蜜桃网| 天天日天天爽| 97丁香五月| 激情综合啪啪啪| 丁香六月成人网| 狠狠干,狠狠操| 桃色五月天| www.夜夜夜| 久久WW| 色五月,com| 丁香婷婷啪啪| www.天天干| 色丁香在线视频| 日韩影院三级| 中文字幕AV在线播放| 激情婷婷五月基地| 99热这里只有精品23| 色婷婷久久| 99九九视频精彩在线| 久久婷婷一级片| 亚洲天堂久久| 日日干夜夜干| 99热8| 日日夜夜天天| 五月丁香偷拍| 色五月婷婷九月| www.色擼擼.com| 99久久婷婷国产综合精品| 思思热在线视频精品| 啪啪 综合网| 欧美25p| 激情五月丁香六月婷婷| 婷婷激情六月天视频| 五月激情精品视频| 春色激情第四色| 色噜噜狠狠色综| 五月丁香六月色| 亚洲综合视频八| 狠狠久久婷五月综合色| 五月天婷婷丁香成人网| 91夫妻网站九色| 少妇伦子伦精品无吗| 午夜大香蕉| 91啪啪视频| 高清无码网址| 99在线精品免费视频| 色色色五月婷婷| AA丁香综合激情| 26uuu欧美| 国产精品成人在线| 精品亚洲国产成AV人片传媒| 婷婷丁香无码专区| 五月狠狠| 一级黄色影片| 大学生高潮无套内谢视频| 夜夜天天久久婷婷| 色婷婷狠狠| 五月丁香久久网| 久久久久久久久99精品| 久久激情五月婷婷| 成人做爰A片免费看视频| 99热在线播放| 色综合99色| 久久一级免费黄色片| 久久日韩婷婷五月| 丁香激情久久| 日本色婷婷综合| 开心五月深爱五月婷| 99视频这里只有久久精品| 99色免费视频| 97超碰人人操| 亚洲欧洲中文日韩久久AV乱码| 色色色综合网| 久久综合9| 色哟哟性爱av| 婷婷亚洲激情在线观看视频 | 色九月国产| 色综合区| www.色擼擼.com| 综合激情sV| 超碰在线人妻| 五月婷婷九月婷婷九月婷婷| 99福利导航| 五月丁香婷婷成人网| 五月网站| 97干在线观看视频| 亚洲综合丁香五月| 狼友超碰| 4438亚洲欧美| 婷婷97碰碰| 国产裸舞福利资源在线视频| 亚洲色网络| 狠狠色丁香| 99久久超级| 婷婷综合色| 久久这里只有精品网| 天天爽天天干| 2025神马午夜福利| 99热超碰在线| 这里只有精品久久| W色综合| 久艹大香蕉| 五月天自拍网| 色婷五月| 日韩美女羞羞网站在线观看| 色国产五月| 青青草轻轻操| 丁香五月激情啪啪啪啪| 国产精品激情AV久久久青桔| 国产精品视频免费看| 五月色无码| 狠狠色噜噜狠狠狠狠综合| 九月丁香八月婷婷加勒比| 激情99热| 五月天亚洲综合网| 电影91久久久| 99超在线| 99久久激情视频| 精品导航在线x不卡| 在线五月色播| 亚洲激情久久| 丁香六月啪| 99久热这里只有精品| 双性美人被调教到喷水A片| 色色色干| 青青草轻轻操| 久草丁香婷婷五月天婷| 天干夜夜操| 激情色五月天| 丁香五月天欧美在线| 色婷婷丁香五月| 男人天堂99| 五月天国产| 日本三级第一页| 婷婷综合五月激情| 欧洲色| 日本69日人视频| 激情综合网五月天| 视频一二区| 婷婷综合伊人| 欧美xx激情视频在线观看| www.色五月| 97涩涩丁香五月天| 久久综合99综合| 久婷婷五月激情| 色噜噜狠狠色综合日日| 婷婷久久五月天| 国产午夜一区二区三区| 久久综合无| 婷婷五月无码| 这里精品| 丁香五月婷婷激情蜜桃| 99免费视频精品| 成人在线视频网| 天天摸.天天mo| 五月丁香啪啪网| 久久99网站| 丁香色色网| 亚洲精品国产成人AV在线| www.99婷婷| 婷婷五月花| 能直接看的av网站| 亚洲欧洲色色| 老师的粉嫩小又紧水又多A片视频 粉嫩AV久久一区二区三区 | 亚洲综合激情五月久久| 丁香六月婷婷色XXXXX| 五月天色色网站| 9九九久久精品无码专区| 夜夜躁狠狠| 欧美日韩成卜| 婷婷激情五月天激情| 天啪色| 九九精品亚洲| 久热无码| 少妇人妻偷人精品无码视频新浪| 亚洲婷婷成人五月天| 羞羞嫩草视频| 久9无码视频| 婷婷激情综合网| 日本久久精品| 99re思思热久久| 久综合色| 99精品视频在线观看| 五月精品免费XXX| 9热久久| 97碰啪啪| 丁香五月天欧美在线| 丁香五月天社区婷婷| 色碰碰| WWW丁香五月| Www.久久| 岛国AV网| 婷婷五月中文在线视频| 亚洲1区| 伊人九九68| 无码区婷婷五月花开| 99人这里只有精品| 五月婷婷六月综合| 国产精品18久久久| 久久婷婷亚洲| 五月天激情婷婷丁香| 日日操天天操| 六月丁香激情网| www.激情.com.| 色碰97| 婷婷色五月天在线| 啪啪六月婷婷| 天天色天天爱天天舔| www.com任你艹| 嫩草AV久久伊人妇女超级A| 99精品色| 亚洲五月天狠狠| 噜噜噜狠狠色综| 色在线免费观看| 婷婷视频网| 九九大香视频| 深爱婷婷丁香五月激情| 五丁香激情综合| 五月婷婷熟女| 91丁香婷婷综合资源| 99热精品在线观看| 丁香五月婷婷色| www.minyis.com【JT】实力收量可预付QQ2101460746 | 五月综合色播播丁香婷婷| 中文字幕成人| 五月婷婷丁香大陆免费| 97人人操人人拍| 99这里都是精品| 黄网免费观看| 天天干电影| 99这里只有精彩视频| 久久五月丁香伊人青草| 99九九久久| 五月婷婷色影院| 婷婷六月花| 天天干,噜噜色,狠狠色| 色婷婷五月天天天天天| 丁香婷婷五月激情| 五月丁香激情综合啪啪| 日韩美女在线视频19| 五月伊人91| 一本大道嫩草AV无码专区| 欧美激情综合| 婷婷金品综合视频| 91精品综合久久久久久五月丁香| 激情av在线| 久久久这里有精品| 俺去也五月天| 99综合网| 亚洲网站999| 激情五月天综合网| 婷婷五月在线视频| 久久性刺激| 丁香五月综合久久综合| 日韩欧美一道四区中文字幕| 婷婷内射视频在线| 亚洲综合视频网| 日本婷久久| 色你久久| 日本色频| ri电影在线| 五月丁香WWW| 天天综合天天做天天综合| 丁香五月婷婷成人综合| 99精品7| 色人妻五月| 伊人久久丁香婷婷六月五月综合| A网在线欧洲| 大伊久久| 六月婷婷久久| 婷婷激情性爱| 操笔无码| 五月天另类小说久久小说网| 丁香五月在线视频黑人| 伊人久久五月天综合| 久久人妻伦理| 久久综合婷婷五月| 九九碰九九爱97超碰| 欧美99热| 婷婷丁香五月在线观看91| 久久人视频| 狠狠人妻色综合| 天天插天天狠| 国产日日操夜夜操的肉棒视频| 婷婷五月天狠狠搞干| 91久久九久久九久久九久久九久久 | 亚洲精品V天堂中文字幕| 丁香情色五月| 午夜丁香综合婷婷| 26uuu四色| 五月成人综合| 亚洲永久四色| 99干免费视频| 亚洲啪视频| 99在线视频在线观看| 六月综合婷婷开心伊人| 六月激情综合| 久99久视频精选| 五月婷久久| 久久久婷丁香五月| 人人干99| 狠狠狠狠狠草| 五月色色色| 日韩成人不卡| 另类专区在线| 五月天婷婷丁香社区| 亚洲激情在线| 亚洲综合欧美色丁香婷婷888月图片| 久久多色| 丁香五月婷婷激情中文| 五月天激情电影| 99精品综合在线| 久久久久久久综合狠狠综合| 丰满熟女人妻一区二区三| 久久婷婷综合五月天| 久久密臀婷婷| tingtingjiqingwuyue| 天天婷婷| 影音先锋美国A| 婷婷午夜激情| 色综合色色色| 九九热青草| 日本综合久久| 日本色爽| 99婷婷综合| 色色色视频免费无码| 五月丁香在线| 在线播放成人| 思思re视频在线| 99色视频在线| 另类激情五月| 偷拍五月丁香| 婷婷九月丁香中文| 99re思思热这里| 综合网五月| 五月婷婷影| 99精品女人天堂| 69激情小说| 99色综合| 激情五月天婷婷激情| 91人操| 激情av网| 九九色综合视频| 97超碰,人人舔,人人操,人人摸| 丁香九月综合| 色情五月丁香| 亚洲午夜视频| 欧美丁香五月夫妻天| 丁香婷婷影院| 9999色色色色| 欧美成人精品A片免费一区99| 激情九月综合| 91狠狠综合久久久| 欧美熟女99| 五月丁香无码| 丁香花色色网| 99热亚洲精品| 99激情网| 亚洲综合色网| 人人爱天天摸摸天天爱| 亚洲经典三级| 六月婷婷狠狠做| 大伊香蕉精品视频在线| 秋霞电影理论| Av狠狠色丁香婷| 激情丁香五月婷婷啪啪| 拍色综合| 亚洲另类视频| 99在线视频女女视频| 激情五月天偷拍综合网| AAA久久久AAA久久久AAA| 波多野结衣AV无码Porn| 五月天另类激情在线| 四色永久成人网站| 亚洲色五月| 色婷婷丁香五月天激情综合网| 婷婷91视频| 婷婷丁香人妻天天久久| 青青草Avb在线| 久热91精品| 九九色逼| 开心五月色婷婷综合开心网| 婷婷五月综合激情小说| 婷婷97C| 激情噜噜噜| 色婷网| www.激情| 99热在线观看精品免费| 色99免费视频中文| 少妇高潮一区二区三区99欧美| 99爱视频精品在线观看| 三人荫蒂添的好舒服A片| 激情久久综合网| 金品在线视频99| 亚洲精品99| 天天婷婷天天| 久久婷婷色综合老司机| 婷婷在线免费| 欧美另类五月激情| 亚洲av无码精品色午夜| 思思热这里只有精品| 久热a| 99WWW免费视频| 91久久久久久久| 丁香五月精品| 亚洲最大在线| 精品一二三区久久AAA片| 色亚洲欧洲| 婷婷综合在线| 色爱爱综合网| 日韩视频99| 色播五月丁香| 思思热久久阴99| 五月色丁香婷婷综合| 性色五月天| 色色色色色色色色综合网| 狠狠操狠狠爱| se色婷婷视频| 成人电影AV在线观看| 久热无码| 91操黄| 伊人久久大香线蕉av最新| 操笔无码| 日本高清久| 久久婷婷青青草| 九九色99| 日本久久爱| www色婷婷久久综合久色| 欧美性交一区二区三区| 中字幕视频在线永久在线观看免费| 狠狠狠狠狠狠| 五月婷婷深爱六月| 99热99在线| 婷婷丁香五月色偷偷| 河北真实伦对白精彩脏话| 丁香五月婷婷色情综合| 九九热这里只有精品在线观看| 深爱婷婷基地| 亚洲无码成人| 亚洲婷婷综合视频| 日本黄色一级| 久久婷婷色| 激情综合在线观看| 五月激情综合美女久久| 99热这里只有精品23| 五月婷视频久久| 久青操| www.九月婷婷丁香.com| 九九九激情综合| 五月丁香啪| 日本色天堂| 婷婷久久色| 无码 色| 五月天狠狠干| 婷婷五月天伦理| 丁香亭亭久久| 色婷婷成人| 超碰超碰在线| 伊人婷婷五月天av| 9热在线视频| 五月激情婷婷四射| 黄色片avv| 91无码色色| 97在线观看| 国产亚洲精品AAAA片APP| 色婷婷丁香| 丁香五月欧美| 亚洲综合99| 婷婷综合五月| 婷婷激情五月| 五月丁香影院| 色欲天天综合网| 激情婷婷五月天| 性爱视频久久| 超碰人人在线| 少妇高潮呻吟A片免费看软件| 婷婷中文字幕| 亚洲第一综合| 粉嫩AV久久一区二区三区| 欧美日韩成人在线| 色999五月色| 久久这里都是精品| 亚洲激情AV| 思思热在线播放| 99啪啪视频| 99色网站| 99热首页| 婷婷五月天福利| 日日做A爰片久久毛片A片英语| 亚洲中文字幕在线观看| 91|疯狂丨高潮丨对白| av免费在线看不卡无毒| 日本97人人| 久婷婷五月综合欧美| 人人操AV| 五月天色婷伊人| 99er在线观看| 五月丁香天堂网| 日韩五月丁香| 色婷婷亚洲| 99精品在线| 丁香五月天大香蕉啪啪| 色射7856五月天激情四射| 啪啪黄页网| 丁香五月天色综合| 好激情在线综合网| 久久这里只有精品热在99| 色综合综合色| 日韩AV免费看| 一操久久| 激情文学 综合 色| 思思热久久婷婷五月天| 成人免费高清在线播放| 五月色网| 九一九九黄色| 九九九色综合| 欧美另类五月激情| 婷婷五月天激情五月天| 婷婷五月花| 久久婷婷五月天| 色色综合网。| 超碰99热| 丁香婷婷六月激情综合| 激情五月综合网| 亚洲激情久久| 真实熟女-91九色| 国产免费一区二区三区三州老师F1F1.CC| 啊V视频在线观看| 婷婷免费无视频| 日本一级一片免费视频| 欧美私人家庭影院| 欧美图片丁香五月天| 色婷婷五月天天天天天天天天天| 九九在线精品| 亚洲欧洲中文日韩久久AV乱码| 丁香狠狠操| 综合五月丁香久久| 丁香五月天电影| AA片在线观看视频在线播放| 99狠狠操一| 九九一综合精品| 91爱操| 五月婷婷久久网| 99这里只有精品视频免费| 六月婷婷久久大全| 天天爽夜夜操| 99热免费精品| 婷婷五月天狠狠搞干| 丁香五月婷婷在线| 91热网址| 五月丁香六月婷婷亚洲视频| 开心激情综合| 人人操女人| 久热这里只有精品在线| 中文字幕成人| 久99久视频| 五月天com| 婷婷久久色五月婷婷久久久| 久久婷婷六月天| 婷婷涩涩五月天| 五月色婷婷夜色| 丁香激情六月天婷婷| 天天精品视频免费观看| 日本女人久久| 九九热99热| ztEJj| 亚洲五月丁| 九九久久99| 久操干| 人人爽人人爽人人爽人人爽| 色色综合激情| 91在线观看www| 天天檫天天爽| 青草视频在线播放| 婷婷丁香高潮了| 色五月激情五月开心五月| 中美日韩成人在线| 少妇性按摩无码中文A片| 97丁香视频| 婷婷五月天成人网站| 99婷婷狠狠成为人免费视频| 免费精品66| 东京热免费视频| 99操99| 亚洲成人免费电影| 五月天丁香综合| 99色中文| 丁香激情网| 亚洲综合久| 日本色婷婷| 丁香色婷婷| 97人人射| 色综合五月| 激情五月深爱五月| 99热91| 五月丁香六月婷婷综合免| 亚洲高清在线| 一个色的综合| 天天久综合网永久入口18| 日日夜夜噜噜爽爽| 成人婷婷色综合| 激情五月婷婷伊人| AA片在线观看视频在线播放| 五月亚洲激情| 亚洲成人在线观看av| 五月婷综合网| 丁香六月婷婷社区| 九九大香蕉黄色影院| 超碰九九热| 欧美色婷婷| 五月婷庭丁香在线| 啪啪日本欧美| 五月丁香六月欧美综合网站| 2016日日夜夜操| AA丁香综合激情| 婷婷成人综合免费视频| 亚洲激情四射色| 天天干天天干天天干天天干天| 成人AV网站在线| 久久三级视频| 插插插色综合网| 色亭亭九月| 五月 成人 婷婷| 色色热99| 久久大国产香蕉| 亚洲中文乱字字幕在线永久| 九九久久五月天| 高清一区二区三区日本久| 激情九九这里只有精品| 激情图片99| 久久久久9| 亚洲性爱区无码区| 婷婷免费无马| 成人做爰高潮A片免费视频| 人人草人人视| WWW.99热| 黄色国久久| 色色色热| 丁香五月 综合| 青青久久五月| 伊人五月婷婷| 日韩av干| 亚洲一区国产传媒| 天天干,天天日| 久久五月天婷婷| 五月丁香六月婷婷,婷| 九九色网| 丁香五月天激情视频| 天天色天天爱天天爽| www.五月丁香| 五月婷丁香| 99热97| 婷婷六月丁香在线| ai97re99一本| 久久综合爱| 久热这里只有精品99re,久热这里只有精品7 | 久久这里精彩免费在线观看| 五月婷婷亚洲天堂97色婷婷| 91久久| 色国产五月| 久久婷婷丁香| 伊人九热| 另类专区在线观看| 思思热99热| 亚洲综合五月天综合| 999婷婷综合| 99久久婷婷综合| 大香蕉综合网| 色域五月婷婷丁香| 婷婷精品性性性性性性性| 丁香五月天激情网址| 五月丁香婷婷激情四射迷人| 国产看真人毛片爱做A片| aa久久| 99这里只有| 美女天天久久| www.99热在线观看| 久久九九99.www| 99热官网| 色婷婷操逼| 六月丁香VA| 丁香五月 六月婷婷首页| 综合亚洲六月婷婷在线| 五月丁香婷婷成人版| 婷婷五月丁香性爱| http:色情日本com| 五月天激情网图片| 色播六月| 色婷婷丁香五月在线观看| 影音先锋 91工厂| 亚洲色婷婷色| 精品久久99| 婷婷色色五月| 日本99视频| 色婷婷手机在线| 激情视频婷婷五月花| 久久新地址| 成人在线精品| 丁香六月婷婷久久综合| 久久五月丁香| 五月天狠狠网站| 婷婷激情丁香五月婷婷激情丁香五月婷婷 | 综合丁香婷婷五月天| 色色色地址| 9999热在线免费观看| 欧美啪啪五月天| 久久99jiu9| 七七久久综合| 超碰妻人人| 九月婷婷人人操人人舔人人爱| 丁香久久在线| 久久R激情| 激情五月黄色| 五月婷视频| 思思干精品| 天啪天啪天啪天啪| 丁香婷婷综合喷| 久久天堂色| 99丁香五月婷婷在线| 日本少妇AA一级特黄大片| 久久全色| 99九精品| 婷婷五月天网址| 国产精品成人AV在线| 婷婷成人综合| 玖玖在线视频| 小视频aaa久久久| 天天色伊人| 精品久久久久久久久久久久人妻| 久久婷婷婷婷伊人| 婷婷丁香五月亚洲免费| 婷婷五月天激情免费在线观看| 成人开心五月天| www.婷婷,com| 九九热九九| www.婷婷| 婷婷伊人五月天| 亚洲欧美日韩另类| 99视频网址| 五月天激情国产综合婷婷婷就去爱| 五月天伊人av| 六月天丁婷婷| 激情综合网五月激情| 99re这里只有| 五月丁香无码| 天天插天天射| 欧美性色A片免费免费观看的| 五月天激情婷婷| 夜色热久| 人人操人| 大香蕉九操| 热的国产,热的综合,热的有码| 天天夜夜六月丁香五月婷婷老师| 亚洲六月婷婷| 79精品视频在线观看,| 97丨九色丨国产丨PORNY| 久久婷婷五| 极品色丁香| 丁香五月在线观看完整版| 五月天丁香婷婷社区| 九九综合| 丁香av网| 九九热黄色| 欧爱综合视频| www.婷婷,com| 国产精品涩涩涩视频网站| 91大神在线免费看视频全集男男一起操| 91人妻人人操人人爽| 亚洲五月六丁香激情| 天天天综合网| 五月婷婷激情网| 久久全色| 久久久久久久丁香五月天婷婷| 五月激情偷拍婷婷| 婷婷久久精品| 欧美成人精品A片免费一区99| 综合激情sV| 狠狠人人| 婷婷午夜综合| 精品二区| 欧美日韩91| 人人草人| 99热.com| 五月丁香狠狠爱婷婷综合| 9热在线视频| 五月激情丁香五月| av中文网站| 五月婷婷开心网| 婷婷爱五月| 欧美亚洲婷婷五月| 99视频精品在线| 99视频91| 久久99热精品a片在线观看| 超碰在线观看99| 亚洲a片免费观看| 色五月在线| 亭亭色网| 久久性刺激| 丁香五月23111| 婷婷久久五月天| 久色88| 99热视精品| 综合网色| 亚洲AV综合在线观看| 五月婷婷丁香色播网| CHINESE熟女老女人HD视频| 久久色五月| 丁香桃色网| 天天激情站| 色播播之激情五月婷婷| 97干在线| www激情网站| 丁香五月开心五月激情| 蜜桃成语时李时珍 免费| 久久99免费视屏| 第四色五月婷婷| 色五月综合婷婷| 国产毛片精品一区二区色欲黄A片| 日韩精品999| 国产毛片精品一区二区色欲黄A片| 97操碰人免费| 亚洲久久婷婷| 99久久户外勾搭| 狠狠色婷婷丁香六月| 久久亚洲婷婷| 看黄的网站18禁| 五月婷av| 欧美内射AA| 激情综合五月| 一区二区你懂的| 美国天天操无码| 色五月在线播放|