日韩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介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

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

五月开心婷婷 | 亚洲一区网站 | 久久精品国产一区 | 97精品国产一二三产区 | 国产小视频免费观看 | 精品国产诱惑 | 色综合久久五月天 | 97在线超碰| 国产高h视频 | 国产日韩精品在线观看 | 狠狠狠狠狠狠狠 | 色久网| 国产精品视频不卡 | 日本爱爱免费视频 | 精品国产a| 美女黄网站视频免费 | 91成人精品国产刺激国语对白 | 成人a在线| 91桃色在线观看视频 | 伊人久久电影网 | 国产精品毛片一区二区在线 | 久久这里精品视频 | 四虎国产精品免费 | 欧美一级特黄aaaaaa大片在线观看 | 国产流白浆高潮在线观看 | av在线免费播放网站 | 中中文字幕av在线 | 深爱开心激情网 | 日韩高清一二区 | 亚洲精品成人在线 | av资源免费在线观看 | 深爱开心激情 | 91精品国产综合久久婷婷香蕉 | 狠狠色狠狠色合久久伊人 | 日本在线观看中文字幕 | 久久天堂亚洲 | 国产一级免费观看视频 | 成人9ⅰ免费影视网站 | 中文字幕在线看视频国产中文版 | 国产精品美乳一区二区免费 | 色窝资源 | 亚洲精品97 | 免费在线精品视频 | 黄污视频网站大全 | 综合天天 | av午夜电影| 国产精品99久久免费观看 | avhd高清在线谜片 | 久久99热这里只有精品国产 | 天天干人人 | 在线不卡a | 视频国产在线观看18 | 天天色天天骑天天射 | 最新真实国产在线视频 | 亚洲乱码在线观看 | 精品国产视频在线观看 | 免费三级黄 | 日韩动漫免费观看高清完整版在线观看 | 最新中文字幕在线资源 | 一区二区三区电影 | 97视频在线观看免费 | 91福利影院在线观看 | 色国产精品一区在线观看 | 人人干人人搞 | 国产夫妻av在线 | 在线免费成人 | 激情网婷婷 | 韩国精品福利一区二区三区 | 午夜视频在线观看一区二区三区 | 永久免费观看视频 | 精品91在线| 在线播放日韩av | 久久99久久99精品免观看粉嫩 | 国产一级电影在线 | 日韩免费电影网站 | 天天操天天操天天操天天操 | 国产精品久久久久久模特 | 国产一级不卡毛片 | 在线免费视频a | 久久免费成人网 | 午夜精品久久久久久久99热影院 | 精品理论片| 九九热免费观看 | 免费视频你懂的 | 国产精品久久久久久久久搜平片 | 色播五月激情五月 | 天天爽夜夜操 | 国产精品精品视频 | 91麻豆国产福利在线观看 | 色综合久久66| 黄色三级在线观看 | 久久久久女人精品毛片 | 日韩一区二区三 | 超碰97人人在线 | 永久免费精品视频 | 欧美 另类 交 | 中文字幕在线播出 | 精品福利视频在线 | 亚洲精品视频网站在线观看 | 国内精品久久久久久久 | 91精品啪在线观看国产 | 亚洲日韩欧美一区二区在线 | 色综合天天天天做夜夜夜夜做 | 亚洲最大在线视频 | 丁香狠狠| 久久不卡电影 | 国产精品久久久久久久久久白浆 | 亚洲综合视频在线 | av夜夜操 | 亚洲综合色视频 | 国产精品精品国产 | 国产一区二区在线观看视频 | www.狠狠操.com | 亚洲精品欧美专区 | 黄色激情网址 | 一区二区视 | 中文字幕电影网 | 久久亚洲免费 | 东方av在线免费观看 | 亚洲黄色激情小说 | 中文字幕麻豆 | 成人毛片网 | 狂野欧美激情性xxxx欧美 | 天天干中文字幕 | 久草热久草视频 | 激情婷婷久久 | 久久综合9988久久爱 | 又黄又爽又色无遮挡免费 | 国产探花 | 国产成人专区 | 最近更新好看的中文字幕 | 欧美日韩激情视频8区 | 亚洲三级视频 | 国产淫a | 日韩在线电影观看 | 天天综合网入口 | 久久网址| 日本一区二区三区免费看 | 天天做日日做天天爽视频免费 | 丁香狠狠| 日韩在线视频在线观看 | 91精品久久久久久久久 | 免费福利小视频 | 视频国产 | 久久99影院| 99视频免费播放 | 久久蜜臀av | 日韩在线精品一区 | 免费观看黄 | 国产精品18久久久久久久久 | 国产一级精品视频 | 欧洲视频一区 | 99中文视频在线 | 国产精品一区二区av影院萌芽 | 91最新中文字幕 | 成人午夜影院在线观看 | 国产在线不卡精品 | 亚洲国产一区二区精品专区 | 亚洲精品国偷自产在线99热 | 国产伦精品一区二区三区… | 一区二区三区日韩视频在线观看 | 久久精选 | 免费av黄色| av免费电影网站 | 日韩在线观看网站 | 韩国av三级 | 国产精品欧美在线 | 一区二区三区高清不卡 | 国产一级视频免费看 | 国产精品久久一区二区三区不卡 | 国产精品免费看久久久8精臀av | 久久久久福利视频 | 久久观看免费视频 | 国产欧美精品一区二区三区 | 国产成人精品一区二区在线 | 天天操夜夜操天天射 | 麻豆免费视频网站 | 黄污网站在线观看 | 麻豆播放| 欧美日韩免费看 | 1024在线看片 | 亚洲欧洲在线视频 | www.久久视频| 久久优| 国产91免费在线观看 | 波多野结衣精品视频 | 美女久久久久 | 久久综合导航 | 精品国产乱码久久 | 久久看免费视频 | 少妇资源站 | 日韩av资源站 | 日韩视频一区二区三区 | 色综合天天综合在线视频 | 成年人免费看 | 九九热国产视频 | av成人亚洲| 国产小视频在线免费观看视频 | 99精品欧美一区二区蜜桃免费 | 国产精品久久久久国产精品日日 | 91热在线 | 国产99免费 | 国产精品欧美精品 | 国产美女视频免费观看的网站 | 免费在线观看不卡av | 99精品国产兔费观看久久99 | 去看片 | 天天射天天干 | 久久精品免费观看 | 成人午夜网 | 久久视频在线 | 免费观看一级一片 | 国产成人一区二区三区免费看 | 国产在线视频资源 | av丝袜在线 | 99热这里只有精品国产首页 | 97超碰色 | 婷婷国产视频 | 91精品国产综合久久久久久久 | 日本中文字幕网 | 国产中文字幕在线免费观看 | 亚洲播放一区 | 9999激情 | 91资源在线观看 | 色精品视频 | 97综合在线| 久久伦理电影 | 亚洲视频免费在线 | 欧美在线视频a | 九九九视频精品 | 欧美性色综合网站 | 日韩一区二区三区观看 | 久久久国产影院 | 中文一二区 | 五月天伊人| 日本精品视频免费观看 | 狠狠色丁香婷婷 | 国产99久久九九精品免费 | 97视频在线免费观看 | 日韩综合视频在线观看 | 中文字幕在线成人 | 亚洲视频 中文字幕 | 亚洲激情综合 | 三级黄色在线观看 | 免费观看的黄色 | 久久一二三四 | 欧美调教网站 | 亚洲精品一区二区三区在线观看 | 久艹视频在线免费观看 | 天海翼一区二区三区免费 | 99精品视频在线播放观看 | 成人免费色 | 99精品观看| www国产在线 | 亚洲激情中文 | 日韩欧美一区二区三区免费观看 | 不卡精品| 国产日韩欧美在线影视 | 久久精品免费电影 | 国产精品久久久久久久久久东京 | 婷婷色在线 | 亚洲精品在线一区二区 | 久久a级片 | 久草视频免费在线观看 | 成人精品国产 | 亚洲高清激情 | 亚洲精品高清一区二区三区四区 | av久久在线 | 久久看片网站 | 国产成人精品一区二三区 | 久久国产精品网站 | 黄色a视频 | 国产伦精品一区二区三区高清 | 免费黄色网址大全 | 精品成人免费 | 久久综合中文色婷婷 | 久久爱992xxoo | 久久黄色网页 | 中文字幕成人网 | 国产精品你懂的在线观看 | 中文一区二区三区在线观看 | 少妇搡bbbb搡bbb搡忠贞 | 97免费视频在线播放 | 国产性xxxx | 久久久久久激情 | 波多野结衣久久资源 | 狠狠干婷婷 | 天天曰视频 | 天天插视频 | 国产精品入口麻豆 | 国产尤物在线 | 免费十分钟 | 国产精品视频大全 | 国产污视频在线观看 | 亚洲va欧美 | 黄色成人影院 | 激情网在线视频 | 黄色特级片| 精品视频一区在线 | 色资源在线观看 | 中文字幕免费久久 | 欧美日韩一级久久久久久免费看 | 色婷婷激情四射 | 深夜成人av| 最近日本韩国中文字幕 | 日韩黄色在线 | 婷婷久久综合九色综合 | 久久中文字幕视频 | 日韩午夜剧场 | 日韩啪啪小视频 | 精品999在线观看 | 又黄又爽的免费高潮视频 | 久久精彩视频 | 国产精品视频永久免费播放 | 久久久久久久久久免费 | 色搞搞| 欧洲亚洲国产视频 | 国产日产亚洲精华av | 国产护士av | 波多野结衣在线播放一区 | 黄色片免费在线 | 麻豆视频一区 | 午夜精品久久久久久久99水蜜桃 | 亚洲一区二区视频在线播放 | 亚洲精品视频免费在线 | 久久精品艹 | 91免费版在线观看 | 人人插人人搞 | 久久婷婷一区二区三区 | 99精品一区 | 欧美性视频网站 | 懂色av懂色av粉嫩av分享吧 | 色视频在线免费观看 | 四虎在线观看精品视频 | 99热最新| 欧美日韩精品国产 | 97免费视频在线播放 | 国产日韩欧美综合在线 | 国产成本人视频在线观看 | 日韩电影一区二区三区在线观看 | 伊人伊成久久人综合网小说 | 最近中文字幕免费av | 亚洲精品五月 | 成人av免费| 天天天插| 狠狠狠狠狠狠狠干 | 久久毛片高清国产 | 国产精品黄网站在线观看 | 肉色欧美久久久久久久免费看 | 欧美成人高清 | 国产精久久久久久妇女av | 毛片一级免费一级 | 在线电影日韩 | 开心色激情网 | 免费成人黄色av | 一区二区三区国产精品 | 国产麻豆剧传媒免费观看 | 操操综合网| 久久这里只有精品9 | 丝袜少妇在线 | av大片免费看 | 欧美成人精品欧美一级乱黄 | 精品久久网 | 色综合夜色一区 | 久草免费在线观看 | 国产一区二区日本 | 97伊人网| 五月激情片 | 欧美另类交人妖 | 麻豆一二三精选视频 | 天天艹天天爽 | 在线影视 一区 二区 三区 | 久久精品人人做人人综合老师 | 丁香网五月天 | 91在线永久| 国产91学生粉嫩喷水 | 成人久久久久 | 国产一区视频在线观看免费 | 一区二区免费不卡在线 | 97在线观视频免费观看 | 青青草在久久免费久久免费 | 国产精品一区二区av日韩在线 | 精品视频97| 日本不卡视频 | 午夜国产一区二区三区四区 | 日韩国产精品毛片 | 久草网站 | 亚洲高清在线 | 中文字幕色在线视频 | 精品国产日本 | 三级av小说 | 精品国产视频在线观看 | 成年人在线观看视频免费 | 五月天久久综合网 | 天天天天天天天天操 | 五月天,com | 3d黄动漫免费看 | 精品99视频| 婷婷丁香色 | 在线观看国产一区 | av免费电影在线观看 | 99色资源 | 五月婷婷丁香六月 | 精品久久久久久久久久久久久久久久久久 | 亚洲人片在线观看 | 精品国偷自产在线 | 日本三级中文字幕在线观看 | 黄a网| 中文字幕在线观看视频免费 | 在线v片免费观看视频 | a黄色片在线观看 | 伊人天堂av| 亚洲精品午夜久久久久久久久久久 | 超碰日韩 | 国产原创av在线 | 婷婷在线色| 91av在线看 | a在线免费观看视频 | 久久久国产一区二区三区四区小说 | 久久国产精品99国产 | 中文字幕久久久精品 | 天天操狠狠操网站 | 999视频在线播放 | 午夜精品视频一区 | 在线观看久久久久久 | 久久久久久久国产精品视频 | av理论电影| 国产精品乱码久久久久久1区2区 | 在线观看免费一区 | 九九爱免费视频在线观看 | 男女激情免费网站 | 91免费的视频在线播放 | 日韩av在线免费看 | 国产精品 日韩 欧美 | va视频在线 | 免费看国产一级片 | 欧美日韩午夜爽爽 | 久草网在线 | 亚洲精品乱码久久久久久久久久 | 日韩视频免费观看高清 | 在线观看免费av网 | 国产精品毛片久久久久久久久久99999999 | 夜夜嗨av色一区二区不卡 | 日日夜夜艹 | 久草免费看 | 国产高清99 | 丁香在线视频 | 欧美成人理伦片 | 日批视频在线观看免费 | 五月开心网| 国产精品99久久久久久人免费 | 99精品免费视频 | 色综合久 | 亚洲精品女 | 国产 在线观看 | 日韩久久精品一区二区 | 美女视频黄色免费 | 久久国产视屏 | 91九色视频观看 | 精品国产免费一区二区三区五区 | 91av在线看 | 国产精品12 | 丁香九月婷婷综合 | 日日干天天操 | 日韩精品无 | 天天玩天天操天天射 | 久草com | 亚洲免费在线观看视频 | 成人一级免费电影 | 久久久91精品国产一区二区精品 | 日韩精品欧美精品 | 久久久精品亚洲 | 国产99久久九九精品 | 国产精品高清在线 | 中文字幕字幕中文 | 天堂av在线中文在线 | 日韩在线观看电影 | 久久蜜臀一区二区三区av | 夜夜婷婷 | 九七视频在线观看 | 国产精品一区久久久久 | 91精品视频在线观看免费 | 久久精品国产免费看久久精品 | 亚洲欧美日韩国产一区二区三区 | 精品国产一区二区在线 | 丁香婷五月 | 在线视频 精品 | 欧美va天堂va视频va在线 | 99热国产在线中文 | 看av免费 | 欧美日韩国产精品一区二区三区 | 久久久久久久久毛片 | 91一区二区三区久久久久国产乱 | 亚洲综合成人av | 黄色一级网 | 在线视频手机国产 | 国产福利网站 | 美女免费视频观看网站 | 欧美午夜视频在线 | a在线播放 | 日韩精品一区二区三区丰满 | 97视频免费在线观看 | 亚洲另类xxxx | av久久久 | 欧美一级性生活视频 | 国产成人在线观看免费 | 亚洲国产成人在线 | 成人高清在线观看 | 日日狠狠 | 不卡av在线免费观看 | 九九热视频在线免费观看 | 久草视频免费在线播放 | 四虎在线观看网址 | av成人免费| 国产精品久久久久久妇 | 欧美在线观看视频免费 | 亚洲激色 | 欧美日本啪啪无遮挡网站 | 精品国产乱码一区二区三区在线 | 国产成人精品久久久久 | 亚洲另类视频在线观看 | 蜜臀久久99精品久久久久久网站 | 99久久影视 | 国产精品久久久久久麻豆一区 | 91成人午夜 | 久久专区| 欧美性生交大片免网 | 亚洲精品看片 | 欧美一级激情 | 国产精品乱码久久久久久1区2区 | 水蜜桃亚洲一二三四在线 | 免费在线观看的av网站 | 97超碰在线资源 | 免费看的国产视频网站 | 久久久国产成人 | 国产精品久久一区二区三区不卡 | 久久久久久久99 | 在线视频观看你懂的 | 久久精品国产精品亚洲 | 久久99久国产精品黄毛片入口 | 亚洲综合情 | 日韩免费在线播放 | 狠狠色丁香婷婷综合欧美 | 东方av在 | 久久国产影院 | 在线视频一二三 | 视频国产区 | 97精品欧美91久久久久久 | 9在线观看免费高清完整版在线观看明 | 亚洲精品456在线播放乱码 | 涩涩网站在线播放 | 久久99国产精品久久99 | 久久夜色精品国产欧美一区麻豆 | 国产精品丝袜在线 | 欧美在线观看禁18 | 四虎在线免费视频 | 91麻豆精品国产91久久久久久 | 国产精品高清免费在线观看 | 国产专区在线视频 | 福利电影久久 | 天天操天天摸天天射 | 国产一区二区精品91 | 91精品视频一区 | av黄色亚洲| 色婷婷99 | 国产香蕉97碰碰碰视频在线观看 | 国产va饥渴难耐女保洁员在线观看 | 亚洲欧美日韩一区二区三区在线观看 | 精品二区视频 | 在线观看一 | 91亚洲精品在线 | 亚洲国产精品500在线观看 | 久久观看最新视频 | 在线观看播放av | 日韩四虎| 日本爽妇网 | 久草在线视频首页 | 亚洲欧洲av在线 | 91福利区一区二区三区 | 成年人免费看片网站 | 日韩精品在线免费播放 | 欧美日韩在线看 | 日韩中字在线 | 黄色视屏免费在线观看 | 四虎成人精品永久免费av | 亚洲专区路线二 | 免费视频久久 | 91精品爽啪蜜夜国产在线播放 | 又黄又爽又刺激 | 超碰在线天天 | 免费国产一区二区视频 | 久久久久久蜜av免费网站 | 蜜臀av麻豆| 中文字幕av全部资源www中文字幕在线观看 | 国产成人久久精品一区二区三区 | 日韩美在线| 日韩有码网站 | 少妇按摩av | 999国内精品永久免费视频 | 色综合天天射 | 一区二区三区在线影院 | 最近日本中文字幕a | 成人va视频 | 玖玖玖影院 | 九九久久免费 | 欧美片网站yy | 91天堂素人约啪 | 黄色av一级| 青青草国产精品视频 | 99精品在线播放 | 成人在线免费小视频 | 亚洲午夜精 | 在线视频欧美日韩 | 欧美激情视频一区二区三区免费 | 亚洲精品一区二区网址 | 又色又爽又激情的59视频 | 国产亚洲久一区二区 | 国产精品麻豆免费版 | 深夜激情影院 | 国产永久网站 | 人人干在线 | 亚洲精品玖玖玖av在线看 | 少妇bbw搡bbbb搡bbb | 久久久国产精品一区二区三区 | 国产 av 日韩 | 91人人澡| 国产一级片一区二区三区 | 国产一级黄色片免费看 | 亚洲一区黄色 | 久草视频在线资源 | 婷婷丁香久久五月婷婷 | 中文字幕成人在线观看 | 黄色精品在线看 | 97视频在线免费 | 在线日本看片免费人成视久网 | 久久精品欧美一区 | 色999精品 | 五月天亚洲综合小说网 | 久久久久久久久毛片 | 在线视频你懂得 | 久久国产精品99久久久久 | 国产一区自拍视频 | avhd高清在线谜片 | 日韩欧美在线视频一区二区 | 天天综合天天做天天综合 | 亚洲成aⅴ人片久久青草影院 | japanese黑人亚洲人4k | 新版资源中文在线观看 | 五月开心六月婷婷 | 五月天电影免费在线观看一区 | 一区二区三区免费在线 | 国产精品不卡在线 | 亚洲高清视频在线播放 | 91女神的呻吟细腰翘臀美女 | 六月色丁 | 免费在线国产视频 | 精品国产欧美一区二区三区不卡 | 三级av在线免费观看 | 国产精品久久久久久一区二区 | 国产成人亚洲在线电影 | 久久免费中文视频 | 91三级视频 | 91在线观看欧美日韩 | 亚洲免费在线观看视频 | 99国产视频 | 精品一二三区视频 | 亚洲一本视频 | 99精品国产99久久久久久97 | 人人爽人人爽人人爽人人爽 | 国产97在线观看 | 在线视频免费观看 | 亚洲二区精品 | 成人午夜久久 | 久久婷婷国产色一区二区三区 | 久久久久观看 | 国产不卡av在线播放 | 在线免费观看视频一区 | 国产在线观看你懂的 | 麻豆精品视频在线观看免费 | 精品美女国产在线 | 丁香婷婷综合激情五月色 | 亚洲男男gaygay无套 | 狠狠干夜夜操 | 成人福利在线 | 爱色婷婷 | 国产99久久久欧美黑人 | 中文字幕有码在线观看 | 黄色三级免费网址 | 五月亚洲| 91亚洲国产成人久久精品网站 | 91在线视频导航 | 激情综合电影网 | 手机av观看| 天天操天天操天天 | 日韩精品中文字幕在线 | 日韩艹| 香蕉视频免费看 | 欧美亚洲久久 | 欧美黄色高清 | 亚洲精品黄色片 | 天天草天天操 | 五月婷婷六月丁香在线观看 | 欧美日韩另类在线观看 | 色狠狠久久av五月综合 | 在线免费观看欧美日韩 | 精品国产视频在线 | 久草久热| www久久久 | 九九在线国产视频 | 99久免费精品视频在线观看 | 国产日韩在线视频 | 日本最新一区二区三区 | 99国产一区 | 国产一区影院 | 在线观看亚洲免费视频 | 国产免费视频一区二区裸体 | 国产成人中文字幕 | 亚洲精品在线二区 | 久久久久久久久久久网 | 国产原创中文在线 | 毛片888 | 四虎8848免费高清在线观看 | 日免费视频| 亚洲色图27p | 免费在线国产视频 | 久久综合亚洲鲁鲁五月久久 | 国产精品麻 | 国产在线精品一区二区三区 | 欧美国产日韩久久 | 日韩在线观看视频中文字幕 | 天天天操操操 | 久久久久久中文字幕 | www.久久视频 | 色大片免费看 | 亚洲黄色影院 | 午夜精品一二区 | 日本免费久久高清视频 | 亚洲jizzjizz日本少妇 | 免费观看一级视频 | 午夜国产影院 | 久久成人一区 | 国产精品久久99综合免费观看尤物 | 亚洲欧美国产精品久久久久 | 狠狠躁夜夜av | 99热这里是精品 | 久久精品久久久精品美女 | 人人草在线观看 | 91网站在线视频 | 国产精品剧情在线亚洲 | 久久夜色电影 | 久久综合影音 | 国产亚洲精品综合一区91 | 天堂av在线中文在线 | 九色porny真实丨国产18 | 黄色一区三区 | 欧美性成人 | 美女国产网站 | 免费美女久久99 | 亚洲永久精品国产 | 四虎国产精品免费观看视频优播 | 成av人电影| 国产精品视频免费观看 | 久久99久国产精品黄毛片入口 | 中文字幕在 | 97在线视频观看 | 很黄很黄的网站免费的 | 国产69久久| 激情欧美丁香 | 国产精品无av码在线观看 | 婷婷色中文 | 青青河边草免费直播 | av福利网址导航 | 狠狠狠狠狠狠狠狠 | 97在线观看免费观看高清 | 亚洲精品久久久久久久不卡四虎 | 日本黄色a级大片 | 六月丁香综合 | 少妇bbb搡bbbb搡bbbb | 91免费观看国产 | 久久免费视频6 | 成人免费观看大片 | 国产精品一区二区三区久久 | 日日干激情五月 | 在线中文字幕观看 | 狠狠色丁香久久婷婷综合丁香 | 在线视频久 | 亚洲综合在线视频 | 一本之道乱码区 | 久久久男人的天堂 | 日韩不卡高清视频 | 日韩免费看片 | 久久精品国产一区二区三区 | 亚洲成人免费在线 | 深爱开心激情网 | 黄色com | 黄色视屏免费在线观看 | 精品国产亚洲日本 | 久久精品视频免费播放 | 国产精品久久久久av福利动漫 | 欧美日韩免费一区二区 | 国产一级在线观看 | 91九色porny在线 | 在线中文字母电影观看 | 狠狠狠色| 天堂在线一区 | 在线视频麻豆 | 中文在线8资源库 | 日本久久久久久科技有限公司 | 亚洲精品黄色 | 日日夜夜婷婷 | av成人在线播放 | 91x色| 91热爆在线观看 | 狠狠操91| 不卡的av片| 日韩精品不卡在线观看 | 国产手机在线观看 | 黄色激情网址 | 丝袜美腿在线 | 久久免费在线观看视频 | 狠狠久久| 日日操狠狠干 | 欧美少妇xxxxxx| 91精品久久久久久综合乱菊 | 在线精品一区二区 | 国产色婷婷 | 91大神在线观看视频 | 日韩理论在线观看 | 午夜私人影院 | 国产午夜精品一区二区三区嫩草 | 久久成人视屏 | 亚洲免费公开视频 | 久久精品网站视频 | 免费网站v | 999国产在线 | 麻豆视频国产在线观看 | 亚洲自拍偷拍色图 | 天天摸夜夜操 | 欧美日高清视频 | 天天做日日做天天爽视频免费 | 国产xx在线 | 国产生活一级片 | 一性一交视频 | 天天碰天天操视频 | 四虎影视成人 | 亚洲精品乱码久久久久久写真 | 99精品毛片 | 99色免费| 日韩大片免费在线观看 | 国产精品女主播一区二区三区 | 久久久精品国产一区二区三区 | 久久国产精品免费观看 | 久久激情五月丁香伊人 | 日本中文字幕在线电影 | 在线观看91视频 | 欧美激情视频一二区 | 天天精品视频 | 亚洲天堂网在线视频 | 国产成人三级在线观看 | 狠狠色噜噜狠狠狠狠2022 | 三级黄色片在线观看 | 天天干天天插 | 蜜桃av人人夜夜澡人人爽 | 国产午夜精品理论片在线 | 精品亚洲欧美一区 | 久草电影免费在线观看 | 久久精品99久久 | www成人精品 | 丰满少妇在线观看资源站 | 免费在线观看成人小视频 | 国产日韩精品一区二区三区在线 | 中文字幕在线播放第一页 | 国产一区av在线 | 欧美日韩伦理在线 | 狠狠干.com | 中文字幕综合在线 | 深爱激情五月网 | 伊人狠狠色丁香婷婷综合 | 欧美日韩免费一区 | 亚洲综合小说 | 日黄网站 | 最新国产在线 | 日韩中文字幕a | 人人爽网站 | 国产福利一区二区三区视频 | 美女黄久久 | 狠狠干中文字幕 | 9999精品 | 欧美日韩国产精品一区二区三区 | 精品一区电影 | aⅴ精品av导航 | 国内精品小视频 | 欧美日韩视频在线一区 | 久久婷婷五月综合色丁香 | 欧美三级在线播放 | 国精产品满18岁在线 | 91高清视频免费 | 久久桃花网 | 在线国产一区二区 | 国产精品第一页在线 | 婷婷在线免费视频 | 免费亚洲婷婷 | 亚洲男模gay裸体gay | 色婷婷精品 | 狠狠狠狠狠狠 | 久久精品www人人爽人人 | 欧美日韩在线视频免费 | 手机看片1042| 亚洲日日日 | 亚洲精品女人久久久 | 99色国产 | 久草在线视频网站 | 中文字幕日韩有码 | 国产黄a三级三级三级三级三级 | 精品久久久久久久久久久院品网 | 色偷偷人人澡久久超碰69 | 激情视频在线观看网址 | 国产精品男女 | 久久久久久久福利 | 91精品伦理| av3级在线 | 亚洲,播放| 久久国产精品99久久久久 | 亚洲成人精品国产 | 激情久久婷婷 | 亚洲精品啊啊啊 | 一级片视频在线 | 国产只有精品 | 久草视频资源 | 天天舔天天搞 | 久久九九国产视频 | 韩国av永久免费 | 99精品视频在线观看免费 | 欧美另类z0zx | 天堂av色婷婷一区二区三区 | 久久精品久久精品久久39 | 国产91影院 | 成人av av在线 | 亚洲高清不卡av | 欧美色图亚洲图片 | 欧美日韩二区在线 | 特黄免费av | 九色琪琪久久综合网天天 | 国产精品热视频 | 国产精品免费看 | 99精品偷拍视频一区二区三区 | 97超碰中文 | 国产视频资源在线观看 | 国产免费叼嘿网站免费 | 人人草人人草 | 日韩精品一区二区三区丰满 | 九色精品免费永久在线 | 国产高清一| 日韩av在线小说 | 国产麻豆精品95视频 | 日韩激情视频 | 日韩一区二区三 | 超碰在线人 | 99久久精| 91精品啪 | 色综合久久久久久久久五月 | 中文字幕电影网 | 麻豆 91 在线 | 91九色成人蝌蚪首页 | 天天爽综合网 | 久久国产高清视频 | 日韩欧美高清一区二区 | 激情婷婷在线观看 | 国产亚洲人成网站在线观看 | 毛片激情永久免费 | 三级a毛片 | 日韩视频一二三区 | 日韩一区二区三区在线观看 | 波多在线视频 | 亚洲国产99| 国产精品免费观看网站 | 欧美精品乱码久久久久久按摩 | 久久a v视频| 久久99精品热在线观看 | 2023国产精品自产拍在线观看 | 国产五月色婷婷六月丁香视频 | 天天超碰 | 超碰在线人人 | 美女免费av | 在线观看国产永久免费视频 | 成人中文字幕+乱码+中文字幕 | 久久精美视频 | 成人午夜黄色影院 | 日本99精品| 亚洲精品456在线播放第一页 | 天天曰天天干 | 国产精品av在线 | 国产精品麻豆果冻传媒在线播放 | 国产精品久久久久久久久久久久 | 日日干夜夜操视频 | 日韩精品久久久久久久电影99爱 | 国产精品手机播放 | aav在线 |