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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

基于Android的ELF PLT/GOT符号重定向过程及ELF Hook实现(by 低端码农 2014.10.27)

發布時間:2025/3/15 Android 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于Android的ELF PLT/GOT符号重定向过程及ELF Hook实现(by 低端码农 2014.10.27) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄(?)[-]

  • 引言
  • 準備
  • 符號重定向
  • 例子
  • 全局函數指針調用外部函數
  • 局部函數指針調用外部函數
  • 直接調用外部函數
  • 總結
  • 基于執行視圖解析ELF
  • ELF Hook
  • GitHup地址

  • 引言

    寫這篇技術文的原因,主要有兩個:

    • 其一是發現網上大部分描述PLT/GOT符號重定向過程的文章都是針對x86的,比如《Redirecting functions in shared ELF libraries》就寫得非常不錯。雖然其過程跟ARM非常類似,但由于CPU體系不同,指令實現差異非常大;
    • 其二是網上大部分關于ELF文件格式的介紹,都是基于鏈接視圖(Linking View),鏈接視圖是基于節(Section)對ELF進行解析的。然而動態鏈接庫在加載的過程中,linker只關注ELF中的段(Segment)信息。因此ELF中的節信息被完全篡改或者甚至刪除掉,并不會影響linker的加載過程,這樣做可以防止靜態分析工具(比如IDA,readelf等)對其進行分析,一般加過殼的ELF文件都會有這方面的處理。對于這種ELF文件,如果要實現hook功能,則必須要基于執行視圖(Execution View)進行符號解析;

    準備

    在往下閱讀之前,請先確保對ELF文件格式和ARM匯編有個大概了解,參考指引:

    • ELF 文件格式分析;
    • ARM文檔;

    準備工具:

    • readelf(NDK包含)
    • objdump(NDK包含)
    • IDA Pro 6.4或以上
    • Android真機或者模擬器

    符號重定向

    在ARM上,常見的重定向類型,主要有三種,分別是R_ARM_JUMP_SLOTR_ARM_ABS32R_ARM_GLOB_DAT,而我們要hook elf函數,則需要同時處理好這三種重定向類型。

    例子

    先看示例代碼

    [cpp] view plain copy
  • typedef?int?(*strlen_fun)(const?char?*);??
  • strlen_fun?global_strlen1?=?(strlen_fun)strlen;??
  • strlen_fun?global_strlen2?=?(strlen_fun)strlen;??
  • ??
  • #define?SHOW(x)?LOGI("%s?is?%d",?#x,?x)??
  • ??
  • extern?"C"?jint?Java_com_example_allhookinone_HookUtils_elfhook(JNIEnv?*env,?jobject?thiz){??
  • ????const?char?*str?=?"helloworld";??
  • ??
  • ????strlen_fun?local_strlen1?=?(strlen_fun)strlen;??
  • ????strlen_fun?local_strlen2?=?(strlen_fun)strlen;??
  • ??
  • ????int?len0?=?global_strlen1(str);??
  • ????int?len1?=?global_strlen2(str);??
  • ????int?len2?=?local_strlen1(str);??
  • ????int?len3?=?local_strlen2(str);??
  • ????int?len4?=?strlen(str);??
  • ????int?len5?=?strlen(str);??
  • ??
  • ????SHOW(len0);??
  • ????SHOW(len1);??
  • ????SHOW(len2);??
  • ????SHOW(len3);??
  • ????SHOW(len4);??
  • ????SHOW(len5);??
  • ??
  • ????return?0;??
  • }??


  • 這段代碼分別以三種不同的方式調用strlen,分別是全局函數指針、局部函數指針以及直接調用,下而我們針對這個例子,分別對三種調用分析進行分析。

    先通過readelf,我們查看一下重定向表,如下所示:

    [plain] view plain copy
  • Relocation?section?'.rel.dyn'?at?offset?0x2a48?contains?17?entries:??
  • ?Offset?????Info????Type????????????Sym.Value??Sym.?Name??
  • 0000ade0??00000017?R_ARM_RELATIVE?????
  • 0000af00??00000017?R_ARM_RELATIVE?????
  • 0000af0c??00000017?R_ARM_RELATIVE?????
  • 0000af10??00000017?R_ARM_RELATIVE?????
  • 0000af18??00000017?R_ARM_RELATIVE?????
  • 0000af1c??00000017?R_ARM_RELATIVE?????
  • 0000af20??00000017?R_ARM_RELATIVE?????
  • 0000af24??00000017?R_ARM_RELATIVE?????
  • 0000af28??00000017?R_ARM_RELATIVE?????
  • 0000af30??00000017?R_ARM_RELATIVE?????
  • 0000aefc??00003215?R_ARM_GLOB_DAT????00000000???__stack_chk_guard??
  • 0000af04??00003715?R_ARM_GLOB_DAT????00000000???__page_size??
  • 0000af08??00004e15?R_ARM_GLOB_DAT????00000000???strlen??
  • 0000b004??00004e02?R_ARM_ABS32???????00000000???strlen??
  • 0000b008??00004e02?R_ARM_ABS32???????00000000???strlen??
  • 0000af14??00006615?R_ARM_GLOB_DAT????00000000???__gnu_Unwind_Find_exid??
  • 0000af2c??00007415?R_ARM_GLOB_DAT????00000000???__cxa_call_unexpected??
  • ??
  • ...??
  • ...??
  • ??
  • Relocation?section?'.rel.plt'?at?offset?0x2ad0?contains?48?entries:??
  • ?Offset?????Info????Type????????????Sym.Value??Sym.?Name??
  • 0000af40??00000216?R_ARM_JUMP_SLOT???00000000???__cxa_atexit??
  • 0000af44??00000116?R_ARM_JUMP_SLOT???00000000???__cxa_finalize??
  • 0000af48??00001716?R_ARM_JUMP_SLOT???00000000???memcpy??
  • ...??
  • 0000afd4??00004c16?R_ARM_JUMP_SLOT???00000000???fgets??
  • 0000afd8??00004d16?R_ARM_JUMP_SLOT???00000000???fclose??
  • 0000afdc??00004e16?R_ARM_JUMP_SLOT???00000000???strlen??
  • 0000afe0??00004f16?R_ARM_JUMP_SLOT???00000000???strncmp??
  • ...??
  • ...??


  • 在.rel.plt和.rel.dyn兩個section中,我們發現一共出現了4個strlen,我們先把它們的關鍵信息記錄下來,后面分析會非常有用。它們分別是

    .rel.dyn 0000AF08 R_ARM_GLOB_DAT

    .rel.dyn 0000B004 R_ARM_ABS32.rel.dyn 0000B008 R_ARM_ABS32.rel.plt 0000AFDC R_ARM_JUMP_SLOT

    在代碼中,我們一共調用了6次strlen,但為什么只出現了4次呢?另外,它們之間又是如何對應的呢,帶著這些問題去分析匯編代碼。把編譯出來的so拖到IDA,我們看到示例代碼的指令:

    [plain] view plain copy
  • .text:000050BC?????????????????EXPORT?Java_com_example_allhookinone_HookUtils_elfhook??
  • .text:000050BC?Java_com_example_allhookinone_HookUtils_elfhook??
  • .text:000050BC??
  • .text:000050BC?var_40??????????=?-0x40??
  • .text:000050BC?var_38??????????=?-0x38??
  • .text:000050BC?var_34??????????=?-0x34??
  • .text:000050BC?s???????????????=?-0x2C??
  • .text:000050BC?var_28??????????=?-0x28??
  • .text:000050BC?var_24??????????=?-0x24??
  • .text:000050BC?var_20??????????=?-0x20??
  • .text:000050BC?var_1C??????????=?-0x1C??
  • .text:000050BC?var_18??????????=?-0x18??
  • .text:000050BC?var_14??????????=?-0x14??
  • .text:000050BC?var_10??????????=?-0x10??
  • .text:000050BC?var_C???????????=?-0xC??
  • .text:000050BC??
  • .text:000050BC?????????????????PUSH????????????{R4,LR}??
  • .text:000050BE?????????????????SUB?????????????SP,?SP,?#0x38??
  • .text:000050C0?????????????????STR?????????????R0,?[SP,#0x40+var_34]??
  • .text:000050C2?????????????????STR?????????????R1,?[SP,#0x40+var_38]??
  • .text:000050C4?????????????????LDR?????????????R4,?=(_GLOBAL_OFFSET_TABLE_?-?0x50CA)??
  • .text:000050C6?????????????????ADD?????????????R4,?PC?;?_GLOBAL_OFFSET_TABLE_??
  • .text:000050C8?????????????????LDR?????????????R3,?=(aHelloworld?-?0x50CE)??
  • .text:000050CA?????????????????ADD?????????????R3,?PC??;?"helloworld"??
  • .text:000050CC?????????????????STR?????????????R3,?[SP,#0x40+s]??
  • .text:000050CE?????????????????LDR?????????????R3,?=(strlen_ptr?-?0xAF34)??
  • .text:000050D0?????????????????LDR?????????????R3,?[R4,R3]?;?__imp_strlen??
  • .text:000050D2?????????????????STR?????????????R3,?[SP,#0x40+var_28]??
  • .text:000050D4?????????????????LDR?????????????R3,?=(strlen_ptr?-?0xAF34)??
  • .text:000050D6?????????????????LDR?????????????R3,?[R4,R3]?;?__imp_strlen??
  • .text:000050D8?????????????????STR?????????????R3,?[SP,#0x40+var_24]??
  • .text:000050DA?????????????????LDR?????????????R3,?=(global_strlen1_ptr?-?0xAF34)??
  • .text:000050DC?????????????????LDR?????????????R3,?[R4,R3]?;?global_strlen1??
  • .text:000050DE?????????????????LDR?????????????R3,?[R3]??
  • .text:000050E0?????????????????LDR?????????????R2,?[SP,#0x40+s]??
  • .text:000050E2?????????????????MOVS????????????R0,?R2??
  • .text:000050E4?????????????????BLX?????????????R3??
  • .text:000050E6?????????????????MOVS????????????R3,?R0??
  • .text:000050E8?????????????????STR?????????????R3,?[SP,#0x40+var_20]??
  • .text:000050EA?????????????????LDR?????????????R3,?=(global_strlen2_ptr?-?0xAF34)??
  • .text:000050EC?????????????????LDR?????????????R3,?[R4,R3]?;?global_strlen2??
  • .text:000050EE?????????????????LDR?????????????R3,?[R3]??
  • .text:000050F0?????????????????LDR?????????????R2,?[SP,#0x40+s]??
  • .text:000050F2?????????????????MOVS????????????R0,?R2??
  • .text:000050F4?????????????????BLX?????????????R3??
  • .text:000050F6?????????????????MOVS????????????R3,?R0??
  • .text:000050F8?????????????????STR?????????????R3,?[SP,#0x40+var_1C]??
  • .text:000050FA?????????????????LDR?????????????R2,?[SP,#0x40+s]??
  • .text:000050FC?????????????????LDR?????????????R3,?[SP,#0x40+var_28]??
  • .text:000050FE?????????????????MOVS????????????R0,?R2??
  • .text:00005100?????????????????BLX?????????????R3??
  • .text:00005102?????????????????MOVS????????????R3,?R0??
  • .text:00005104?????????????????STR?????????????R3,?[SP,#0x40+var_18]??
  • .text:00005106?????????????????LDR?????????????R2,?[SP,#0x40+s]??
  • .text:00005108?????????????????LDR?????????????R3,?[SP,#0x40+var_24]??
  • .text:0000510A?????????????????MOVS????????????R0,?R2??
  • .text:0000510C?????????????????BLX?????????????R3??
  • .text:0000510E?????????????????MOVS????????????R3,?R0??
  • .text:00005110?????????????????STR?????????????R3,?[SP,#0x40+var_14]??
  • .text:00005112?????????????????LDR?????????????R3,?[SP,#0x40+s]??
  • .text:00005114?????????????????MOVS????????????R0,?R3??;?s??
  • .text:00005116?????????????????BLX?????????????strlen??
  • .text:0000511A?????????????????MOVS????????????R3,?R0??
  • .text:0000511C?????????????????STR?????????????R3,?[SP,#0x40+var_10]??
  • .text:0000511E?????????????????LDR?????????????R3,?[SP,#0x40+s]??
  • .text:00005120?????????????????MOVS????????????R0,?R3??;?s??
  • .text:00005122?????????????????BLX?????????????strlen??
  • .text:00005126?????????????????MOVS????????????R3,?R0??
  • ????...??
  • ????...??
  • .text:000051CA?????????????????ADD?????????????SP,?SP,?#0x38??
  • .text:000051CC?????????????????POP?????????????{R4,PC}??
  • .text:000051CC?;?End?of?function?Java_com_example_allhookinone_HookUtils_elfhook??


  • 先把幾個重要的地址找出來,它們分別是

    • GLOBAL_OFFSET_TABLE: 0x0000AF34
    • strlen_ptr: 0x0000AF08
    • __imp_strlen: 0x0000B0C8
    • global_strlen1_ptr: 0x0000AF0C
    • global_strlen1: 0x0000B004
    • global_strlen2_ptr: 0x0000AF10
    • global_strlen2: 0x0000B008

    全局函數指針調用外部函數

    global_strlen1和global_strlen2的調用,對應0x000050E4和0x000050F4兩處的BLX指令,通過計算最終R3的值分別是*global_strlen1和*global_strlen2,而global_strlen1和global_strlen2的值正好對應位于.rel.dyn的兩個R_ARM_ABS32的重定位項,因此我們得出結論:通過全局函數指針的方式調用外部函數,它的重定位類型是R_ARM_ABS32,并且位于.rel.dyn節區

    我們只分析global_strlen1的調用過程,首先定位到global_strlen1_ptr(0x0000AF0C),該地址位于.got節區,GLOBAL_OFFSET_TABLE的上方。然后再通過global_strlen1_ptr定位到0x0000B004(位于.data節區),最后再通過0x0000B004定位到最終的函數地址,因此R_ARM_ABS32重定位項的Offset指向最終調用函數地址的地址(也就是函數指針的指針),整個重定位過程是先位到.got,再從.got定位到.date。下面是.got段區的16進制表示片段:

    [plain] view plain copy
  • ...??
  • 0000AF0C??04?B0?00?00?08?B0?00?00??DC?B0?00?00?B4?87?00?00??
  • 0000AF1C??F4?84?00?00?60?5B?00?00??58?5B?00?00?50?5B?00?00??
  • 0000AF2C??EC?B0?00?00?FC?8C?00?00??00?00?00?00?00?00?00?00??
  • ...??
  • 0000B004??C8?B0?00?00?C8?B0?00?00???????????????????????????
  • 0000B014????????????????????????????????????????????????????
  • 0000B024??00?00?00?00?00?00?00?00??00?00?00?00?00?00?00?00??
  • ...??
  • 0000B0C8??00?00?00?00?00?00?00?00??00?00?00?00?00?00?00?00??
  • 0000B0D8??00?00?00?00?00?00?00?00??00?00?00?00?00?00?00?00??
  • ...??

  • 最后發現0x0000B0C8地址片的指令全為0,當動態鏈接時,linker會覆蓋0x0000B004地址的值,指向strlen的真正地址(而不是現在的0x0000B0C8,有點繞)。

    局部函數指針調用外部函數

    local_strlen1和local_strlen2的調用,對應0x00005100和0x0000510C兩處的BLX指令,通過計算最終R3的值都是*strlen_prt,即0x0000AF08,正好對應位于.rel.dyn中的R_ARM_GLOB_DAT重定位項,因此我們得出結論:通過局部函數指針方式調用外部函數,它的重定位類型是R_ARM_GLOB_DAT,并且位于.re.dyn節區

    我們只分析local_strlen1的調用過程,首先是定位到strlen_prt(0x0000AF08),該地址位于.got節區,GLOBAL_OFFSET_TABLE的上方,然后再通過strlen_prt,定位到0x0000B0C8,跟上面分析的結果居然一樣,因此R_ARM_GLOB_DAT的重定項Offset指向最終調用函數地址的地址(也就是函數指針的指針),下面是.got段區的16進制表示片段:

    [plain] view plain copy
  • 0000AF08??C8?B0?00?00?04?B0?00?00??08?B0?00?00?DC?B0?00?00??
  • 0000AF18??B4?87?00?00?F4?84?00?00??60?5B?00?00?58?5B?00?00??
  • 0000AF28??50?5B?00?00?EC?B0?00?00??FC?8C?00?00?00?00?00?00??
  • ...??
  • 0000B0C8??00?00?00?00?00?00?00?00??00?00?00?00?00?00?00?00??
  • 0000B0D8??00?00?00?00?00?00?00?00??00?00?00?00?00?00?00?00??
  • ...??
  • 需要注意的是,0x000050D8的指令“STR R3, [SP,#0x40+var_24]”,這里已經把函數的真實地址保存到堆棧了,因此哪怕我們修改了GOT表也不會影響堆棧的值,因此這種重定位類型無法通過修改地址進行hook

    直接調用外部函數

    最后看看strlen的直接調用,對應0x0000511A和0x00005122兩處的BLX指令,最后它們都指向.plt節區指令,如下所示:

    .plt:00002E38 ADR R12, 0x2E40 .plt:00002E3C ADD R12, R12, #0x8000 .plt:00002E40 LDR PC, [R12,#(strlen_ptr_0 - 0xAE40)]! ; __imp_strlen ... 0000AFDC C8 B0 00 00 CC B0 00 00 D0 B0 00 00 D4 B0 00 00 0000AFEC D8 B0 00 00 DC B0 00 00 E0 B0 00 00 E4 B0 00 00 0000AFFC E8 B0 00 00 00 00 00 00 C8 B0 00 00 C8 B0 00 00 ...

    最后,PC指向*strlen_ptr_0,即strlen_ptr_0的地址0x0000AFDC,該地址位于.got節區,而0x0000AFDC地址值的正好是0x0000B0C8,多么熟悉的身影。因此得到結論,直接調用外部函數,它的重定位類型是R_ARM_JUMP_SLOT,并且位于.re.plt節區,其Offset指向最終調用函數地址的地址(也就是函數指針的指針)。整個過程是先到.plt,再到.got,最后才定位到真正的函數地址。

    關于這部分的分析,發現IDA和objdump的反編譯結果有些差異,下面是通過objdump到的匯編指令:

    [plain] view plain copy
  • 00002e38?<strlen@plt>:??
  • ????2e38:???e28fc600????add?ip,?pc,?#0,?12??
  • ????2e3c:???e28cca08????add?ip,?ip,?#8,?20??;?0x8000??
  • ????2e40:???e5bcf19c????ldr?pc,?[ip,?#412]!?;?0x19c??
  • ...??
  • ...??
  • ????afd8:???00002c50????andeq???r2,?r0,?r0,?asr?ip??
  • ????afdc:???00002c50????andeq???r2,?r0,?r0,?asr?ip??
  • ????afe0:???00002c50????andeq???r2,?r0,?r0,?asr?ip??
  • ????afe4:???00002c50????andeq???r2,?r0,?r0,?asr?ip??
  • 見到afdc處的地址,指向的是0x00002c50,而0x00002c50正好是PLT[0],指令如下:

    [plain] view plain copy
  • 00002c50?<__cxa_atexit@plt-0x14>:??
  • ????2c50:???e52de004????push????{lr}????????;?(str?lr,?[sp,?#-4]!)??
  • ????2c54:???e59fe004????ldr?lr,?[pc,?#4]????;?2c60?<__cxa_atexit@plt-0x4>??
  • ????2c58:???e08fe00e????add?lr,?pc,?lr??
  • ????2c5c:???e5bef008????ldr?pc,?[lr,?#8]!??
  • ????2c60:???000082d4????ldrdeq??r8,?[r0],?-r4??
  • 執行2c5c處指令后,最終pc指向0x0000af3c,正好是GLOBAL_OFFSET_TABLE + 8,即GOT[2],我們看到0x0000af3c處:

    [plain] view plain copy
  • 0000AF3C??00?00?00?00?28?B0?00?00??24?B0?00?00?2C?B0?00?00??
  • 0000AF4C??30?B0?00?00?34?B0?00?00??38?B0?00?00?3C?B0?00?00??
  • 結果發現GOT[2]里指向的函數地址居然是0,這是因為android上的符號綁定并不支持lazy綁定,所以當so被加載時,linker會預先把GOT[n](n>=2)的所對應的函數都提前找出來,因此這里GOT[2]的代碼實際上不會被執行,因此在目前的Android上,并不存在完整的PLT/GOT鏈接過程。猜想這主要是出于穩定性考慮的。

    總結

    雖然IDA和obudump兩個工具反編譯得出的指令在PLT\GOT過程中有些差別,但對于Android而言,其實這個差異不會造成影響,因為Android上不支持lazy綁定。同時我們得出一個非常重要的結論:R_ARM_ABS32、R_ARM_GLOB_DAT和R_ARM_JUMP_SLOT的重定位項雖然在代碼中用法不一樣,但其offset都是指向一個函數的指針的指針,這個對于我們下面進行elfhook非常有用。

    基于執行視圖解析ELF

    《Redirecting functions in shared ELF libraries》這篇文章所提供的例子,就是基于鏈接視圖對ELF進行解析的,與基于執行視圖進行解析相比,后面的邏輯基本是一樣的,關鍵是要通過segment找到.dynsym、.dynstr、.rel.plt和rel.dyn,以及它們的項數。

    首次通過Program Header Table找到類型為PT_DYNAMIC的段,該的內容其實對應.dynamic,這段的內容對應Elf32_Dyn類型的數組,其結構體如下所示:

    [cpp] view plain copy
  • /*?Dynamic?structure?*/??
  • typedef?struct?{??
  • ????Elf32_Sword?d_tag;??????/*?controls?meaning?of?d_val?*/??
  • ????union?{??
  • ????????Elf32_Word??d_val;??/*?Multiple?meanings?-?see?d_tag?*/??
  • ????????Elf32_Addr??d_ptr;??/*?program?virtual?address?*/??
  • ????}?d_un;??
  • }?Elf32_Dyn;??


  • 通過遍歷這個數組,我們可以找到所有的需要的信息,我把它們的對應關系列出來:

    • DT_HASH -> .hash
    • DT_SYMTAB & DT_SYMENT -> .dynsym
    • DT_STRTAB & DT_STRSZ -> .dynstr
    • PLTREL(決定REL還是RELA) &(DT_REL | DT_RELA) & (DT_RELSZ | DT_RELASZ ) & (DT_RELENT | DT_RELAENT ) -> .rel.dyn
    • DT_JMPREL & DT_PLTRELSZ & (DT_RELENT | DT_RELAENT) -> .rel.plt
    • FINI_ARRAY & FINI_ARRAYSZ -> .fini_array
    • INIT_ARRAY & INIT_ARRAYSZ -> .init_array

    這是查找的相關代碼:

    [cpp] view plain copy
  • void?getElfInfoBySegmentView(ElfInfo?&info,?const?ElfHandle?*handle){??
  • ??
  • ????info.handle?=?handle;??
  • ????info.elf_base?=?(uint8_t?*)?handle->base;??
  • ????info.ehdr?=?reinterpret_cast<Elf32_Ehdr?*>(info.elf_base);??
  • ??
  • ????//?may?be?wrong??
  • ????info.shdr?=?reinterpret_cast<Elf32_Shdr?*>(info.elf_base?+?info.ehdr->e_shoff);??
  • ????info.phdr?=?reinterpret_cast<Elf32_Phdr?*>(info.elf_base?+?info.ehdr->e_phoff);??
  • ??
  • ????info.shstr?=?NULL;??
  • ??
  • ????Elf32_Phdr?*dynamic?=?NULL;??
  • ????Elf32_Word?size?=?0;??
  • ??
  • ????getSegmentInfo(info,?PT_DYNAMIC,?&dynamic,?&size,?&info.dyn);??
  • ????if(!dynamic){??
  • ????????LOGE("[-]?could't?find?PT_DYNAMIC?segment");??
  • ????????exit(-1);??
  • ????}??
  • ????info.dynsz?=?size?/?sizeof(Elf32_Dyn);??
  • ??
  • ????Elf32_Dyn?*dyn?=?info.dyn;??
  • ????for(int?i=0;?i<info.dynsz;?i++,?dyn++){??
  • ??
  • ????????switch(dyn->d_tag){??
  • ??
  • ????????case?DT_SYMTAB:??
  • ????????????info.sym?=?reinterpret_cast<Elf32_Sym?*>(info.elf_base?+?dyn->d_un.d_ptr);??
  • ????????????break;??
  • ??
  • ????????case?DT_STRTAB:??
  • ????????????info.symstr?=?reinterpret_cast<const?char?*>(info.elf_base?+?dyn->d_un.d_ptr);??
  • ????????????break;??
  • ??
  • ????????case?DT_REL:??
  • ????????????info.reldyn?=?reinterpret_cast<Elf32_Rel?*>(info.elf_base?+?dyn->d_un.d_ptr);??
  • ????????????break;??
  • ??
  • ????????case?DT_RELSZ:??
  • ????????????info.reldynsz?=?dyn->d_un.d_val?/?sizeof(Elf32_Rel);??
  • ????????????break;??
  • ??
  • ????????case?DT_JMPREL:??
  • ????????????info.relplt?=?reinterpret_cast<Elf32_Rel?*>(info.elf_base?+?dyn->d_un.d_ptr);??
  • ????????????break;??
  • ??
  • ????????case?DT_PLTRELSZ:??
  • ????????????info.relpltsz?=?dyn->d_un.d_val?/?sizeof(Elf32_Rel);??
  • ????????????break;??
  • ??
  • ????????case?DT_HASH:??
  • ????????????uint32_t?*rawdata?=?reinterpret_cast<uint32_t?*>(info.elf_base?+?dyn->d_un.d_ptr);??
  • ????????????info.nbucket?=?rawdata[0];??
  • ????????????info.nchain?=?rawdata[1];??
  • ????????????info.bucket?=?rawdata?+?2;??
  • ????????????info.chain?=?info.bucket?+?info.nbucket;??
  • ????????????break;??
  • ????????}??
  • ????}??
  • ??
  • ????//because?.dynsym?is?next?to?.dynstr,?so?we?can?caculate?the?symsz?simply??
  • ????info.symsz?=?((uint32_t)info.symstr?-?(uint32_t)info.sym)/sizeof(Elf32_Sym);??
  • }??


  • 然而,有一個值我無法通過通過PT_DYNAMIC段得到的,那就是.dynsym的項數,我最后通過變通的方法得到的。由于.dynsym和.dynstr兩個節區是相鄰的,因此它們兩個地址相減,即可得到的.dynsym總長度,再除了sizeof(Elf32_Sym)即可得到.dynsym的項數,如果你有更好的方法,請跟我說說。

    ELF Hook

    有了上面的介紹之后,寫個ELF Hook就很簡單的,我把關鍵代碼貼出來:

    [cpp] view plain copy
  • #define?R_ARM_ABS32?0x02??
  • #define?R_ARM_GLOB_DAT?0x15??
  • #define?R_ARM_JUMP_SLOT?0x16??
  • ??
  • int?elfHook(const?char?*soname,?const?char?*symbol,?void?*replace_func,?void?**old_func){??
  • ????assert(old_func);??
  • ????assert(replace_func);??
  • ????assert(symbol);??
  • ??
  • ????ElfHandle*?handle?=?openElfBySoname(soname);??
  • ????ElfInfo?info;??
  • ??
  • ????getElfInfoBySegmentView(info,?handle);??
  • ??
  • ????Elf32_Sym?*sym?=?NULL;??
  • ????int?symidx?=?0;??
  • ??
  • ????findSymByName(info,?symbol,?&sym,?&symidx);??
  • ??
  • ????if(!sym){??
  • ????????LOGE("[-]?Could?not?find?symbol?%s",?symbol);??
  • ????????goto?fails;??
  • ????}else{??
  • ????????LOGI("[+]?sym?%p,?symidx?%d.",?sym,?symidx);??
  • ????}??
  • ??
  • ????for?(int?i?=?0;?i?<?info.relpltsz;?i++)?{??
  • ????????Elf32_Rel&?rel?=?info.relplt[i];??
  • ????????if?(ELF32_R_SYM(rel.r_info)?==?symidx?&&?ELF32_R_TYPE(rel.r_info)?==?R_ARM_JUMP_SLOT)?{??
  • ??
  • ????????????void?*addr?=?(void?*)?(info.elf_base?+?rel.r_offset);??
  • ????????????if?(replaceFunc(addr,?replace_func,?old_func))??
  • ????????????????goto?fails;??
  • ??
  • ????????????//only?once??
  • ????????????break;??
  • ????????}??
  • ????}??
  • ??
  • ????for?(int?i?=?0;?i?<?info.reldynsz;?i++)?{??
  • ????????Elf32_Rel&?rel?=?info.reldyn[i];??
  • ????????if?(ELF32_R_SYM(rel.r_info)?==?symidx?&&??
  • ????????????????(ELF32_R_TYPE(rel.r_info)?==?R_ARM_ABS32??
  • ????????????????????????||?ELF32_R_TYPE(rel.r_info)?==?R_ARM_GLOB_DAT))?{??
  • ??
  • ????????????void?*addr??????????=?(void?*)?(info.elf_base?+?rel.r_offset);??
  • ????????????if?(replaceFunc(addr,?replace_func,?old_func))??
  • ????????????????goto?fails;??
  • ????????}??
  • ????}??
  • ??
  • ????fails:??
  • ????closeElfBySoname(handle);??
  • ????return?0;??
  • }??


  • 最后是測試的代碼:

    [cpp] view plain copy
  • typedef?int?(*strlen_fun)(const?char?*);??
  • strlen_fun?old_strlen?=?NULL;??
  • ??
  • size_t?my_strlen(const?char?*str){??
  • ????LOGI("strlen?was?called.");??
  • ????int?len?=?old_strlen(str);??
  • ????return?len?*?2;??
  • }??
  • ??
  • ??
  • strlen_fun?global_strlen1?=?(strlen_fun)strlen;??
  • strlen_fun?global_strlen2?=?(strlen_fun)strlen;??
  • ??
  • #define?SHOW(x)?LOGI("%s?is?%d",?#x,?x)??
  • ??
  • extern?"C"?jint?Java_com_example_allhookinone_HookUtils_elfhook(JNIEnv?*env,?jobject?thiz){??
  • ????const?char?*str?=?"helloworld";??
  • ??
  • ????strlen_fun?local_strlen1?=?(strlen_fun)strlen;??
  • ????strlen_fun?local_strlen2?=?(strlen_fun)strlen;??
  • ??
  • ????int?len0?=?global_strlen1(str);??
  • ????int?len1?=?global_strlen2(str);??
  • ????int?len2?=?local_strlen1(str);??
  • ????int?len3?=?local_strlen2(str);??
  • ????int?len4?=?strlen(str);??
  • ????int?len5?=?strlen(str);??
  • ??
  • ????LOGI("hook?before:");??
  • ????SHOW(len0);??
  • ????SHOW(len1);??
  • ????SHOW(len2);??
  • ????SHOW(len3);??
  • ????SHOW(len4);??
  • ????SHOW(len5);??
  • ??
  • ????elfHook("libonehook.so",?"strlen",?(void?*)my_strlen,?(void?**)&old_strlen);??
  • ??
  • ????len0?=?global_strlen1(str);??
  • ????len1?=?global_strlen2(str);??
  • ????len2?=?local_strlen1(str);??
  • ????len3?=?local_strlen2(str);??
  • ????len4?=?strlen(str);??
  • ????len5?=?strlen(str);??
  • ??
  • ????LOGI("hook?after:");??
  • ????SHOW(len0);??
  • ????SHOW(len1);??
  • ????SHOW(len2);??
  • ????SHOW(len3);??
  • ????SHOW(len4);??
  • ????SHOW(len5);??
  • ??
  • ????return?0;??
  • }??


  • 從打印結果可以發現,local_strlen1和local_strlen2正所上面所說,并沒有受影響,但如果函數再次被調用,則生效了,原因不解析了。測試結果就不發了,留給你們試吧。

    GitHup地址

    完整代碼,見https://github.com/boyliang/AllHookInOne.git


    原文地址: http://blog.csdn.net/l173864930/article/details/40507359

    總結

    以上是生活随笔為你收集整理的基于Android的ELF PLT/GOT符号重定向过程及ELF Hook实现(by 低端码农 2014.10.27)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    色的网站在线观看 | 国产精品久久久久久久久久久久冷 | 国产黄影院色大全免费 | 一区国产精品 | 超碰人在线 | 人人干网站 | 91网站观看| 国产精品乱码一区二区视频 | 成人理论在线观看 | 欧美精品一区二区三区一线天视频 | 国产精品原创av片国产免费 | 五月开心综合 | 亚洲精品乱码白浆高清久久久久久 | 日韩精品一区二区三区电影 | 日韩精品一区二区三区免费观看视频 | 成人av片免费看 | 夜又临在线观看 | 在线中文字幕播放 | 欧美日本中文字幕 | 成年人国产视频 | 亚洲激情 在线 | 色999精品| 麻豆免费在线播放 | 亚洲精品在线免费播放 | av不卡在线看 | 99久久99热这里只有精品 | 日韩和的一区二在线 | 久久a免费视频 | 激情五月五月婷婷 | 91色影院 | 精品国产一二三 | 亚洲精品欧美成人 | 欧美在线aaa | 在线亚洲精品 | 不卡电影免费在线播放一区 | 免费看成人片 | 日韩精品免费在线播放 | 国产1区2区 | 欧美成人h版在线观看 | 九九热免费观看 | 综合久久一本 | 精品96久久久久久中文字幕无 | www.久草视频 | 亚洲国产成人精品电影在线观看 | 一级黄色av | 亚洲精品视频在线免费 | 免费a级大片 | 草久久久久久 | 久久久久在线观看 | 日本久久成人中文字幕电影 | 超碰人人国产 | 亚洲成色777777在线观看影院 | 日韩特黄一级欧美毛片特黄 | 性色av一区二区三区在线观看 | 97精品国产91久久久久久 | 五月天最新网址 | 精品一区二区综合 | 精品在线视频观看 | 国产一及片 | 在线a视频 | 黄色av一级 | 久久国产欧美日韩精品 | 97电影在线看视频 | 久久国产视频网 | 久久优 | 日韩有码专区 | 99久热在线精品视频 | 天天色天天草天天射 | 久99久在线视频 | 在线免费观看视频一区 | 天天摸天天操天天爽 | 婷婷色网视频在线播放 | 91亚洲网站| 在线中文字母电影观看 | 久草精品视频在线播放 | 日韩久久一区 | 一区二区三区手机在线观看 | 亚洲一区二区视频 | 久久9999久久免费精品国产 | 在线观看深夜福利 | 日批网站免费观看 | 久久字幕网 | 国产精品九九久久久久久久 | 夜夜夜夜夜夜操 | 在线免费观看麻豆视频 | 日韩在线观看的 | 香蕉视频18 | 久久久久亚洲精品中文字幕 | 一本一道久久a久久精品蜜桃 | 久久99国产精品自在自在app | 久久久www成人免费精品 | 国产精品 999 | 婷婷色综合色 | 五月综合网站 | 亚洲精品乱码久久久久久蜜桃欧美 | 国产中文字幕在线播放 | 91精品91 | 永久免费毛片 | 狠狠黄| 亚洲视频免费在线观看 | 欧美一级免费高清 | 又黄又爽又色无遮挡免费 | 91电影福利 | 在线观看黄网 | 在线一区观看 | 欧美在线观看视频 | 中文字幕高清av | 日本性xxxxx| 五月天综合网 | 91九色视频国产 | 九草在线视频 | 色姑娘综合天天 | 人人超碰在线 | 99999精品| adn—256中文在线观看 | 国产伦理一区二区 | 超碰大片 | 91精品日韩 | 丁香六月婷婷开心 | 久久精品视频国产 | 免费在线观看av网址 | 91在线在线观看 | 国产麻豆果冻传媒在线观看 | 91精品爽啪蜜夜国产在线播放 | www.成人久久| 久久免费视频99 | 99精品黄色 | 天天天天色综合 | 免费99精品国产自在在线 | 国产免费观看av | 日韩精品一区二 | 狠狠色丁香婷婷综合视频 | 日韩久久久久久 | 亚州中文av | 亚洲精品国产欧美在线观看 | 久久久久五月 | 天天射,天天干 | aaawww| 欧美伦理电影一区二区 | 亚洲精品在线观看视频 | 天天干天天在线 | 亚洲一区二区精品 | 欧美性精品 | 51久久夜色精品国产麻豆 | 亚洲视频大全 | 久久精品一二区 | 日韩精品高清视频 | 国产精品国产三级国产aⅴ入口 | 人人草网站 | 在线观看91网站 | 午夜视频二区 | 天天干国产 | wwwwww色| 99热99热 | 国产精品2019| 深爱激情五月网 | 91精品国自产在线观看欧美 | 久久男人中文字幕资源站 | 丁香花中文字幕 | 午夜精品久久久久久久99婷婷 | 国产精品 美女 | 在线免费黄色av | 欧美日韩在线视频一区 | 青青河边草免费观看完整版高清 | 嫩草伊人久久精品少妇av | 国内丰满少妇猛烈精品播 | 久久成视频 | 精品主播网红福利资源观看 | av在线免费播放 | 91视频免费播放 | 中文字幕中文字幕在线中文字幕三区 | 久久久国产一区二区 | 久久精品视频观看 | 亚洲dvd| 国产亚洲资源 | 日韩网站免费观看 | 久久久久看片 | 久久久午夜剧场 | 91完整版 | 不卡视频一区二区三区 | 国产一级91 | 999视频在线播放 | www天天干| 成人精品一区二区三区中文字幕 | zzijzzij亚洲成熟少妇 | 一区二区三区高清 | 一区二区精品在线观看 | 日本性视频| 国产精品久久99综合免费观看尤物 | 狠狠色丁香久久婷婷综合五月 | 欧美一级性生活视频 | 一区二区精品 | 国产视频高清 | www成人精品 | 欧美色图东方 | wwwwwww色| 久久免费中文视频 | 成人精品一区二区三区中文字幕 | 国产成人精品在线播放 | 51久久成人国产精品麻豆 | 欧美精品久久久久久久亚洲调教 | 最新超碰 | 天天色 天天 | 免费h在线观看 | av黄色影院 | 丁香久久 | 婷婷九月激情 | 日韩美在线观看 | 99精品国产99久久久久久福利 | 亚洲精品在线网站 | 国产免费二区 | 成人电影毛片 | 久久精品韩国 | 国产美女视频一区 | 欧美精品在线一区 | 久久日韩精品 | 免费观看日韩 | 91网站免费观看 | 天天曰夜夜操 | 天天干天天碰 | 久久久久久久久久久久亚洲 | 国产精品九九九九九 | 国产大尺度视频 | 免费在线观看av网站 | 在线看的毛片 | 天天操天天能 | 玖玖精品视频 | 夜夜躁日日躁狠狠久久88av | 久久久高清免费视频 | 亚洲人视频在线 | 久久不卡视频 | 在线视频 精品 | 国产精品毛片网 | 国产精成人品免费观看 | a视频在线观看 | 中文字幕在线免费看线人 | 激情五月婷婷综合 | 久久久99精品免费观看 | 久久视频一区 | 国产日韩欧美在线 | 九九九在线观看视频 | 国产精品免费久久久久 | 欧美一级在线看 | 中文字幕在线视频一区 | 午夜精品久久久久久久99热影院 | 日本久久久影视 | 色成人亚洲网 | 亚洲成人动漫在线观看 | 免费在线视频一区二区 | 日韩天天操 | 久久国产热视频 | 女人18毛片a级毛片一区二区 | 国产一区二区三区免费观看视频 | 正在播放久久 | 久久久综合香蕉尹人综合网 | 婷婷伊人综合亚洲综合网 | 亚洲成人频道 | 国产一级视屏 | 粉嫩一区二区三区粉嫩91 | 天天翘av| 手机成人免费视频 | 久久久久久免费毛片精品 | 国产精品高潮呻吟久久av无 | 97超碰色| 一区三区在线欧 | 99久久99久国产黄毛片 | 草久久久久 | 久草香蕉在线 | av一级片| av大片免费看 | 欧美性色19p | 久久精品欧美日韩精品 | 激情偷乱人伦小说视频在线观看 | 一级a性色生活片久久毛片波多野 | 97在线播放视频 | 国产精品国产三级国产不产一地 | 在线观看免费福利 | 免费av试看 | 91精品国产福利 | 狠狠干婷婷| 久久一视频 | 国产成人性色生活片 | 久草精品网 | 日日操天天射 | 一区二区中文字幕在线播放 | 97色综合| 色婷五月天 | 2021国产精品| 丰满少妇在线观看资源站 | 国产精品男女 | 丝袜+亚洲+另类+欧美+变态 | 精品国偷自产在线 | 日本精品视频免费观看 | 国产精品国产三级国产专区53 | 97色婷婷成人综合在线观看 | 天天操网址 | 亚洲国产精品传媒在线观看 | 亚洲精品在线观看免费 | 久久久久久久久久久影院 | 91精品在线免费观看视频 | 麻豆94tv免费版 | 久久久久久久久久久影院 | 欧美日韩亚洲国产一区 | 人人爽人人插 | 91毛片在线观看 | 激情综合五月天 | 国产精品免费av | 国产一线二线三线在线观看 | 亚洲国产成人在线播放 | av在线网站免费观看 | 91传媒在线观看 | 国产精品色婷婷 | 免费观看午夜视频 | 国产超碰在线观看 | 99久久精品一区二区成人 | 亚洲天堂免费视频 | 精品播放 | 超碰在线观看av | 网站免费黄| 日韩免费专区 | 国产99久久九九精品 | 中文字幕在线播放第一页 | 欧美激情精品 | 日韩一区二区三区在线看 | 国产视频久久久 | 午夜精品区 | 波多野结依在线观看 | 伊人久久精品久久亚洲一区 | 天天综合天天做 | 精品一区二区久久久久久久网站 | 久久亚洲精品国产亚洲老地址 | 91成版人在线观看入口 | 亚洲国产理论片 | 最新av在线网站 | 欧美日韩国产一区二区三区在线观看 | 国产美女在线观看 | 欧美久久久久久久久久久久 | 欧美男女爱爱视频 | 免费在线一区二区三区 | 欧美性生活久久 | av中文字幕免费在线观看 | 免费看在线看www777 | 五月天国产精品 | 综合精品在线 | 国内久久久久 | 综合精品久久 | 丁香婷五月 | 精品免费久久久久久 | 日韩一二三区不卡 | 色婷婷视频在线 | 亚洲欧美国产精品18p | 日韩中文字幕亚洲一区二区va在线 | 午夜国产一区 | 黄在线免费看 | 亚洲欧美国产精品va在线观看 | 欧美日韩伦理在线 | 色综合在 | 成人99免费视频 | 人人干网站 | 成年一级片| 日韩在线观看中文字幕 | 中文永久字幕 | 99综合视频 | 国产一区二区三区免费在线 | 日韩资源在线观看 | 综合国产在线观看 | 最近高清中文在线字幕在线观看 | 精品亚洲网| 九九热1 | av超碰在线| 97精品国产97久久久久久粉红 | 日日夜夜精品网站 | 久久国产精品久久精品国产演员表 | 一区二区三区观看 | 亚州欧美精品 | 久久精品视频在线看 | 在线观看国产亚洲 | 日日干美女 | 婷婷精品国产一区二区三区日韩 | 日本三级国产 | 国产中文字幕视频在线 | 日韩网站在线播放 | 碰碰影院 | 欧美精品在线观看免费 | 黄污在线看 | 日韩毛片久久久 | 四虎国产视频 | 99热超碰 | 天天爽人人爽 | 国产午夜一区二区 | 在线激情网 | 天天爽夜夜爽人人爽一区二区 | 久久久久欧美精品 | .精品久久久麻豆国产精品 亚洲va欧美 | 在线观看深夜视频 | av免费观看高清 | 婷婷久久网站 | 在线a人v观看视频 | 成人试看120秒 | 免费99视频 | 91大神一区二区三区 | 在线看片a| 久久精品久久久久久久 | www99久久 | 亚洲资源片 | 国产美女视频一区 | 天堂va在线观看 | 国产精品久久久久国产精品日日 | 99热这里 | 久久的色 | 国产美女无遮挡永久免费 | 天天狠狠操| 久久成人在线 | 一区二区毛片 | 国产在线高清视频 | 亚洲日日日 | 亚洲黄色区 | 欧美精品久久久久久久久久久 | 最新色站| 国产精品欧美精品 | www黄| 人人澡人人添人人爽一区二区 | 国产日韩欧美在线影视 | www.色综合.com | av在线成人| 91完整版在线观看 | 中文字幕永久在线 | 美女精品| 国产一二三区在线观看 | 国产一区二区免费 | 另类五月激情 | 亚洲精品一区二区18漫画 | 亚洲国产中文字幕 | 色五月激情五月 | 久精品在线观看 | 亚洲综合色av| 国产精品一区二区三区久久 | 伊香蕉大综综综合久久啪 | 色在线观看网站 | 午夜美女福利直播 | 免费黄a| 欧美片网站yy | 国产一级电影在线 | av网站有哪些 | 日韩成人免费在线电影 | 午夜av一区二区三区 | 91成人在线视频观看 | 青青河边草免费观看 | 中文字幕精品一区 | 日本3级在线观看 | 亚洲永久字幕 | 97在线观看免费观看 | 亚洲手机天堂 | 亚洲国产免费网站 | 久久一二区 | 国产色一区 | 久久精品五月 | 中文字幕在线观看免费高清电影 | 国产精品区一区 | 精品福利片 | 黄色app网站在线观看 | 成人性生交视频 | 色综合天天综合网国产成人网 | 国产亚洲aⅴaaaaaa毛片 | 欧美激情视频一区 | 亚洲精品视频在线观看网站 | 精品国产中文字幕 | av免费观看网站 | 2023年中文无字幕文字 | 美女视频久久黄 | 69av在线视频 | 国产小视频在线播放 | 天天干天天做 | 中文 一区二区 | 国产福利91精品一区二区三区 | 成人高清av在线 | 久草在线精品观看 | 久久草草热国产精品直播 | 日黄网站 | 成人app在线播放 | 精品国产乱码久久久久久1区2匹 | 欧美久久久久久久 | 狠狠色综合网站久久久久久久 | 午夜视频在线观看一区二区三区 | 香蕉久草| 色老板在线视频 | 欧美日韩精品电影 | 日韩成人在线免费观看 | 久久久不卡影院 | 亚洲高清av| 亚洲黄色在线观看 | 看av在线| 福利视频一区二区 | 婷婷综合影院 | 在线免费性生活片 | 久久99国产综合精品 | 91精品国产一区二区在线观看 | 久热香蕉视频 | 中文字幕在线视频一区二区 | 欧美精品乱码久久久久久 | 久久九九视频 | 国产精品久久久一区二区 | 国产一区高清在线观看 | 99亚洲国产精品 | 久久久人 | 欧洲精品码一区二区三区免费看 | 欧美日韩性视频在线 | 久久久www | 精品美女久久久久久免费 | 成人av在线一区二区 | 日本女人b| 五月天综合色激情 | 欧美日韩高清一区二区 | 久久精品官网 | 日日躁天天躁 | 久久精品牌麻豆国产大山 | 精品一区二区三区四区在线 | 天天插天天操天天干 | av久久在线 | 日韩在线视频二区 | 不卡精品 | 国产精品自产拍在线观看桃花 | 69国产成人综合久久精品欧美 | 日本激情中文字幕 | 成人久久久精品国产乱码一区二区 | 超碰人人在线观看 | 96精品高清视频在线观看软件特色 | 国产成人免费在线 | 日本精品久久久久久 | 激情欧美网| 超碰在线观看av | 亚洲区精品视频 | 亚洲免费在线观看视频 | 伊人开心激情 | 欧美福利精品 | 国产视频 亚洲视频 | 91精品啪啪 | 日日日操操 | 99精品一级欧美片免费播放 | 日日精品 | 国产高清在线免费 | 国产黄色精品 | 日日天天干 | 五月精品 | 国产精品午夜久久久久久99热 | 欧美日韩国产在线精品 | 美女av电影| 国产黄色在线 | 中文字幕日韩国产 | 国产视频99| www.在线观看av | 激情久久久久 | 成人a免费视频 | 91香蕉视频黄色 | 婷婷电影在线观看 | 美女网站色免费 | 国产原创在线 | 久草线 | 97视频在线免费播放 | 日本午夜免费福利视频 | 亚洲午夜剧场 | 久久艹综合 | 超碰97在线资源 | 国内久久久久久 | 久久国产精品99久久久久久老狼 | 999成人网 | 免费看污黄网站 | 亚色视频在线观看 | 欧美一级黄色网 | 亚色视频在线观看 | 99热这里精品 | 天天做日日做天天爽视频免费 | 天天色综合久久 | 亚洲首页 | 久草精品视频在线观看 | 日韩高清毛片 | 91精品国自产拍天天拍 | 久草网免费 | 一区二区久久久久 | 天天干天天在线 | 亚洲激情精品 | 中文字幕 影院 | 天天干人人插 | 欧美黄色特级片 | 91亚洲精品久久久中文字幕 | 亚洲一二三在线 | 久久久久久久久久久黄色 | 国产一区av在线 | 超碰在线日韩 | 国产黄色免费观看 | 国产精品原创在线 | 久久精品综合 | 久久在线免费观看视频 | 天天av天天 | 六月丁香激情综合色啪小说 | 久久官网 | 亚洲欧美综合精品久久成人 | 黄色a一级片 | 国产午夜精品一区二区三区在线观看 | 国产麻豆视频在线观看 | 麻豆视频在线观看 | 91精品91 | 五月婷婷操 | 天天操天天操天天操天天操天天操天天操 | 伊甸园永久入口www 99热 精品在线 | 韩国精品福利一区二区三区 | 色噜噜在线观看 | 日日夜夜精品免费观看 | 国产精品18久久久久久久 | 五月婷婷久久丁香 | 高清不卡一区二区三区 | 香蕉视频导航 | 日av免费| 五月婷影院 | 色资源在线观看 | 成人av网站在线观看 | 日韩久久视频 | 国产最新视频在线观看 | 国产精品一区二区久久精品爱涩 | 超碰电影在线观看 | 国产免费观看视频 | 国产99自拍 | 亚洲最新av网址 | 日韩一区二区三区观看 | 欧美大码xxxx | 欧美一区二区三区在线 | 在线观看v片 | 日韩资源在线播放 | 99视频精品免费视频 | 久久午夜电影网 | 黄色国产高清 | 97综合网 | 亚洲视频999 | 国产一性一爱一乱一交 | 尤物97国产精品久久精品国产 | 国内精品视频在线播放 | 五月婷婷综合激情 | 国产精品免费小视频 | 亚洲精品女人 | 欧美色综合天天久久综合精品 | 国产精品久久久久久久久久新婚 | 六月激情婷婷 | 久久九九国产精品 | 国产色影院 | 日本不卡一区二区三区在线观看 | 六月天综合网 | 中国一级特黄毛片大片久久 | 日韩激情久久 | 69久久夜色精品国产69 | 五月天婷婷在线视频 | 91av在线电影 | 天天搞天天干天天色 | 国产精品资源在线 | 国产日韩精品在线 | www.香蕉视频在线观看 | 欧美成人猛片 | 一区精品久久 | 97超碰福利久久精品 | 9在线观看免费高清完整版在线观看明 | 国产成人精品一区二区三区福利 | 久草在 | 一级黄色片网站 | 国产在线免费观看 | 在线看v片 | 色婷婷激婷婷情综天天 | 婷婷六月久久 | 久久无码精品一区二区三区 | 91大神精品视频在线观看 | 国产a高清| 欧美激情xxxx| 欧美日韩高清一区二区 国产亚洲免费看 | 五月开心婷婷 | 免费在线黄网 | 成人久久久久久久久久 | 日日干夜夜操视频 | 国产精品剧情 | 波多野结衣电影久久 | 国产精华国产精品 | 中文字幕在线乱 | 精品国产一区二区三区免费 | 91精品麻豆 | 国产黄网站在线观看 | 三级a毛片 | 亚洲www天堂com | 久久综合之合合综合久久 | 日本一区二区高清不卡 | a级片在线播放 | 久久毛片视频 | 成人av影视 | 香蕉影院在线播放 | 日韩大片免费观看 | 综合伊人av | 亚洲最大av在线播放 | 欧美激情在线网站 | a级国产乱理论片在线观看 特级毛片在线观看 | 99中文字幕在线观看 | 日韩av免费在线电影 | 久久国产精品免费视频 | 五月婷婷国产 | 亚洲日韩精品欧美一区二区 | 亚洲一二区精品 | 日韩av不卡在线观看 | 久久久精品在线观看 | 国产精华国产精品 | 国产欧美精品在线观看 | 国产成人精品在线观看 | 久草在线视频在线观看 | 人人插人人草 | 欧美亚洲免费在线一区 | 国产成人精品久久二区二区 | 在线成人免费av | 又黄又爽又无遮挡免费的网站 | zzijzzij亚洲成熟少妇 | 日韩欧美国产免费播放 | 日韩电影在线视频 | 久久精品视频在线看 | 高清在线一区二区 | 国产精品久久久久久久久久久久午夜片 | 在线 视频 一区二区 | 激情久久久久久久久久久久久久久久 | 五月天婷婷丁香花 | 69国产成人综合久久精品欧美 | 超碰97免费 | 美女性爽视频国产免费app | 免费观看的黄色 | 天天干国产 | 99精品视频99 | 日韩有码在线观看视频 | 亚洲天天综合网 | 国产福利小视频在线 | 中文字幕永久在线 | av中文字幕在线看 | 久草网视频在线观看 | 中文区中文字幕免费看 | 日本三级全黄少妇三2023 | 白丝av在线| a级片韩国 | 99中文字幕视频 | 三三级黄色片之日韩 | 国产精品ⅴa有声小说 | 亚洲一区美女视频在线观看免费 | 日韩免费在线看 | 亚洲欧美成人综合 | 欧美五月婷婷 | 国产精品久久久久久麻豆一区 | 九九热免费视频在线观看 | 一区三区视频 | 亚洲国产精品日韩 | 国产欧美在线一区 | 九色精品免费永久在线 | 91视频国产高清 | 亚洲一二三区精品 | 久久a视频 | 97国产精品一区二区 | 99热这里只有精品免费 | 日本黄色特级片 | 成年人免费在线观看网站 | 国产美女精品视频免费观看 | 久久99精品波多结衣一区 | 亚洲精品在线观看免费 | 日韩免费看 | 免费人成网 | 丁香婷婷激情 | 国产亚洲亚洲 | av在线一二三区 | 欧美日韩中文在线观看 | 免费观看成年人视频 | 黄色三级av | 51久久成人国产精品麻豆 | 中文字幕精品一区二区三区电影 | 久久久久免费网 | 色先锋av资源中文字幕 | 国产一二三区在线观看 | 成人中文字幕+乱码+中文字幕 | 亚洲欧美日韩国产精品一区午夜 | 成人在线视频网 | 最新中文在线视频 | 国产黄色a | 99欧美精品 | 一区电影 | 国产91综合一区在线观看 | 中文字幕免费一区 | 国产福利中文字幕 | 色七七亚洲影院 | 99久久精品无免国产免费 | 日韩色高清 | 国产人成免费视频 | 久久精品www人人爽人人 | 久久精品直播 | 操操操av | 欧美激情精品久久久久久 | 成人黄色av网站 | 久久久久99精品国产片 | 国产99久久久精品视频 | 中文字幕频道 | 国产精品一区久久久久 | 国产美女精品在线 | jizzjizzjizz亚洲 | 黄色特级片 | 96看片| 久久免费视屏 | 婷婷色网址 | 亚洲精品国产麻豆 | 青青草在久久免费久久免费 | 日韩亚洲在线视频 | 亚州日韩中文字幕 | 亚洲一区av | 国产一级片直播 | 91丨精品丨蝌蚪丨白丝jk | 一区二区精品在线视频 | 日韩xxxx视频 | 9999精品| 91麻豆精品国产91久久久更新时间 | 欧美三级在线播放 | 久草精品视频在线播放 | 国产伦精品一区二区三区… | 国产网站色 | 国产免费黄视频在线观看 | 4p变态网欧美系列 | 又黄又爽又刺激视频 | 中文字幕视频 | 免费毛片一区二区三区久久久 | 亚洲精品网址在线观看 | 91免费高清 | 精品国产免费人成在线观看 | 亚洲午夜精品电影 | 色噜噜日韩精品欧美一区二区 | 午夜的福利 | 美女网站在线免费观看 | 国产在线观看91 | 久草视频在线免费看 | 天天天色综合a | 日韩欧美在线中文字幕 | 99久久精品国产亚洲 | 国产五月色婷婷六月丁香视频 | 一区二区三区视频在线 | 91久久久久久久一区二区 | 日韩在线观看三区 | 中文在线免费一区三区 | aaa日本高清在线播放免费观看 | 久久精品国产99国产 | 久久久亚洲电影 | 国产婷婷久久 | 国产又粗又猛又爽 | 久久久黄色 | 国产精品第一页在线观看 | 婷婷精品在线视频 | www.av在线播放| 91av小视频| 国产夫妻性生活自拍 | 国产成人在线精品 | 天天射色综合 | 九色精品在线 | 中文在线天堂资源 | 免费福利片2019潦草影视午夜 | 欧美性脚交 | 最新av免费在线 | 免费在线观看毛片网站 | 国产一区在线免费观看视频 | 成年人天堂com | 97视频免费观看2区 亚洲视屏 | 一区二区毛片 | 在线a视频| 亚洲视频网站在线观看 | 99国产一区二区三精品乱码 | 免费在线观看日韩视频 | 久久久久久免费 | 一级片免费观看 | 日韩区欧美久久久无人区 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 日韩欧美高清视频在线观看 | 亚洲视频久久久久 | 国产免费大片 | 不卡的av电影在线观看 | 国产又粗又猛又爽又黄的视频免费 | 久久视频这里有精品 | 中国一级特黄毛片大片久久 | 超碰日韩在线 | av大全免费在线观看 | 不卡的av电影在线观看 | 丁香花中文字幕 | 97免费在线观看视频 | 99视频导航 | av在线h | 美女视频永久黄网站免费观看国产 | 91九色在线视频观看 | 2019精品手机国产品在线 | 91av综合 | 日韩av成人在线观看 | 精品亚洲一区二区三区 | 人人艹人人 | 综合天天色| 不卡的av在线播放 | 9在线观看免费高清完整版在线观看明 | 综合在线亚洲 | 黄色av网站在线免费观看 | 视频在线精品 | 高潮毛片无遮挡高清免费 | 亚洲婷婷综合色高清在线 | 成人天堂网 | 4438全国亚洲精品在线观看视频 | 国产a高清 | 91精品国产乱码久久桃 | 狠狠综合 | 久久成人在线 | 欧美在线不卡一区 | 国产片免费在线观看视频 | 亚洲视频国产 | 欧美日韩国产二区三区 | 日韩欧美在线视频一区二区 | 国产一区国产精品 | 91色偷偷 | 男女啪啪免费网站 | 欧美精品天堂 | 日本久久电影 | 99视频| 天天色天天搞 | 天天射天天操天天干 | aaa毛片视频 | 亚洲电影成人 | 婷婷精品在线 | 粉嫩一区二区三区粉嫩91 | 五月天久久久 | 国产免费又爽又刺激在线观看 | 精品久久一二三区 | 免费在线国产精品 | 久久久久免费观看 | 五月丁香 | 视频一区二区免费 | 激情网在线观看 | 国产精品美女久久久久久2018 | 日本特黄特色aaa大片免费 | 夜添久久精品亚洲国产精品 | 免费a现在观看 | 久久免费在线观看视频 | 伊人午夜视频 | 午夜精品久久久久久久99 | 四虎在线免费 | 夜夜夜影院 | av超碰在线观看 | 日韩欧美一区二区在线 | 国产精品观看 | 免费a v观看 | 狠狠干天天操 | 欧洲精品亚洲精品 | 波多野结衣精品视频 | 国产一级视频在线观看 | 香蕉日日| 在线观看的av网站 | 中文亚洲欧美日韩 | 草久在线观看视频 | 在线国产91 | 三级av小说| 在线观看mv的中文字幕网站 | 99色国产 | av超碰在线 | 日韩免费一区二区三区 | 精品亚洲成人 | 国产精品免费久久久久影院仙踪林 | 97操操| 国产精品久久久影视 | 成全在线视频免费观看 | 国产毛片久久久 | 91精品综合在线观看 | www.黄色片网站 | 亚洲综合少妇 | 九九免费在线观看视频 | 精品久久一区 | 人人爽人人爱 | 国产不卡免费视频 | 日韩女同av| 美女视频永久黄网站免费观看国产 | 久久久久99精品国产片 | 亚洲国产大片 | 99久久精品免费看国产 | 欧美日韩高清一区二区 | 国产精品2区| 久久综合狠狠综合久久狠狠色综合 | 日韩在线观看a | 伊人狠狠操 | 豆豆色资源网xfplay | 成人在线视频在线观看 | 亚洲精品综合一二三区在线观看 | 国产亚洲人成网站在线观看 | 99色99| 色婷婷亚洲精品 | 人人射网站 | 嫩草av在线 | 97超碰成人 | 成人h在线播放 | 黄污视频网站 | 日日干干 | 欧美久久久久久久久久久久久 | 久久九九影视网 | 91九色蝌蚪视频网站 | 日韩网站在线 | 国产一区二区三精品久久久无广告 | av天天澡天天爽天天av |