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

歡迎訪問 生活随笔!

生活随笔

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

Android

Android SO逆向1-ARM介绍

發布時間:2025/3/15 Android 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android SO逆向1-ARM介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文: http://drops.wooyun.org/mobile/10009

0x00 概述


把之前學習SO逆向的筆記分享出來,內容比較簡單,大牛就可以略過了。

0x01 ARM寄存器


1.1.通用寄存器

1.未分組寄存器:R0~R7 2.分組寄存器:R8~812 R13:SP,常用作堆棧指針,始終指向堆棧的頂部,當一個數據(32位)推入堆棧時,SP(R13的值減4)向下浮動指向下一個地址,即新的棧頂,當數據從堆棧中彈出時,SP(R13的值加4)向上浮動指向新的棧頂。 R14:連接寄存器(LR),當執行BL子程序調用指令時,R14中得到R15(程序計數器PC)的備份,其他情況下,R14用作通用寄存器。 R15:程序計數器(PC):用于控制程序中指令的執行順序。正常運行時,PC指向CPU運行的下一條指令。每次取值后PC的值會自動修改以指向下一條指令,從而保證了指令按一定的順序執行。當程序的執行順序發生改變(如轉移)時,需要修改PC的值。

1.2.狀態寄存器

CPSR(R16):當前程序狀態寄存器,用來保存ALU中的當前操作信息,控制允許和禁止中斷、設置處理器的工作模式等。 SPSRs:五個備份的程序狀態寄存器,用來進行異常處理。當異常發生時,SPSR用于保存CPSR的當前值,從異常退出時可由SPSR來恢復CPSR。

N、Z、C、V均為條件碼標志位,他們的內容可被運算的結果所改變。

N:正負標志,N=1表示運算的結果為負,N=0表示運算的結果為正或0 Z:零標志,Z=1表示運算的結果為0,Z=0表示運算的結果為非0 C:進位標志,加法運算產生了進位時則C=1,否則C=0借位標志,減肥運算產生了借位則C=0,否則C=1 V:溢出標志,V=1表示有溢出,V=0表示無溢出

1.3.地址空間

程序正常執行時,每執行一條ARM指令,當前指令計數器增加4個字節。

0x02 匯編語言


2.1.匯編指令格式

<opcode>{<cond>}{S}<Rd>,<Rn>{,<OP2>} 格式中<>的內容必不可少,{}中的內容可省略 <opcode>:表示操作碼,如ADD表示算術加法 {<cond>}:表示指令執行的條件域,如EQ、NE等。 {S}:決定指令的執行結果是否影響CPSR的值,使用該后綴則指令執行的結果影響CPSR的值,否則不影響 <Rd>:表示目的寄存器 <Rn>:表示第一個操作數,為寄存器 <op2>:表示第二個操作數,可以是立即數、寄存器或寄存器移位操作數例子:ADDEQS R0,R1,#8;其中操作碼為ADD,條件域cond為EQ,S表示該指令的執行影響CPSR寄存器的值,目的寄存器Rd為R0,第一個操作數寄存器Rd為R1,第二個操作數OP2為立即數#8

2.2.指令的可選后綴

S:指令執行后程序狀態寄存器的條件標志位將被刷新ADDS R1,R0,#2 !:指令中的地址表達式中含有!后綴時,指令執行后,基址寄存器中的地址值將發生變化,變化的結果是:基址寄存器中的值(指令執行后)=指令執行前的值 + 地址偏移量LDR R3,[R0,#2]! 指令執行后,R0 = R0 + 2

2.3.指令的條件執行

指令的條件后綴只是影響指令是否執行,不影響指令的內容 條件碼 助記符后綴 標志 含義
0000 EQ Z置位 相等
0001 NE Z清零 不相等
0010 CS C指令 無符號數大于或等于
0011 CC C清零 無符號數小于
0100 MI N置位 負數
0101 PL N清零 正數或零
0110 VS V置位 溢出
0111 VC V清零 未溢出
1000 HI C置位Z清零 無符號數大于
1001 LS C清零Z置位 無符號數小于或等于
1010 GE N等于V 帶符號數大于或等于
1011 LT N不等于V 帶符號數小于
1100 GT Z清零且(N等于V) 帶符號數大于
1101 LE Z置位或(N不等于V) 帶符號數小于或等于
1110 AL 忽略 無條件執行

例子:ADDEQ R4,R3,#1 相等則相加,即CPSR中Z置位時該指令執行,否則不執行。

2.4.ARM指令分類

助記符 指令功能描述 助記符 指令功能描述
ADC 帶進位加法指令 MRC 從協處理器寄存器到ARM寄存器的數據傳輸指令
ADD 加法指令 MRS 傳送CPSR或SPSR的內容到通用寄存器指令
AND 邏輯與指令 MSR 傳送通用寄存器到CPSR或SPSR的指令
B 分支指令 MUL 32位乘法指令
BIC 位清零指令 MLA 32位乘加指令
BL 帶返回的分支指令 MVN 數據取反傳送指令
BLX 帶返回和狀態切換的分支指令 ORR 邏輯或指令
BX 帶狀態切換的分支指令 RSB 逆向減法指令
CDP 協處理器數據操作指令 RSC 帶錯位的逆向減法指令
CMN 比較反值指令 SBC 帶錯位減法指令
CMP 比較指令 STC 協處理器寄存器寫入存儲器指令
EOR 異或指令 STM 批量內存字寫入指令
LDC 存儲器到協處理器的數據傳輸指令 STR 寄存器到存儲器的數據存儲指令
LDM 加載多個寄存器指令 SUB 減法指令
LDR 存儲器到寄存器的數據加載指令 SWI 軟件中斷指令
MCR 從ARM寄存器到協處理器寄存器的數據傳輸指令 TEQ 相等測試指令
MOV 數據傳送指令 TST 位測試指令

2.5.ARM尋址方式

尋址方式就是根據指令中操作數的信息來尋找操作數實際物理地址的方式

2.5.1立即數尋址

MOV R0,#15 #15就是立即數

2.5.2寄存器尋址

ADD R0, R1, R2 將R1和R2的內容相加,其結果存放在寄存器R0中

2.5.3寄存器間接尋址

LDR R0, [R4] 以寄存器R4的值作為操作數的地址,在存儲器中取得一個操作數存入寄存器R0中

2.5.4寄存器移位尋址

ADD R0,R1,R2,LSL #1 將R2的值左移一位,所得值與R1相加,存放到R0中 MOV R0,R1,LSL R3 將R1的值左移R3位,然后將結果存放到R0中

2.5.5基址變址尋址

LDR R0,[R1,#4] 將R1的值加4作為操作數的地址,在存儲器中取得操作數放入R0中 LDR R0,[R1,#4]! 將R1的值加4作為操作數的地址,在存儲器中取得操作數放入R0中,然后R1 = R1+4 LDR R0,[R1],#4 R0 = [R1],R1 = R1 +4 LDR R0,[R1,R2] R0 = [R1+R2]

2.5.6.多寄存器尋址

一條指令可以完成多個寄存器值的傳送(最多可傳送16個通用寄存器),連續的寄存器用“-”,否則用“,” LDMIA R0!,{R1 - R4} R1 = [R0],R2=[R0+4],R3=[R0+8],R4=[R0+12] 后綴IA表示在每次執行玩加載/存儲操作后,R0按自長度增加。

2.5.7.相對尋址

以程序計數器PC的當前值為基地址,指令中的地址標號作為偏移量,將兩者相加之后得到操作數的有效地址,如下圖的BL分支跳轉BL proc 跳轉到子程序proc處執行... proc MOV R0,#1...

2.5.8.堆棧尋址

按先進先出的方式工作,堆棧指針用R13表示,總是指向棧頂,LDMFD和STMFD分別表示POP出棧和PUSH進棧 STMFD R13!,{R0 - R4}; LDMFD R13!,{R0 - R4};

2.6.數據處理指令

2.6.1. MOV指令

MOV {<cond>}{S} Rd,op2 將op2傳給Rd MOV R1, R0 將寄存器R0的值傳到寄存器R1 MOV PC,R14 將寄存器R14的值傳到PC,常用于子程序返回 MOV R1,R0,LSL #3 將寄存器R0的值左移3位后傳給R1 MOV R0,#5 將立即數5傳給R0

2.6.2. MVN指令

MVN {<cond>}{S}Rd, op2 將op2取反傳給Rd MVN R0,#0 將0取反后傳給R0,R0 = -1 MVN R1,R2 將R2取反,結果保存到R1

2.6.3. 移位指令

LSL 邏輯左移 LSR 邏輯右移 ASR 算術右移 ROR 循環右移 RRX 帶擴展的循環右移

2.6.4. ADD加法指令

ADD{<cond>}{S}Rd, Rn, op2 ADD R0,R1,R2 R0 = R1 + R2 ADD R0,R1,#5 R0 = R1 + 5 ADD R0,R1,R2,LSL #2 R0 = R1 + (R2左移2位)

2.6.5. ADC帶進位加法指令

ADC{<cond>}{S} Rd,Rn,op2 將Rn的值和操作數op2相加,再加上CPSR中C條件標志位的值,并將結果保存到Rd中 例:用ADC完成64位加法,設第一個64位操作數保存在R2,R3中,第二個64位操作數放在R4,R5中,結果保存在R0,R1中 ADDS R0,R2,R4 低32位相加,產生進位 ADC R1,R3,R5 高32位相加,加上進位

2.6.6. SUB減法指令

SUB{<cond>}{S} Rd,Rn,op2 Rd = Rn - op2 SUB R0,R1,R2 R0 = R1 - R2 SUB R0,R1,#6 R0 = R1 -6 SUB R0,R2,R3,LSL #1 R0 = R2 - (R3左移1位)

2.6.7. SBC帶借位減法指令

SBC{<cond>}{S} Rd,Rn,op2 把Rn的值減去操作數op2,再減去CPSR中的C標志位的反碼,并將結果保存到Rd中,Rd = Rn - op2 - !C 例:用SBC完成64位減法,設第一個64位操作數保存在R2,R3中,第二個64位操作數放在R4,R5中,結果保存在R0,R1中 SUBS R0,R2,R4 低32位相減,S影響CPSR SBC R1,R3,R5 高32位相減,去除C的反碼

2.6.8. RSC帶借位的逆向減法指令

RSC{<cond>}{S} Rd,Rn,op2 把操作數op2減去Rn,再減去CPSR中的C標志位的反碼,并將結果保存到Rd中,Rd = op2 - Rn - !C

2.6.9. 邏輯運算指令

AND{<cond>}{S} Rd,Rn,op2 按位與,Rd = Rn AND op2 ORR{<cond>}{S} Rd,Rn,op2 按位或,Rd = Rn OR op2 EOR{<cond>}{S} Rd,Rn,op2 按位異或,Rd = Rn EOR op2

2.6.10. CMP比較指令

CMP{<cond>}{S} Rd,Rn,op2 將Rn的值和op2進行比較,同時更新CPSR中條件標志位的值(實際上是執行一次減法,但不存儲結果),當操作數Rn大于op2時,則此后帶有GT后綴的指令將可以執行(根據相應的指令判斷是否執行,如GT,LT等)。 CMP R1,#10 比較R1和10,并設置CPSR的標志位 ADDGT R0,R0,#5 如果R1>10,則執行ADDGT指令,將R0加5

2.6.11. CMN反值比較指令

CMN{<cond>}{S} Rd,Rn,op2 將Rn的值和op2取反后進行比較,同時更新CPSR中條件標志位的值(實際上將Rn和op2相加),后面的指令就可以根據條件標志位決定是否執行。 CMN R0,R1 將R0和R1相加,并設置CPSR的值

2.6.12. MUL/MLA/SMULL/SMLAL/UMULL/UMLAL乘法指令

MUL 32位乘法指令 MLA 32位乘加指令 SMULL 64位有符號數乘法指令 SMLAL 64位有符號數乘加指令 UMULL 64位無符號數乘法指令 UMLAL 64位無符號數乘加指令 MUL{<cond>}{S} Rd,Rm,Rs Rd = Rm * Rs MULS R0,R1,R2 MLA{<cond>}{S} Rd,Rm,Rs,Rn Rd = (Rm * Rs) + Rn MLAS R0,R1,R2,R3

2.7.數據加載與存儲指令

助記符 說明 操作
LDR{}Rd,addr 加載字數據 Rd = [addr]
LDRB{}Rd,addr 加載無符號字節數據 Rd = [addr]
LDRT{}Rd,addr 以用戶模式加載字數據 Rd = [addr]
LDRBT{}Rd,addr 以用戶模式加載無符號字節數據 Rd = [addr]
LDRH{}Rd,addr 加載無符號半字數據 Rd = [addr]
LDRSB{}Rd,addr 加載有符號字節數據 Rd = [addr]
LDRSH{}Rd,addr 加載有符號半字數據 Rd = [addr]
STR{}Rd,addr 存儲字數據 [addr] = Rd
STRB{}Rd,addr 存儲字節數據 [addr] = Rd
STRT{}Rd,addr 以用戶模式存儲字數據 [addr] = Rd
STRBT{}Rd,addr 以用戶模式存儲字節數據 [addr] = Rd
STRH{}Rd,addr 存儲半字數據 [addr] = Rd
LDM{}{type}Rn{!},regs 多寄存器加載 reglist = [Rn...]
STM{}{type}Rn{!},regs 多寄存器存儲 [Rn...] = reglist
SWP{}Rd,Rm,[Rn] 寄存器和存儲器字數據交換 Rd=[Rn],[Rn]=Rm(Rn!=Rd或Rm)
SWP{}B Rd,Rm,[Rn] 寄存器和存儲器字節數據交換 Rd = [Rn],[Rn] = Rm(Rn!=Rd或Rm)

2.7.1. LDR/STR字數據加載/存儲指令

LDR/STR{<cond>}{T}Rd,addr LDR指令用于從存儲器中將一個32位的字數據加載到目的寄存器Rd中,當程序計數器PC作為目的寄存器時,指令從存儲器中讀取的字數據被當做目的地址,從而可以實現程序流程的跳轉。 STR指令用于從源寄存器中將一個32位的字數據存儲到存儲器中,和LDR相反。后綴T可選。 LDR R4,START 將存儲地址為START的字數據讀入R4 STR R5,DATA1 將R5存入存儲地址為DATA1中 LDR R0,[R1] 將存儲器地址為R1的字數據讀入存儲器R0 LDR R0,[R1,R2] 將存儲器地址為R1+R2的字數據讀入存儲器R0 LDR R0,[R1,#8] 將存儲器地址為R1+8的字數據讀入存儲器R0 LDR R0,[R1,R2,LSL #2] 將存儲器地址為R1+R2*4的字數據讀入存儲區R0 STR R0,[R1,R2]! 將R0字數據存入存儲器地址R1+R2的存儲單元中,并將新地址R2+R2寫入R2 STR R0,[R1,#8]! 將R0字數據存入存儲器地址R1+8的存儲單元中,并將新地址R2+8寫入R2 STR R0,[R1,R2,LSL #2] 將R0字數據存入存儲器地址R1+R2*4的存儲單元中,并將新地址R2+R2*4寫入R1 LDR R0,[R1],#8 將存儲器地址為R1的字數據讀入寄存器R0,并將新地址R1+8寫入R1 LDR R0,[R1],R2 將存儲器地址為R1的字數據讀入寄存器R0,并將新地址R1+R2寫入R1 LDR R0,[R1],R2,LSL #2 將存儲器地址為R1的字數據讀入寄存器R0,并將新地址R1+R2*4寫入R1

2.7.2. LDRB/STRB字節數據加載/存儲指令

LDRB/STRB{<cond>}{T}Rd,addr LDRB指令用于從存儲器中將一個8位的字節數據加載到目的寄存器中,同時將寄存器的高24位清零,當程序計數器PC作為目的寄存器時,指令從存儲器中讀取的字數據被當做目的地址,從而可以實現程序流程的跳轉。 STRB指令用于從源寄存器中將一個8位的字節數據存儲到存儲器中,和LDRB相反。后綴T可選。

2.7.3. LDRH/STRH半字數據加載/存儲指令

LDRH/STRH{<cond>}{T}Rd,addr LDRH指令用于從存儲器中將一個16位的半字數據加載到目的寄存器中,同時將寄存器的高16位清零,當程序計數器PC作為目的寄存器時,指令從存儲器中讀取的字數據被當做目的地址,從而可以實現程序流程的跳轉。 STRH指令用于從源寄存器中將一個16位的半字數據存儲到存儲器中,和LDRH相反。后綴T可選。

2.7.4. LDM/STM批量數據加載/存儲指令

LDM/STM{<cond>}{<type>}Rn{!},<regs>{^} LDM用于從基址寄存器所指示的一片連續存儲器中讀取數據到寄存器列表所指向的多個寄存器中,內存單元的起始地址為基址寄存器Rn的值,各個寄存器由寄存器列表regs表示,該指令一般用于多個寄存器數據的出棧操作 STM用于將寄存器列表所指向的多個寄存器中的值存入由基址寄存器所指向的一片連續存儲器中,內存單元的起始地址為基址寄存器Rn的值,各個寄存器又寄存器列表regs表示。該指令一般用于多個寄存器數據的進棧操作。 type表示類型,用于數據的存儲與讀取有以下幾種情況: IA:每次傳送后地址值加。 IB:每次傳送前地址值加。 DA:每次傳送后地址值減。 DB:每次傳送前地址值減。 用于堆棧操作時有如下幾種情況: FD:滿遞減堆棧 ED:空遞減堆棧 FA:滿遞增堆棧 EA:空遞增堆棧

2.7.5. SWP字數據交換指令

SWP{<cond>}<Rd>,<Rm>,[<Rn>] Rd = [Rn],[Rn] = Rm,當寄存器Rm和目的寄存器Rd為同一個寄存器時,指令交換該急促親和存儲器的內容 SWP R0,R1,[R2] R0 = [R2],[R2] = R1 SWP R0,R0,[R1] R0 = [R1],[R1] = R0 SWPB指令用于將寄存器Rn指向的存儲器中的字節數據加載到目的寄存器Rd中,目的寄存器的高24位清零,同時將Rm中的字數據存儲到Rn指向的存儲器中。

2.8.分支語句

助記符 說明 操作
B{cond}label 分支指令 PC<-label
BL{cond}label 帶返回的分支指令 PC<-label,LR=BL后面的第一條指令地址
BX{cond}Rm 帶狀態切換的分支指令 PC = Rm & 0xffffffe,T=Rm[0] & 1
BLX{cond}label Rm 帶返回和狀態切換的分支指令 | PC=label,T=1 PC; PC = Rm & 0xffffffe,T=Rm[0] & 1;LR = BLX后面的第一條指令地址

2.8.1. 分支指令B

B{<cond>}label 跳轉到label處執行,PC=label例子: backword SUB R1,R1,#1CMP R1,#0 比較R1和0BEQ forward 如果R1=0,跳轉到forware處執行SUB R1,R2,#3SUB R1,R1,#1 forward ADD R1,R2,#4ADD R2,R3,#2B backword 無條件跳轉到backword處執行

2.8.2. 帶返回的分支指令BL

BL{<cond>}label 在跳轉之前,將PC的當前內容保存在R14(LR)中保存,因此,可以通過將R14的內容重新加載到PC中,返回到跳轉指令之后的指令處執行。該指令用于實現子程序的調用,程序的返回可通過把LR寄存器的值復制到PC寄存器中來實現。 例子: BL func 跳轉到子程序 ADD R1,R2,#2 子程序調用完返回后執行的語句,返回地址 .... func 子程序 ... MOV R15,R14 復制返回地址到PC,實現子程序的返回

2.8.3. 帶狀態切換的分支指令BX

BX{<cond>} Rm 當執行BX指令時,如果條件cond滿足,則處理器會判斷Rm的位[0]是否為1,如果為1則跳轉時自動將CPSR寄存器的標志T置位,并將目標地址的代碼解釋為Thumb代碼來執行,則處理器會切換到Thumb狀態,反之,若Rm的位[0]為0,則跳轉時自動將CPSR寄存器的標志T復位,并將目標地址處的代碼解釋為ARM代碼來執行,即處理器會切換到ARM狀態。

注意:bx lr的作用等同于mov pc,lr。即跳轉到lr中存放的地址處。 非零值存儲在R0中返回。

那么lr存放的是什么地址呢?lr就是連接寄存器(Link Register, LR),在ARM體系結構中LR的特殊用途有兩種:一是用來保存子程序返回地址;二是當異常發生時,LR中保存的值等于異常發生時PC的值減4(或者減2),因此在各種異常模式下可以根據LR的值返回到異常發生前的相應位置繼續執行。  

當通過BL或BLX指令調用子程序時,硬件自動將子程序返回地址保存在R14寄存器中。在子程序返回時,把LR的值復制到程序計數器PC即可實現子程序返回。

2.9堆棧

2.9.1. 進棧出棧

出棧使用LDM指令,進棧使用STM指令。LDM和STM指令往往結合下面一些參數實現堆棧的操作。 FD:滿遞減堆棧。 ED:空遞減堆棧。 FA:滿遞增堆棧。 EA:空遞增堆棧。 滿堆棧是指SP(R13)指向堆棧的最后一個已使用地址或滿位置(也就是SP指向堆棧的最后一個數據項的位置);相反,空堆棧是指SP指向堆棧的第一個沒有使用的地址或空位置。 LDMFD和STMFD分別指POP出棧和PUSH入棧

2.9.2. PUSH指令

PUSH{cond} reglist PUSH將寄存器推入滿遞減堆棧 PUSH {r0,r4-r7} 將R0,R4-R7寄存器內容壓入堆棧

2.9.3. POP指令

POP{cond} reglist POP從滿遞減堆棧中彈出數據到寄存器 POP {r0,r4-r7} 將R0,R4-R7寄存器從堆棧中彈出

0x03 創建Android NDK程序


3.1. NDK程序創建過程

1.創建一個android程序。 2.在程序右鍵-->Android Tools-->Add Native Support(需要ADT配置好NDK的路徑,新版的ADT沒有配置NDK的地方,需要安裝NDK的jar包)-->命名so文件(比如叫HelloJNI)。然后就會在程序中創建jni目錄,包含了我們要寫的NDK程序文件。 3.在src的包中(比如叫com.example.hellojni)中創建java文件,后面會演示幾個實例。 4.在程序根目錄下創建文件build_headers.xml,使用ANT editor打開(ADT需要安裝ANT),使用alt+/鍵調出自動提示,選擇Bulidfile template創建模板文件。后面會給出代碼實例。 5.打開ANT工具,選擇第一個"增加"按鈕(一個小的加號),然后將build_headers.xml添加進來,ANT中就會增加HelloJNI,每次修改源碼后,雙擊HelloJNI,就會自動修改/jni目錄下的文件。

3.2. 編寫程序

3.2.1. CLASS文件

在com.example.hellojni包中創建class文件,本文一次創建多個實例,共參考。

GetInt.java代碼為

package com.example.hellojni; public class GetInt {public static native int getInt(); }

GetString.java代碼為

package com.example.hellojni; public class GetString {public static native String getStr();public native String getString();public native int add(int a, int b); }

GetFor.java代碼為

package com.example.hellojni; public class GetFor {public static native int getFor1(int n);public static native int getFor2(int n); }

GetIfElse.java代碼為

package com.example.hellojni; public class GetIfElse {public static native String getIfElse(int n); }

GetWhile.java代碼為

package com.example.hellojni; public class GetWhile {public static native int getWhile(int n); }

GetSwitch.java代碼為

package com.example.hellojni; public class GetSwitch {public static native int getSwitch(int a,int b,int i); }

MainActivity.java代碼為

package com.example.hellojni; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; public class MainActivity extends ActionBarActivity {private TextView tv; @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv = (TextView) findViewById(R.id.tv);//tv.setText(String.valueOf(GetInt.getInt()));//tv.setText(GetString.getStr());//tv.setText(String.valueOf(GetFor.getFor1(4)));//tv.setText(String.valueOf(GetFor.getFor2(4)));//tv.setText(String.valueOf(GetWhile.getWhile(5)));//tv.setText(GetIfElse.getIfElse(20));tv.setText(String.valueOf(GetSwitch.getSwitch(4,2,2)));}static{System.loadLibrary("HelloJNI");} }

build_headers.xml代碼為

<?xml version="1.0" encoding="UTF-8"?><!-- ====================================================================== 2014-10-28 上午8:05:50 HelloJNI description0xExploit ====================================================================== --> <project name="HelloJNI" default="BuildAllHeaders"><description>description</description> <!-- ================================= target: BuildAllHeaders ================================= --><target name="BuildAllHeaders"><antcall target="BuildGetStringHeader"></antcall><antcall target="BuildGetIntHeader"></antcall><antcall target="BuildGetForHeader"></antcall><antcall target="BuildGetWhileHeader"></antcall><antcall target="BuildGetIfElseHeader"></antcall><antcall target="BuildGetStringHeader"></antcall></target> <!-- - - - - - - - - - - - - - - - - - target: depends - - - - - - - - - - - - - - - - - --><target name="BuildGetStringHeader"><javah destdir="./jni" classpath="./bin/classes/" class="com.example.hellojni.GetString"></javah></target> <target name="BuildGetIntHeader"><javah destdir="./jni" classpath="./bin/classes/" class="com.example.hellojni.GetInt"></javah></target><target name="BuildGetForHeader"><javah destdir="./jni" classpath="./bin/classes/" class="com.example.hellojni.GetFor"></javah></target><target name="BuildGetWhileHeader"><javah destdir="./jni" classpath="./bin/classes/" class="com.example.hellojni.GetWhile"></javah></target><target name="BuildGetIfElseHeader"><javah destdir="./jni" classpath="./bin/classes/" class="com.example.hellojni.GetIfElse"></javah></target><target name="BuildGetSwitchHeader"><javah destdir="./jni" classpath="./bin/classes/" class="com.example.hellojni.GetSwitch"></javah></target> </project>

然后雙擊ANT中的HelloJNI,然后F5刷新工程項目,可以看到jni目錄下,多出6個文件,com_example_hellojni_GetFor.h等,此文件里面就是函數.h接口文件,是沒有具體代碼的,需要把里面的函數復制到jni目錄下的HelloJNI.cpp文件中,然后去實現函數的具體部分。

HelloJNI.cpp的代碼為

#include <jni.h> #include <com_example_hellojni_GetInt.h> #include <com_example_hellojni_GetString.h> #include <com_example_hellojni_GetFor.h> #include <com_example_hellojni_GetIfElse.h> #include <com_example_hellojni_GetWhile.h> #include <com_example_hellojni_GetSwitch.h> int nums[5] = {1, 2, 3, 4, 5}; JNIEXPORT jstring JNICALL Java_com_example_hellojni_GetString_getStr(JNIEnv *env, jclass){return env->NewStringUTF("static method call"); } /** Class: com_example_hellojni_GetString* Method: getString* Signature: ()Ljava/lang/String;*/ JNIEXPORT jstring JNICALL Java_com_example_hellojni_GetString_getString(JNIEnv *env, jobject){return env->NewStringUTF("method call"); } /** Class: com_example_hellojni_GetString* Method: add* Signature: (II)I*/ JNIEXPORT jint JNICALL Java_com_example_hellojni_GetString_add(JNIEnv *, jobject, jint a, jint b){return a+b; } JNIEXPORT jint JNICALL Java_com_example_hellojni_GetInt_getInt(JNIEnv *, jclass){return 8; } JNIEXPORT jint JNICALL Java_com_example_hellojni_GetFor_getFor1(JNIEnv *, jclass, jint n){int i = 0;int s = 0;for (i = 0; i < n; i++){s += i * 2;}return s; } JNIEXPORT jint JNICALL Java_com_example_hellojni_GetFor_getFor2(JNIEnv *, jclass, jint n){int i = 0;int s = 0;for (i = 0; i < n; i++){s += i * i + nums[n-1];}return s; } JNIEXPORT jint JNICALL Java_com_example_hellojni_GetWhile_getWhile(JNIEnv *, jclass, jint n){int i = 1;int s = 0;while(i <= n){s += i++;}return s; } JNIEXPORT jstring JNICALL Java_com_example_hellojni_GetIfElse_getIfElse(JNIEnv *env, jclass, jint n){if(n < 16){return env->NewStringUTF("he is a boy");} else if(n < 30){return env->NewStringUTF("he is a young man");} else if(n < 45){return env->NewStringUTF("he is a strong man");} else{return env->NewStringUTF("he is an old man");} } JNIEXPORT jint JNICALL Java_com_example_hellojni_GetSwitch_getSwitch(JNIEnv *, jclass, jint a, jint b, jint i){switch (i){case 1:return a + b;break;case 2:return a - b;break;case 3:return a * b;break;case 4:return a / b;break;default:return a + b;break;} }

以上就是一些實例的代碼,下面就來分析逆向后的ARM代碼。以下反匯編代碼都是通過IDA得到的,至于IDA的使用方法,大家可以看看書。

3.2.2. getInt()方法

getInt()的方法代碼如下:

JNIEXPORT jint JNICALL Java_com_example_hellojni_GetInt_getInt(JNIEnv *, jclass){return 8; }

反編譯后的代碼為:

EXPORT Java_com_example_hellojni_GetInt_getInt Java_com_example_hellojni_GetInt_getInt MOVS R0, #8 ;R0 = 8 BX LR ;子程序返回R0

3.2.3. getStr()方法

getStr()的方法代碼如下:

JNIEXPORT jstring JNICALL Java_com_example_hellojni_GetString_getStr(JNIEnv *env, jclass){return env->NewStringUTF("static method call"); }

反編譯后的代碼為:

EXPORT Java_com_example_hellojni_GetString_getStr Java_com_example_hellojni_GetString_getStr PUSH {R3,LR} ;將R3和LR入棧 LDR R2, [R0] ;[R0]是JNIEnv,R2=*env,RO一般是放返回值的,調用函數后會被覆蓋的,所以要復制出去 LDR R1, =(aStaticMethodCa - 0xF7A) MOVS R3, #0x29C ;R3=0x29C ADD R1, PC ; "static method call" ;R1="static method call" LDR R3, [R2,R3] ;R2偏移R3,是NewStringUTF,可以查看JNI API(Android軟件安全與逆向分析7.6節也有介紹),如下圖所示,所有的函數在附件中。 BLX R3 ;調用NewStringUTF函數,第一個參數R0,是JNIEnv,子程序返回,第二個參數是R1

3.2.3. getFor1()方法

getFor1()的方法代碼如下:

JNIEXPORT jint JNICALL Java_com_example_hellojni_GetFor_getFor1(JNIEnv *, jclass, jint n){int i = 0;int s = 0;for (i = 0; i < n; i++){s += i * 2;}return s; }

反編譯后的代碼為:

代碼解釋如下:

EXPORT Java_com_example_hellojni_GetFor_getFor1 Java_com_example_hellojni_GetFor_getFor1MOVS R0, #0 ;R0 = 0MOVS R3, R0 ;R3 = 0B loc_FB0 ;跳轉到loc_FB0 ; --------------------------------------------------------------------------- loc_FAA ; CODE XREF: Java_com_example_hellojni_GetFor_getFor1+EjLSLS R1, R3, #1 ;R1=R3左移一位(即R1=R3*2)ADDS R0, R0, R1 ;R0=R0+R1ADDS R3, #1 ;R3=R3+1 loc_FB0 ; CODE XREF: Java_com_example_hellojni_GetFor_getFor1+4jCMP R3, R2 ;比較R3和R2,R2是第一個參數,即nBLT loc_FAA ;如果R3<R2,跳到loc_FAABX LR ;否則,子程序返回R0 ;End of function Java_com_example_hellojni_GetFor_getFor1

3.2.4. getWhile()方法

getWhile()的函數代碼如下:

JNIEXPORT jint JNICALL Java_com_example_hellojni_GetWhile_getWhile(JNIEnv *, jclass, jint n){int i = 1;int s = 0;while(i <= n){s += i++;}return s; }

反編譯后的結果為:

代碼解釋如下:

EXPORT Java_com_example_hellojni_GetWhile_getWhileJava_com_example_hellojni_GetWhile_getWhileMOVS R0, #0 ;R0 = 0MOVS R3, #1 ;R3 = 1B loc_FEA ;跳轉到loc_FEA; -------------------------------------------------------------loc_FE6 ; CODE XREF: le_hellojni_GetWhile_getWhile+CjADDS R0, R0, R3 ;R0=R0+R3ADDS R3, #1 ;R3=R3+1loc_FEA ; CODE XREF: le_hellojni_GetWhile_getWhile+4jCMP R3, R2 ;比較R3和R2,R2為第一個參數,即nBLE loc_FE6 ;如果R3<R2,跳轉到loc_FE6BX LR ;否則返回結果R0; End of function Java_com_example_hellojni_GetWhile_getWhile

3.2.5. getIfElse()方法

getIfElse()的代碼如下

JNIEXPORT jstring JNICALL Java_com_example_hellojni_GetIfElse_getIfElse(JNIEnv *env, jclass, jint n){if(n < 16){return env->NewStringUTF("he is a boy");} else if(n < 30){return env->NewStringUTF("he is a young man");} else if(n < 45){return env->NewStringUTF("he is a strong man");} else{return env->NewStringUTF("he is an old man");} }

反編譯后的結果為:

代碼解釋如下:

EXPORT Java_com_example_hellojni_GetIfElse_getIfElsJava_com_example_hellojni_GetIfElse_getIfElsePUSH {R4,LR} ;R4,LR入棧。MOVS R3, #0xA7 ;R3=167LDR R4, [R0] ;[R0]是JNIEnv,此處是R4=*envLSLS R3, R3, #2 ;R3=R3左移2位CMP R2, #0xF ;比較R2(即n)和16BGT loc_1002 ;如果R2>16,跳轉到loc_1002LDR R1, =(aHeIsABoy - 0x1002) ;和下一條指令一起,將R1="he is a boy"ADD R1, PC ; "he is a boy"B loc_101A ;跳轉到loc_101A; -------------------------------------------------------------loc_1002 ; CODE XREF: le_hellojni_GetIfElse_getIfElse+AjCMP R2, #0x1DBGT loc_100CLDR R1, =(aHeIsAYoungMan - 0x100C)ADD R1, PC ; "he is a young man"B loc_101A; -------------------------------------------------------------loc_100C ; CODE XREF: le_hellojni_GetIfElse_getIfElse+14jCMP R2, #0x2CBGT loc_1016LDR R1, =(aHeIsAStrongMan - 0x1016)ADD R1, PC ; "he is a strong man"B loc_101A; -------------------------------------------------------------loc_1016 ; CODE XREF: le_hellojni_GetIfElse_getIfElse+1EjLDR R1, =(aHeIsAnOldMan - 0x101C)ADD R1, PC ; "he is an old man"loc_101A ; CODE XREF: le_hellojni_GetIfElse_getIfElse+10j; le_hellojni_GetIfElse_getIfElse+1Aj ...LDR R3, [R4,R3] ;R4的偏移R3*4,是NewStringUTFBLX R3 ;子程序返回,第一個參數是R0,第二個參數是R1POP {R4,PC} ;一般是和第一行執行相反的出棧動作.將LR放入到PC,PC是下一條命令的地址,改變它的值也就相當跳轉.; End of function Java_com_example_hellojni_GetIfElse_getIfElse

3.2.6. getSwitch()方法

getSwitch()的代碼如下:

JNIEXPORT jint JNICALL Java_com_example_hellojni_GetSwitch_getSwitch(JNIEnv *, jclass, jint a, jint b, jint i){switch (i){case 1:return a + b;break;case 2:return a - b;break;case 3:return a * b;break;case 4:return a / b;break;default:return a + b;break;} }

反編譯后的結果為:

代碼解釋如下:

EXPORT Java_com_example_hellojni_GetSwitch_getSwitchJava_com_example_hellojni_GetSwitch_getSwitcharg_0 = 0PUSH {R3,LR}LDR R1, [SP,#8+arg_0]ADDS R0, R2, R3SUBS R1, #1CMP R1, #3 ; switch 4 casesBHI locret_105C ; jumptable 0000103E default case,跳轉到default,此時返回R0,R0=R2+R3MOVS R0, R1BL __gnu_thumb1_case_uqi ; switch jump; -------------------------------------------------------------jpt_103E DCB 2 ; jump table for switch statementDCB 4DCB 6DCB 9; -------------------------------------------------------------loc_1046 ; CODE XREF: le_hellojni_GetSwitch_getSwitch+EjADDS R0, R2, R3 ; jumptable 0000103E case 0B locret_105C ; jumptable 0000103E default case; -------------------------------------------------------------loc_104A ; CODE XREF: le_hellojni_GetSwitch_getSwitch+EjSUBS R0, R2, R3 ; jumptable 0000103E case 1B locret_105C ; jumptable 0000103E default case; -------------------------------------------------------------loc_104E ; CODE XREF: le_hellojni_GetSwitch_getSwitch+EjMOVS R0, R3 ; jumptable 0000103E case 2MULS R0, R2B locret_105C ; jumptable 0000103E default case; -------------------------------------------------------------loc_1054 ; CODE XREF: le_hellojni_GetSwitch_getSwitch+EjMOVS R0, R2 ; jumptable 0000103E case 3MOVS R1, R3BLX __divsi3locret_105C ; CODE XREF: le_hellojni_GetSwitch_getSwitch+Aj; le_hellojni_GetSwitch_getSwitch+18j ...POP {R3,PC} ; jumptable 0000103E default case; End of function Java_com_example_hellojni_GetSwitch_getSwitch

總結

以上是生活随笔為你收集整理的Android SO逆向1-ARM介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

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

香蕉视频网址 | 美女久久 | 免费看一级特黄a大片 | 亚洲国产av精品毛片鲁大师 | www.天天干 | 黄色免费电影网站 | 激情影院在线观看 | 成人免费视频观看 | 中文字幕韩在线第一页 | 免费日韩一级片 | 日韩欧美视频一区二区三区 | 久久中文字幕视频 | 高清有码中文字幕 | 午夜视频在线观看一区二区三区 | 亚洲精品在线视频 | 在线免费观看麻豆视频 | 韩国av一区二区三区 | 久久精品一二三 | 国产精品情侣视频 | 九九视频网站 | 国产精品麻豆欧美日韩ww | 99人成在线观看视频 | 婷婷性综合 | 亚洲国产精品影院 | 在线观看www91 | 999超碰 | 国内精品久久久久久久久久清纯 | 国产精品国产三级国产专区53 | 九九视频一区 | 色播激情五月 | 四虎国产免费 | 亚洲精品乱码久久久久久蜜桃不爽 | 日日碰狠狠添天天爽超碰97久久 | 高潮久久久 | 久99久在线视频 | 欧美日韩国产页 | 人人澡人人添人人爽一区二区 | 91免费在线看片 | 激情久久影院 | 91精品视频在线观看免费 | 日韩网站一区二区 | 日韩欧美视频免费在线观看 | 人人超在线公开视频 | 日日干综合 | 精品亚洲免费视频 | 伊人五月 | 亚洲精品久久久蜜桃直播 | 天天操狠狠操网站 | 91精品国产91热久久久做人人 | 91网站免费观看 | 91av看片| 狠狠操操| 激情综合站 | 亚洲小视频在线观看 | 亚洲一级二级三级 | 国产午夜精品一区二区三区 | 午夜丰满寂寞少妇精品 | 亚洲国产精品成人综合 | 久久黄色美女 | 91av视频在线观看 | 欧美亚洲精品在线观看 | 免费在线黄 | 久久久久成人免费 | 精壮的侍卫呻吟h | 久久免费观看视频 | freejavvideo日本免费 | 一色屋精品视频在线观看 | 奇米网在线观看 | 伊人天堂久久 | 一区二区三区四区久久 | 麻豆首页 | 国产精品手机在线观看 | 美女又爽又黄 | 久久精品艹 | 久久精品99国产精品 | 91精品国 | 欧美精品在线观看免费 | 2017狠狠干| 久久综合久久综合九色 | 久操中文字幕在线观看 | 国产精品亚洲精品 | 欧美亚洲国产一卡 | 亚洲成aⅴ人在线观看 | 欧美日韩在线观看一区二区三区 | 国内精品久久久久影院优 | 国产成人精品免费在线观看 | 成人免费观看视频网站 | 国产精品麻豆视频 | 99视频在线免费观看 | 九九九视频精品 | 亚洲国产精品久久久久 | 国产啊v在线观看 | 香蕉视频国产在线 | 国产精品12345 | 91天天视频| 91av免费观看 | 亚洲视频在线视频 | 国产视频一区二区在线 | 人人爽影院 | 国产资源在线视频 | 亚州国产精品 | 久久亚洲私人国产精品 | 97精品国产97久久久久久粉红 | 婷婷色视频 | 97人人模人人爽人人喊网 | 在线播放视频一区 | 丁香久久激情 | 国产精品精品视频 | 国产精品99久久久久久久久久久久 | 成年人视频在线免费观看 | 99热在线国产精品 | 日韩在线欧美在线 | 人人干人人草 | 2019中文字幕第一页 | 色综合天天做天天爱 | 96精品高清视频在线观看软件特色 | 少妇精品久久久一区二区免费 | 免费看一级特黄a大片 | a在线免费观看视频 | 男女精品久久 | 97成人精品 | 狠狠色丁香婷婷综合欧美 | 婷婷精品| 手机在线中文字幕 | 在线精品视频免费播放 | 一级做a爱片性色毛片www | 爱情影院aqdy鲁丝片二区 | 国产一区二区精品久久91 | 午夜 在线 | 亚洲综合在线播放 | 在线观看韩日电影免费 | 精品国产1区二区 | 亚洲电影一级黄 | 亚洲精品国产精品国自产观看 | 六月丁香六月婷婷 | 精品乱码一区二区三四区 | 欧美国产高清 | 成年人视频在线观看免费 | 三级黄色免费 | 日韩免费一级a毛片在线播放一级 | 久久九九九九 | 国产成本人视频在线观看 | 久草精品视频在线看网站免费 | 国产精品久久久久一区二区 | 91国内产香蕉 | 国产成人99av超碰超爽 | 国产成人av在线影院 | 91av视频网| 国产91精品高清一区二区三区 | 91视频免费网站 | 国产资源在线视频 | 色噜噜在线观看 | 青青射| 国产一区在线免费 | 精品国产一区二区三区四区vr | 韩国av一区二区 | 欧美日本啪啪无遮挡网站 | 91视频a | 最新av在线网址 | 国产精品久久久一区二区 | 在线a视频 | 国产黄免费在线观看 | 一级黄色大片在线观看 | 久久免费视频5 | 91精品一区二区三区蜜桃 | 美女久久久久久久久久 | 久久午夜电影 | 香蕉视频免费在线播放 | 久久久国产在线视频 | 国产黄色美女 | 中文字幕国产视频 | 国产精品久久久久一区二区国产 | 欧美精品做受xxx性少妇 | 黄色国产在线观看 | 四虎在线永久免费观看 | 国产精品久久久久aaaa九色 | 久久在线视频在线 | 中文字幕日韩免费视频 | 中文字幕久久亚洲 | 日韩视频三区 | 免费在线观看黄网站 | 91日本在线播放 | 欧美精品亚州精品 | 五月婷婷视频在线 | 国产色黄网站 | 91九色网站 | www黄色com | 色综合中文综合网 | 丁香亚洲 | 91香蕉视频黄色 | 国产二区视频在线 | 999视频网| 伊人色播 | 日韩视频一区二区在线观看 | 日日躁天天躁 | 日韩精品视频在线免费观看 | 成人久久18免费网站 | 最近高清中文字幕 | 亚洲精品短视频 | a一片一级 | 欧美老少交 | 91精品国产自产在线观看 | 尤物97国产精品久久精品国产 | 在线国产能看的 | 亚洲精品中文字幕视频 | 久久爱导航 | 婷婷色中文字幕 | 国产一区二区精品在线 | 日韩精品久久中文字幕 | 激情www| 亚洲一区免费在线 | 日韩国产精品久久 | 国际精品网 | 国产精品一区电影 | 日韩在线国产 | 亚洲成人av电影 | 久久免费a | 国产精品久久久久影视 | 久久综合五月天 | 精品主播网红福利资源观看 | 插插插色综合 | 亚洲精品在线二区 | 国产精品久久久久久久久久久久久久 | 国产激情电影综合在线看 | 五月婷婷.com | 91精彩视频在线观看 | 久久久久久久免费观看 | 91欧美日韩国产 | 亚洲精品女 | 日本中文不卡 | 91视频在线免费下载 | 久久五月婷婷综合 | 天天射夜夜爽 | 国产精品久久久久亚洲影视 | 99国产精品免费网站 | 黄色资源在线 | 久久九九影视 | 欧美日韩三级 | 久草精品资源 | 黄色免费在线视频 | 中文字幕在线观看免费观看 | 亚洲另类视频在线观看 | 最近免费中文视频 | 国产a级片免费观看 | 国产亚洲一区二区三区 | 久久综合欧美精品亚洲一区 | 91麻豆精品国产91久久久更新时间 | 91在线精品秘密一区二区 | 国产一区高清在线 | 美女福利视频网 | 精品久久久久久国产偷窥 | 天天夜夜亚洲 | 免费视频一级片 | 91成人短视频在线观看 | 欧美成人h版 | 青草视频网| 色干干 | 久久96国产精品久久99漫画 | 亚洲欧美成人 | 草免费视频 | avav99| 五月激情丁香图片 | 欧美成人性网 | 日本一区二区免费在线观看 | 亚洲一区免费在线 | 超碰成人免费电影 | 欧美福利在线播放 | 美女视频免费精品 | 日本不卡视频 | 国产网站av | 成人欧美在线 | 四虎影视8848aamm | 二区三区精品 | 热久久在线视频 | 国产精品乱码在线 | 狠狠地操| 97视频在线观看播放 | 米奇狠狠狠888 | 在线观看理论 | 久久精品99国产国产 | 日韩午夜在线播放 | 免费看十八岁美女 | 久久99国产视频 | 久久综合影视 | 国产伦精品一区二区三区在线 | 国产理伦在线 | 国产91学生| 亚洲国产片色 | 夜夜躁日日躁狠狠躁 | 黄色av高清 | 福利视频网址 | 97色在线观看 | 丝袜美腿在线 | 中文字幕一区二区三区四区久久 | 亚洲精品久久久久久久不卡四虎 | 在线国产日韩 | 亚洲欧洲国产日韩精品 | 色婷婷综合久色 | 天天操天天干天天干 | 丁香婷婷色综合亚洲电影 | 久久久久久久久久久黄色 | 天天躁天天躁天天躁婷 | 成人免费网站视频 | 777视频在线观看 | 精品一区二区av | 99操视频 | 成人a视频片观看免费 | 麻豆免费视频网站 | 97超碰成人在线 | 精品99999| 五月天开心 | 美女精品久久久 | 亚洲免费在线观看视频 | 久久99国产综合精品 | 日日干狠狠操 | 丁香激情综合 | 91免费视频网站在线观看 | 国产高清不卡一区二区三区 | 91麻豆精品一区二区三区 | 亚洲综合情 | 久久9视频 | 成人午夜剧场在线观看 | 99视频精品免费观看, | 国产美女主播精品一区二区三区 | 精品一区二区免费在线观看 | 特黄特色特刺激视频免费播放 | 国产永久免费高清在线观看视频 | 国产精品久久久久一区二区三区共 | 精品久久一区二区 | 久久精品美女视频网站 | bayu135国产精品视频 | 国产精品美女久久久久久2018 | 精品久久99 | 综合久久久久久 | 国产艹b视频 | 91污在线观看 | 国产成人av一区二区三区在线观看 | 久久久久亚洲国产 | 免费韩国av | 在线观看aa| av在线电影网站 | 国产成人精品aaa | 欧美精品一区二区三区四区在线 | 人人玩人人添人人澡超碰 | 在线观看一区视频 | 日韩综合色 | 欧美激情综合五月色丁香 | 欧美视频日韩视频 | 91在线入口 | 国产一级在线免费观看 | 国产原创中文在线 | 91在线视频播放 | 日韩三级视频在线观看 | 国产精品初高中精品久久 | 精精国产xxxx视频在线播放 | 久久久高清视频 | 国产精品久久久电影 | 97影视| 久久久高清 | 激情欧美日韩一区二区 | 日韩免费观看视频 | 国产精品久久久久久麻豆一区 | 婷婷视频在线观看 | 久久精品视频18 | 国产系列在线观看 | 人人干97 | 亚洲精品久久久久www | 国产一区二区不卡视频 | 999久久久久久久久久久 | 日韩欧美一区二区三区在线观看 | 2021国产在线 | 久久精品老司机 | 四虎成人精品永久免费av九九 | 久久xx视频| 久香蕉 | 婷婷九九 | 日韩中文字幕视频在线 | 国产精品日韩在线 | 91免费在线看片 | 亚洲资源| 欧美成人a在线 | 国产一区二区综合 | 亚洲黄电影 | 久久99亚洲热视 | 超碰精品在线 | 国产精品一区二区三区99 | 天天天天色射综合 | 四虎8848免费高清在线观看 | 夜夜操天天 | 91视频链接| 欧美国产三区 | 久久视频在线观看免费 | 992tv在线观看网站 | 免费看久久久 | 操综合 | 亚洲视频一级 | 美女露久久 | 成人在线视频你懂的 | 久草91视频| 在线精品视频免费播放 | 特级黄色视频毛片 | 国产黄色美女 | 久久久久在线视频 | 色视频网站免费观看 | 国产精品嫩草55av | 亚洲成aⅴ人片久久青草影院 | 久久精品电影网 | 欧美亚洲国产精品久久高清浪潮 | 99热亚洲精品 | 久久成人福利 | 日韩欧美99 | 51精品国自产在线 | 国产成人一区二区三区在线观看 | 97高清视频 | 欧美日韩国产精品久久 | 欧美成人精品三级在线观看播放 | 91av视频在线观看 | 国产青春久久久国产毛片 | 欧美日韩性视频 | 永久av免费在线观看 | 亚洲日本在线一区 | 天天爽天天爽 | 免费看v片网站 | 成人黄视频 | 国产99久久九九精品免费 | 欧洲亚洲女同hd | 97视频资源 | 91视频在线网址 | 狠狠狠色丁香综合久久天下网 | 国产精品一区二区在线观看 | 久久国产精品网站 | 久久亚洲免费 | 超碰大片| 黄色一级在线免费观看 | 99视频在线精品国自产拍免费观看 | 99视频网站| 成人播放器 | 日韩av播放在线 | 国产一区观看 | 黄网站大全 | 久久久国产精华液 | 高清不卡毛片 | 天天色宗合| 亚洲伦理一区二区 | 热久久在线视频 | 五月婷婷在线视频观看 | 毛片在线播放网址 | 精品999 | 久久精品爱爱视频 | 国产一区二区三区午夜 | 久久精品二区 | 欧美日韩高清免费 | 青草视频在线免费 | 国产精品麻豆三级一区视频 | 人人玩人人爽 | 久久综合九色综合97婷婷女人 | 最新中文字幕视频 | 在线影视 一区 二区 三区 | 欧美激情视频一区二区三区 | 永久精品视频 | 黄色在线看网站 | 日韩欧美高清 | .精品久久久麻豆国产精品 亚洲va欧美 | 99热在线这里只有精品 | av不卡网站 | 激情综合狠狠 | 成人亚洲精品国产www | 久久久久久久久久久福利 | 精品亚洲va在线va天堂资源站 | 国产性天天综合网 | 成人午夜毛片 | 亚洲永久av | 丁香六月婷婷综合 | 久草在线资源观看 | 国产污视频在线观看 | 国产午夜精品在线 | 99视频精品在线 | 男女视频91 | 81国产精品久久久久久久久久 | 草久热 | 日本久久久久久 | 一级黄色片毛片 | 色先锋资源网 | 国产精品免费久久久久影院仙踪林 | av在线之家电影网站 | 免费视频一二三区 | 国产精品嫩草影院99网站 | 涩涩资源网 | 日韩欧美一区二区三区在线 | 黄色毛片网站在线观看 | 亚洲精品一区中文字幕乱码 | 日韩精品视频第一页 | 国产精品手机看片 | 97在线播放 | 亚洲粉嫩av| 久久久久激情 | 在线观看成年人 | 视频精品一区二区三区 | 午夜视频一区二区三区 | 亚洲 中文 欧美 日韩vr 在线 | 免费a级大片 | 天天拍天天干 | 国产免费亚洲高清 | 久久国产精品久久精品国产演员表 | 婷婷在线五月 | 8x成人在线 | 在线国产专区 | 色大片免费看 | 国产免费人成xvideos视频 | 973理论片235影院9 | 在线观看理论 | 国产日本在线观看 | 99r精品视频在线观看 | 久久手机视频 | 国产aa精品 | 亚洲 欧美 91 | 91九色视频 | 蜜臀av在线一区二区三区 | 日韩精品久久中文字幕 | 久久久久网址 | 看片网站黄色 | 国产一区二区三区免费观看视频 | 国产精美视频 | 精品国产一区二区三区噜噜噜 | 超碰在线中文字幕 | 国产91在线免费视频 | 日韩高清一二区 | 国产98色在线 | 日韩 | 国产系列精品av | 国产视频色 | 97超碰国产精品女人人人爽 | 精品国内自产拍在线观看视频 | 丁香在线观看完整电影视频 | 亚洲成人黄色网址 | 一区在线观看视频 | www.五月婷 | 国产一区欧美在线 | 96精品在线 | 国产精品伦一区二区三区视频 | 在线中文字幕电影 | 国产电影一区二区三区四区 | 精品视频在线观看 | 国产探花视频在线播放 | 日韩国产精品久久 | 色综合久久久久久久久五月 | www亚洲一区 | 国产精品一区免费观看 | 一区 在线观看 | 国产成人综合图片 | 91精品视频在线播放 | 三级av免费| 久久综合综合久久综合 | 中文字幕色播 | 黄色三级免费观看 | aaa日本高清在线播放免费观看 | 婷婷日日 | 国产91在线播放 | 欧美高清视频不卡网 | 日本精品一区二区三区在线播放视频 | 免费色av| 97精品国产97久久久久久免费 | 九九在线高清精品视频 | 五月花激情| 中文国产字幕 | 久草视频在线免费看 | 中文字幕在线观看网站 | 亚洲激情六月 | 国产日韩欧美在线观看视频 | 国产一区二区三区网站 | 草久视频在线观看 | 我爱av激情网 | 中文字幕黄色 | h视频在线看 | 日韩四虎 | 成人永久在线 | 成人天堂网 | 亚洲无人区小视频 | 成人黄色国产 | 日韩欧美一区二区在线观看 | www.天天综合| 久久激情片 | 99热精品国产一区二区在线观看 | 性色va | 日本福利视频在线 | 九月婷婷综合网 | 狠狠色丁香婷婷综合久小说久 | 蜜臀av夜夜澡人人爽人人 | 日韩中文字幕91 | 久久精品aaa | 久久久午夜精品理论片中文字幕 | 欧美性视频网站 | 在线观看免费成人av | 国产精品 日韩 | 欧美一级片免费观看 | 国产一区二区在线播放 | 天天色官网 | 国产黄色片在线 | 日韩欧美在线观看一区二区三区 | 亚洲天天在线日亚洲洲精 | 国产精品成久久久久三级 | 天天色天天操天天爽 | 久草在线免费色站 | 一本色道久久综合亚洲二区三区 | www久| 日韩成人xxxx | 日日干天天操 | 日韩国产精品久久 | 在线观看视频 | 黄av免费| 久草在线视频网 | 久久国产精品99国产 | 欧美xxxx性xxxxx高清 | 1024在线看片 | www.久久久.cum| 久久人人艹 | 成人全视频免费观看在线看 | 国产在线成人 | 97电影院在线观看 | 国产高清成人 | 欧美日韩国产二区 | 亚洲精品国产精品久久99 | www.天天草 | 久久午夜色播影院免费高清 | 人人爽人人av | 永久免费视频国产 | 日韩精品视频免费看 | 91在线免费观看国产 | 日本中文字幕在线一区 | 99精品在线免费视频 | 久草视频在线免费播放 | 四虎最新入口 | 免费观看国产精品 | 黄色亚洲精品 | 天天色视频| 国产成人一区二区三区在线观看 | 97视频在线观看视频免费视频 | 欧美日bb | 日韩欧美在线第一页 | 在线观看一区视频 | 91在线精品秘密一区二区 | 日韩在线精品一区 | 国产精品久久99综合免费观看尤物 | 欧美亚洲专区 | 午夜视频在线观看一区二区三区 | 国产成人精品综合久久久久99 | 国产精品9999久久久久仙踪林 | 韩国精品一区二区三区六区色诱 | 日韩区在线观看 | 欧美怡红院视频 | 在线播放精品一区二区三区 | 成人免费网视频 | 亚洲网久久 | 香蕉久久久久 | 久久免费黄色 | 日韩欧美国产激情在线播放 | 在线播放日韩av | 在线a人片免费观看视频 | 成人中文字幕av | 黄色三级免费观看 | 91福利视频在线 | 久久五月精品 | 一区二区毛片 | 色综合久久中文综合久久牛 | 特级毛片网站 | 亚洲精品在线一区二区三区 | 国产99爱| 欧美激情综合五月色丁香 | 久久中文字幕视频 | 亚洲精品久久久久久久不卡四虎 | 免费在线观看91 | 久久精品理论 | 最近最新mv字幕免费观看 | 成人黄色电影在线观看 | 日韩免费电影在线观看 | 欧美一区二视频在线免费观看 | 国产精品一区二区免费视频 | 国产精品日韩在线观看 | 福利视频一二区 | wwwwww色| av最新资源| 国产精品精 | 狠狠干中文字幕 | 亚洲综合色丁香婷婷六月图片 | 成人小视频在线观看免费 | 久久香蕉影视 | av免费网站观看 | 国产99久久九九精品免费 | 99久热在线精品视频 | 国产成人333kkk | 视频国产区 | 欧美一级电影免费观看 | 777xxx欧美| 欧美极度另类性三渗透 | 国产九九九精品视频 | 成人免费在线视频观看 | 国产精品久久99精品毛片三a | 国产在线a | 欧美在线aaa | 免费在线观看av网站 | 国产在线一线 | 亚洲电影自拍 | 草久中文字幕 | 99在线观看视频 | 国产视频97 | 日韩av在线网站 | 精品视频免费播放 | 91资源在线 | 国产一区视频免费在线观看 | 五月婷香蕉久色在线看 | 亚洲国产欧美在线看片xxoo | 欧美日韩国产精品一区二区三区 | 久久亚洲免费视频 | 久久99亚洲精品 | 欧美怡红院视频 | 国产999免费视频 | 欧美日韩精品国产 | a视频免费看 | 国产亚洲aⅴaaaaaa毛片 | 青青草国产在线 | 99re国产视频 | 国产亚洲精品电影 | 丁香花中文在线免费观看 | 亚洲日本va中文字幕 | 免费网站看av片 | 亚洲综合激情小说 | 久久久久伊人 | 久久中文网 | 91九色porn在线资源 | 91av在线电影 | 99热9| 久久99操| 深爱激情站 | 色偷偷人人澡久久超碰69 | 不卡的av片| avove黑丝 | 973理论片235影院9 | 婷婷伊人综合亚洲综合网 | av在线免费在线观看 | 欧美性生交大片免网 | 91tv国产成人福利 | 日本三级全黄少妇三2023 | 中文字幕成人网 | 麻豆视频免费在线 | 成人欧美一区二区三区黑人麻豆 | 久久天天躁狠狠躁夜夜不卡公司 | 久久久www成人免费精品 | 欧美精品中文在线免费观看 | 久草在线欧美 | 免费a视频在线观看 | 人人干干人人 | 成人在线观看你懂的 | 欧美黄色高清 | 亚洲综合视频在线 | 婷婷在线不卡 | 天天插天天爱 | www.国产视频 | 91香蕉视频| 在线观看色视频 | 日韩精品欧美专区 | 天天操天天操天天操天天操天天操 | 日韩三区在线 | 国产精品短视频 | 亚洲综合网| 成年在线观看 | 精品免费一区 | 丁香九月婷婷综合 | 91资源在线视频 | 91成年人视频 | 国产九色视频在线观看 | 久久一区二区三区国产精品 | 亚洲一级电影视频 | 精品一区二区三区四区在线 | 色播六月天 | 国产探花视频在线播放 | 精品爱爱 | 日躁夜躁狠狠躁2001 | 91精品国产欧美一区二区成人 | 日本最新中文字幕 | 久久久久久久久久久久99 | 色狠狠综合| 女人18精品一区二区三区 | 色综合咪咪久久网 | 干干干操操操 | 久久久国产视频 | 欧美激情精品久久久久久免费 | 夜夜躁天天躁很躁波 | 国产99久久99热这里精品5 | 久保带人 | 激情综合中文娱乐网 | 久久夜色电影 | 日韩伦理一区二区三区av在线 | 波多野结衣网址 | 丁香av | 日韩.com| 91精品免费在线观看 | 国产特级毛片aaaaaa高清 | 日本精品视频一区二区 | 97超碰.com| 欧亚日韩精品一区二区在线 | 国产精品人人做人人爽人人添 | 亚洲激情 在线 | www.天天干 | 久久久免费精品国产一区二区 | 激情五月六月婷婷 | 一 级 黄 色 片免费看的 | 久久国产精品一区二区三区四区 | 91在线麻豆 | 色搞搞 | 国产精品免费视频久久久 | 91精品在线播放 | 蜜臀av.com| 在线免费国产 | 欧美日韩中文在线 | 精品欧美小视频在线观看 | 久草在线资源观看 | 国产视频九色蝌蚪 | 一区二区三区韩国免费中文网站 | 国产日韩欧美在线免费观看 | 日韩免费在线观看视频 | 国产女人免费看a级丨片 | 久久久精选 | .国产精品成人自产拍在线观看6 | 日本婷婷色 | 日本精品一区二区三区在线播放视频 | 国产在线观看,日本 | 综合色综合色 | 久久综合桃花 | 日韩午夜剧场 | 日韩电影在线看 | 毛片区| 91在线观看视频网站 | 天天躁日日躁狠狠躁av中文 | 操高跟美女 | 在线观看免费视频你懂的 | 久久精品一二三区白丝高潮 | 91粉色视频 | 成人av.com| 在线免费观看欧美日韩 | 国产福利一区二区三区视频 | av丁香花 | 一区二区三区四区免费视频 | 国语精品久久 | 在线观看国产亚洲 | 一区二区三区电影大全 | 最新超碰在线 | 国产大陆亚洲精品国产 | 色姑娘综合天天 | 日日干天天 | 国产精品丝袜久久久久久久不卡 | 亚洲v欧美v国产v在线观看 | 欧美精品二区 | 少妇搡bbbb搡bbb搡忠贞 | 色综合久久99 | 东方av免费在线观看 | 最近日本韩国中文字幕 | 综合网欧美 | 国产黄色资源 | 久久免费在线观看视频 | 午夜视频在线观看一区二区 | 成人av一二三区 | 色婷婷av一区二 | 国产一级免费播放 | 五月天久久久久久 | 国产黄色免费在线观看 | 国产福利网站 | 欧美激情第一区 | 99视频免费| 国产精品亚洲精品 | 久久精品专区 | 国产高清成人 | www免费黄色 | 中文字幕亚洲精品日韩 | 波多野结衣在线播放一区 | 日日夜夜网 | 国产人成看黄久久久久久久久 | 日韩免费成人 | 有码中文字幕在线观看 | 亚洲欧美精品在线 | 天天色天天操综合 | 在线日韩av| 亚洲精品国产高清 | 狠狠夜夜 | 日韩欧美精品一区二区 | 91天天操| 视频一区二区免费 | 欧美色图88 | 91网在线看| 亚洲人毛片 | 亚洲成成品网站 | 91精品免费在线 | 香蕉视频免费在线播放 | 麻豆成人网 | 久久这里只有精品久久 | 狠狠操狠狠干2017 | 国产视频二区三区 | 欧美日韩精品在线播放 | 国产精品爽爽爽 | 天堂av最新网址 | 天天操夜夜操天天射 | 黄色免费在线看 | 中文字幕av免费在线观看 | 午夜视频在线观看一区二区三区 | 日韩v在线| 91丨精品丨蝌蚪丨白丝jk | 欧美久久久久久久久中文字幕 | 中文字幕在线看片 | 日韩电影在线观看中文字幕 | 国内精品久久久久久 | 久久视频一区 | 亚洲精品9| 狠狠色狠狠色综合系列 | 国产精品久久久久一区二区 | 亚洲精品中文在线 | 97超碰在线久草超碰在线观看 | 久久久私人影院 | 91香蕉视频色版 | 亚洲精品在线观看的 | 婷婷九月丁香 | 在线一区电影 | 婷婷av综合 | av怡红院 | 色综合天天狠天天透天天伊人 | 97人人澡人人添人人爽超碰 | 亚洲欧洲国产日韩精品 | 国产xx视频| 久久久午夜精品福利内容 | 成人免费视频观看 | 国产日韩欧美精品在线观看 | 福利视频午夜 | 99免费在线视频观看 | 国产资源在线免费观看 | 欧美日韩在线精品一区二区 | 91九色精品国产 | 国产美女精品视频 | 999视频在线播放 | 毛片无卡免费无播放器 | 美女视频黄的免费的 | 碰超在线 | 一区二区三区韩国免费中文网站 | 国产精品99在线播放 | 成+人+色综合 | 男女免费av| 久久国产免费 | 美女久久视频 | 夜夜狠狠 | 美国av片在线观看 | 亚洲精品一区二区在线观看 | 成人一区二区在线 | 久久视频中文字幕 | 久久久久成人免费 | 国产成人av在线影院 | 在线播放精品一区二区三区 | 色综合天天爱 | 国产一级视屏 | 福利区在线观看 | 精品久久九九 | 成人福利在线观看 | 97视频免费观看2区 亚洲视屏 | 国产一及片 | 中文字幕免费高清在线观看 | av7777777 | 欧美日韩精品在线观看 | 亚洲精品中文字幕在线观看 | 亚洲最大av在线播放 | 久久久国产精华液 | 国产成人精品综合久久久 | 免费国产在线精品 | 蜜臀av在线一区二区三区 | av亚洲产国偷v产偷v自拍小说 | 成人午夜精品福利免费 | 久久久久久久久久毛片 | 中文字幕欧美日韩va免费视频 | 国产精品美女 | 欧美日产一区 | 99国产在线观看 | 在线之家免费在线观看电影 | 成人国产精品一区二区 | 国产麻豆果冻传媒在线观看 | 久国产在线播放 | 日韩三级.com | 婷婷日韩| 人人看人人 | 久久免费av电影 | 亚洲麻豆精品 | 久久久精品国产免费观看一区二区 | 在线色资源 | 嫩草av影院| 久久开心激情 | 在线久久 | a在线免费 | 色婷婷激情电影 | 国产成人精品一区二区在线 | 国产视频观看 | 国产欧美在线一区 | 黄色大片免费播放 | 亚洲国产免费 | 99久久一区 | 蜜臀久久99精品久久久久久网站 |