iOS逆向工程使用LLDB的USB連接調(diào)試第三方App
LLDB是Low Level Debugger的簡(jiǎn)稱,在iOS開(kāi)發(fā)的調(diào)試中LLDB是經(jīng)常使用的,LLDB是Xcode內(nèi)置的動(dòng)態(tài)調(diào)試工具。使用LLDB可以動(dòng)態(tài)的調(diào)試你的應(yīng)用程序,如果你不做其他的額外處理,因?yàn)閐ebugserver缺少task_for_pid權(quán)限,所以你只能使用LLDB來(lái)調(diào)試你自己的App。那么本篇博客中就要使用LLDB來(lái)調(diào)試從AppStore下載安裝的App,并且結(jié)合著Hopper來(lái)分析第三方App內(nèi)部的結(jié)構(gòu)。LLDB與Hopper的結(jié)合,會(huì)讓你看到不一樣的東西,本篇博客就會(huì)和你一起領(lǐng)略LLDB與Hopper的魅力。
一、SSH的USB連接--usbmuxd
之前我們ssh連接iOS設(shè)備是通過(guò)局域網(wǎng)也就是WiFi來(lái)連接的,當(dāng)網(wǎng)絡(luò)環(huán)境不好的時(shí)候輸入個(gè)命令行都卡,所以我們需要一種更快的訪問(wèn)iOS設(shè)備的方式,那就是使用USB連接了。本篇博客中無(wú)論是SSH連接iOS設(shè)備還是LLDB連接iOS設(shè)備,我們都使用USB的方式進(jìn)行設(shè)備的訪問(wèn),這樣速度就快的不行不行的了。本篇博客的第一部分就是介紹如何使用USB進(jìn)行設(shè)備的SSH連接,這部分也是本篇博客的基礎(chǔ),不過(guò)內(nèi)容還算是簡(jiǎn)單。
1、獲取usbmuxd
usbmuxd雖然目前最新的版本是1.1.0,但是1.1.0版本和1.0.9版本僅支持Linux系統(tǒng),也就是說(shuō)我們的Mac還是得下載v1.0.8的版本,下載地址(usbmuxd-v1.0.8)。下載完后,將下載的文件進(jìn)行解壓,內(nèi)容如下所示:

2.使用usbmuxd連接iOS越獄設(shè)備(1) 使用usbmuxd轉(zhuǎn)發(fā)接口
切換到上述文件夾下的python-client目錄下,執(zhí)行下方的命令,將iOS上的22端口轉(zhuǎn)發(fā)到當(dāng)前設(shè)備的2221端口,如下所示。
./tcprelay.py -t 22:2221
下方是執(zhí)行上述命令的結(jié)果:

(2) 使用ssh連接到越獄設(shè)備
ssh root@localhost -p 2222
上述命令就是ssh連接的命令 -p后邊緊跟的是上述轉(zhuǎn)發(fā)的端口,執(zhí)行上述命令后,結(jié)果如下:

使用usbmuxd就可以通過(guò)USB來(lái)連接我們的iOS越獄設(shè)備了,下方的LLDB連接iOS設(shè)備也是通過(guò)USB連接的。具體請(qǐng)看下文。
二、配置debugserver
在做iOS開(kāi)發(fā)時(shí),在Mac上輸入LLDB的命令就可以控制iOS端的App,是因?yàn)樵谖覀僫OS客戶端中有一個(gè)debugserver服務(wù)器。debugserver專門(mén)用來(lái)連接Mac端的LLDB客戶端,接收LLDB所提供的命令,并且進(jìn)行相應(yīng)的執(zhí)行。如果你的iOS設(shè)備進(jìn)行過(guò)真機(jī)調(diào)試的話,設(shè)備中就會(huì)被安裝上debugserver, 不過(guò)該debugserver只能用來(lái)調(diào)試你自己的相關(guān)應(yīng)用。如果想要調(diào)試從AppStore中獲取的App的話,那么我們需要對(duì)iOS設(shè)備上的debugserver進(jìn)行處理。該部分就是要處理我們的debugserver。
1.獲取debugserver
首先我們得找到iOS設(shè)備中debugserver,并將其拷貝到Mac上進(jìn)行處理,下方就是位于/Developer/usr/bin目錄下的debugserver。此debugserver只支持調(diào)試我們自己的App, 如果需要調(diào)試其他人的App的話,需要對(duì)此debugserver進(jìn)行處理,處理過(guò)程見(jiàn)下文。

2.對(duì)debugserver進(jìn)行瘦身
lipo -thin arm64 debugserver -output debugserver
進(jìn)入到到Mac中debugserver所在的目錄下執(zhí)行上述命令即可,-thin后方填寫(xiě)你的測(cè)試機(jī)相應(yīng)的ARM架構(gòu)即可,因?yàn)槲业臏y(cè)試機(jī)是iPhone 6 Plus, 是arm64的架構(gòu),所以此處填的參數(shù)是arm64, 如果你的是iPhone5的設(shè)備,那么就是armv7s了。
3.給debugserver添加task_for_pid權(quán)限
給debugserver添加task_for_pid權(quán)限后,我們就可以使用LLDB調(diào)試其他App了。此部分我們需要一個(gè)存儲(chǔ)配置信息的xml文件,該文件的內(nèi)容如下。你可以將下下方的文本進(jìn)行拷貝,然后存儲(chǔ)成ent.xml即可。
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.springboard.debugapplications</key> <true/> <key>get-task-allow</key> <true/> <key>task_for_pid-allow</key> <true/> <key>run-unsigned-code</key> <true/> </dict> </plist>
在給debugserver符權(quán)限時(shí),我們需要使用到ldid命令,如果你的Mac上沒(méi)有安裝ldid命令,那么請(qǐng)用brew進(jìn)行install。執(zhí)行下方的命令行就可以給我們的debugserver賦上task_for_pid權(quán)限。需要注意的是-S與ent.xml文件名中是沒(méi)有空格的。
ldid -Sent.xml debugserver
下方截圖就是我們處理debugserver的步驟,如下所示:

4、將debugserver拷貝到iOS設(shè)備中
最后一步就是將處理好的debugserver拷貝到我們的越獄設(shè)備中,并且給debugserver賦上可執(zhí)行的權(quán)限。因?yàn)?Developer/usr/bin目錄下的debugserver是只讀的,所以你不能將處理好的debugserver拷貝到上述文件,你要將處理好的debugserver拷貝到/usr/bin/目錄下(當(dāng)然此處我們借助IFunBox進(jìn)行文件的拷貝)。
將debugserver拷貝到/usr/bin目錄下后,執(zhí)行下方的賦權(quán)限的命令,將可執(zhí)行的權(quán)限賦給debugserver,如下所示:
chmod +x debugserver
賦完權(quán)限后,你就可以使用debugserver命令來(lái)開(kāi)啟debuserver了,如下所示:

三、debugserver的開(kāi)啟與LLDB的連接
1.開(kāi)啟debugserver
在越獄設(shè)備中,我們就可以通過(guò)下方命令行來(lái)開(kāi)啟debugserver了,我們此處以調(diào)試微信App為例。下方的命令就是啟動(dòng)debugserver來(lái)監(jiān)聽(tīng)來(lái)自任何IP地址的接入,iOS設(shè)備的接入端口是12345,所要調(diào)試的App為“WeChat”。命令如下:
debugserver *:12345 -a "WeChat"
在我們iOS設(shè)備上執(zhí)行上述命令的效果如下所示,執(zhí)行完上述命令后,我們的iOS設(shè)備就會(huì)等待Mac終端LLDB的接入。

2.LLDB連接debugserver
LLDB連接debugserver可以使用WIFI進(jìn)行連接,可是WIFI是不穩(wěn)定的,而且特別的慢,所以此處我們要使用usbmuxd進(jìn)行LLDB和debugserver的連接。
(1)進(jìn)行端口的轉(zhuǎn)發(fā)
和第一部分中的內(nèi)容相同,我們使用usbmuxd進(jìn)行端口的轉(zhuǎn)發(fā),將上述的“12345”端口對(duì)接到Mac本地的某個(gè)端口,此處我們使用“12345”端口。進(jìn)入到usbmuxd-1.0.8目錄下的python-client下執(zhí)行下方的命令。
./tcprelay.py -t 12345:12345
具體操作步驟如下所示:

(2)Mac端LLDB的接入
進(jìn)行端口轉(zhuǎn)發(fā)后,接下來(lái)我們就開(kāi)始進(jìn)入lldb模式,然后進(jìn)行debugserver的連接了。首先在terminal上輸入lldb命令,然后輸入下方的地址進(jìn)行連接。因?yàn)槲覀兪褂胾sbmuxd進(jìn)行了端口的轉(zhuǎn)發(fā),因此可以使用本地的環(huán)回測(cè)試地址來(lái)進(jìn)行debugserver的連接。
process connect connect://127.0.0.1:12345
下方是連接后的結(jié)果,LLDB與debugserver建立完成后,我們就可以使用lldb來(lái)調(diào)試微信這個(gè)應(yīng)用了。

四、Hopper + LLDB
在上篇博客《iOS逆向工程之給WeChat脫殼》 我們已經(jīng)給微信進(jìn)行可脫殼處理,所以使用Hopper進(jìn)行處理是沒(méi)有問(wèn)題的。此部分我們就要將Hopper與LLDB結(jié)合在一起發(fā)揮其雙劍合璧的作用。該部分也算是本篇博客中實(shí)戰(zhàn)的一部分。
1.查看線程中的WeChat
LLDB連接上debugserver后,我們首先使用下方的命令來(lái)查看當(dāng)前進(jìn)程中的所有模塊。從這些輸出信息中我們能找到“WeChat”這個(gè)進(jìn)程在虛擬內(nèi)存相對(duì)于模塊基地址的偏移量。
image list -o -f
lldb連接debugserver后,執(zhí)行上述命令輸出的部分結(jié)果如下所示。下方截圖中,第一個(gè)就是“WeChat”程序的相關(guān)信息。左邊紅框就是ASLR偏移量(隨機(jī)偏移量),ASLR偏移量其實(shí)就是虛擬內(nèi)存的其實(shí)地址,相對(duì)于模塊基地址的偏移量。右邊紅框中的地址就是偏移后的地址。
在介紹地址這塊的東西是先熟悉一下下方的兩個(gè)概念:
模塊在內(nèi)存中的起始地址----模塊基地址
ASLR偏移 ---- 虛擬內(nèi)存起始地址與模塊基地址的偏移量
從下方的輸出結(jié)果我們可以知道:ASLR偏移量 = 0x5b000, 模塊偏移后基地址 = 0x5f000

下方是使用Hopper打開(kāi)的解密后的微信的安裝包,其起始地址從下圖中我們可以看出是0x4000, 這個(gè)地址就是模塊偏移前的地址,也就是模塊在虛擬內(nèi)存中的起始地址。從Hopper中我們可以知道:模塊偏移前的基地址=0x4000

從上面兩組數(shù)據(jù)我們可以得出:
模塊偏移后的基地址(0x5f000)= ASLR偏移量(0x5b000)+ 模塊偏移前基地址(0x4000)
上面這個(gè)公式是尤為重要的,因?yàn)镠opper中顯示的都是“模塊偏移前基地址”,而LLDB要操作的都是“模塊偏移后的基地址”。所以從Hopper到LLDB,我們要做一個(gè)地址偏移量的轉(zhuǎn)換。這個(gè)在下方會(huì)多次用到。當(dāng)然,有一點(diǎn)需要注意的是Hopper與LLDB所選擇的AMR架構(gòu)的位數(shù)得一致,要么是32位,要么都是64位,如果位數(shù)不匹配的話,那么計(jì)算出來(lái)的內(nèi)存地址肯定是不對(duì)的。
2、使用LLDB給微信登錄添加斷點(diǎn)
(1)、加斷點(diǎn)前的分析
“斷點(diǎn)”這個(gè)東西在iOS開(kāi)發(fā)中可謂是經(jīng)常使用的東西,接下來(lái)我們要做的就是給在微信點(diǎn)擊登錄進(jìn)行頁(yè)面跳轉(zhuǎn)時(shí)添加一個(gè)斷點(diǎn)。就是點(diǎn)擊左邊截圖的登錄按鈕往右邊頁(yè)面跳轉(zhuǎn)時(shí)添加一個(gè)斷點(diǎn)。我們暫且將斷點(diǎn)添加在右邊頁(yè)面的初始化方法中。

要給上述右邊頁(yè)面添加斷點(diǎn)首先得知道上面“手機(jī)號(hào)登錄”視圖控制器的內(nèi)存地址,然后才可以使用LLDB添加斷點(diǎn)。那么尋找上述視圖控制器的內(nèi)存地址的任務(wù)就交給了我們的Hopper來(lái)做了。在Hopper中我們搜索“Login”,然后會(huì)篩選出好的帶有Login關(guān)鍵字的ViewController,然后我們?cè)诤Y選的結(jié)果中再次尋找可疑目標(biāo)對(duì)象。然后我們找到了一個(gè)名為“WCAccountPhoneLoginControlLogic”(我們可以翻譯一下英文,大概意思就是“微信手機(jī)賬號(hào)登錄控制邏輯”)的類,從這個(gè)類的名字中我們不難推斷出該類極有可能就是我們要尋找的“手機(jī)賬號(hào)登錄”頁(yè)面。

經(jīng)過(guò)上述分析后,我們決定要給該類的“initWithData”(這肯定是個(gè)初始化方法)使用LLDB添加斷點(diǎn)。
(2)、定位斷點(diǎn)地址
經(jīng)過(guò)第一步找到添加斷點(diǎn)的類中的方法后,接下來(lái)我們要計(jì)算出該方法的內(nèi)存地址,然后使用LLDB給該地址添加斷點(diǎn)。通過(guò)Hopper我們很容易定位到上述的“initWithData:”方法,的位置,如下所示。下方截圖中這個(gè)帶“星號(hào)”的地址就是“initWithData:”方法偏移前的基地址。根據(jù)上面的公式我們很容易就可以計(jì)算出該方法“偏移后的基地址”也就是真正的內(nèi)存地址。算法如下所示:
initWithData內(nèi)存地址 = 0x1304b60 + 0x5b000(ALSR偏移) = 0x135FB60

(3)、添加斷點(diǎn)
使用下述命令,給上述地址添加斷點(diǎn)。斷點(diǎn)添加后,點(diǎn)擊登錄按鈕就會(huì)跳轉(zhuǎn)到“手機(jī)號(hào)登錄”頁(yè)面就會(huì)執(zhí)行該斷點(diǎn),下方截圖的紅框中就是“斷點(diǎn)”執(zhí)行后的效果。從下方截圖中我們可以看出該斷點(diǎn)的編號(hào)是1,Breakpoint后方就是斷點(diǎn)編號(hào),該編號(hào)會(huì)在操作斷點(diǎn)是會(huì)用到,下方會(huì)給出實(shí)例。
br s -a 0x135FB60

(4)、斷點(diǎn)的單步執(zhí)行(ni, si)
你可以通過(guò)nexti (簡(jiǎn)寫(xiě):ni)和stepi (簡(jiǎn)寫(xiě):si)來(lái)進(jìn)行單步的調(diào)試。ni遇到跳轉(zhuǎn)不會(huì)進(jìn)入到跳轉(zhuǎn)中去,而si則會(huì)跳轉(zhuǎn)到相應(yīng)的分支中去。下方就是通過(guò)si和ni進(jìn)行單步調(diào)試的效果截圖。

(5) 放開(kāi)執(zhí)行該斷點(diǎn)(c)
命令c可以執(zhí)行該斷點(diǎn), 上面這種情況如果執(zhí)行c命令,因?yàn)橹挥幸粋€(gè)斷點(diǎn),該斷點(diǎn)執(zhí)行后,就會(huì)跳轉(zhuǎn)到“手機(jī)號(hào)登陸頁(yè)面”。
(6)斷點(diǎn)的禁用和開(kāi)啟
上面也有提到,上述創(chuàng)建的斷點(diǎn)的編號(hào)是1,我們要對(duì)該斷點(diǎn)進(jìn)行禁用和開(kāi)啟操作,具體命令如下所示:
br dis 1 -- 禁用(disable)編號(hào)為1的斷點(diǎn)
br en 1 -- 啟用(enable)編號(hào)為1的斷點(diǎn)
br dis -- 禁用所有斷點(diǎn)
br en -- 啟用所有斷點(diǎn)
具體操作結(jié)果如下, 當(dāng)斷點(diǎn)禁用后,點(diǎn)擊登錄按鈕就不會(huì)觸發(fā)該斷點(diǎn)了。當(dāng)斷點(diǎn)重啟后,點(diǎn)擊登錄按鈕還是會(huì)觸發(fā)該斷點(diǎn)的。具體效果如下所示:

(7) 斷點(diǎn)的刪除
br del 1 -- 刪除(delete)編號(hào)為1的斷點(diǎn)
br del -- 刪除所有斷點(diǎn)

3.輸出寄存器的值(p, po)
在iOS開(kāi)發(fā)中,我們?cè)谑褂肔LDB調(diào)試時(shí),經(jīng)常會(huì)用到po命令來(lái)輸出某個(gè)變量或者常量的值。在使用LLDB調(diào)試WeChat時(shí),我們也可以使用某些命令來(lái)輸出寄存器中的值。我們使用$來(lái)訪問(wèn)某個(gè)寄存器中的值,并且使用p命令進(jìn)行打印。下方就是通過(guò)p命令將r1寄存器中所存的內(nèi)容進(jìn)行打印,在打印之前將$r1進(jìn)行類型轉(zhuǎn)換,po命令則輸出了Objective-C的對(duì)象,而p輸出的是C語(yǔ)言類型的數(shù)據(jù)。如下所示:

我們還可以將一個(gè)地址所存放的值進(jìn)行打印,下方這個(gè)命令就是輸出了$sp指針?biāo)傅牡刂诽幩娣诺闹担?/p>
p/x $sp

4.修改寄存器中的值
我們不僅可以查看某些寄存器中的值,而且可修改寄存器中的中,通過(guò)下述命令我們就可以修改指的寄存器中的值。
register write 寄存器 值
接下來(lái)我們將要通過(guò)一個(gè)實(shí)例來(lái)實(shí)戰(zhàn)一下register write這個(gè)命令,通過(guò)在Hopper中對(duì)登錄模塊的分析,我們不難發(fā)現(xiàn)“WCAccountManualAuthControlLogic”這個(gè)類中的“handleAuthResponse:”方法就是用來(lái)處理“登錄認(rèn)證響應(yīng)”的方法。也就是說(shuō)“handleAuthResponse:”負(fù)責(zé)處理登錄業(yè)務(wù)邏輯的網(wǎng)絡(luò)響應(yīng),并且在這個(gè)函數(shù)的前邊有一個(gè)比較(cmp r0, r1), 根據(jù)r0和r1的比較結(jié)果來(lái)進(jìn)行跳轉(zhuǎn)。

接下來(lái)我們要做的事情就是,在比較寄存器r0和r1中的值時(shí)我們要改變r(jià)1寄存器中的值,然后觀察App的運(yùn)行效果。下方這個(gè)截圖是隨便輸入手機(jī)號(hào)和密碼時(shí)所提示的內(nèi)容。也就是正常的流程會(huì)彈出下方的框。

接下來(lái)我們要做的就是給0x1063a24 + 0x5b000 = 0x10BEA24 (cmp)這個(gè)內(nèi)存地址添加斷點(diǎn),然后去修改寄存器r1的值。下方截圖就是給0x10BEA24這個(gè)內(nèi)存址添加了斷點(diǎn),并且在輸入手機(jī)號(hào)和密碼后,點(diǎn)擊登錄會(huì)執(zhí)行我們添加的斷點(diǎn),如下所示。在斷點(diǎn)出我們清楚的看到了cmp r0, r1這行ARM指令。

接下來(lái)我們先將r0和r1中的值進(jìn)行打印,$r0 = 8, $r1 = 351。然后我們將$r1中的值改成8,然后輸入c繼續(xù)執(zhí)行,發(fā)現(xiàn)之前正常流程的alter就不會(huì)彈出來(lái)了,而是重新進(jìn)行了一次網(wǎng)絡(luò)請(qǐng)求。

上述示例都是在32位系統(tǒng)上做的,如果你使用的是arm64架構(gòu)的設(shè)備,如iPhone6Plus,那么你的地址會(huì)比上述地址要長(zhǎng)一倍。下方兩個(gè)截圖是使用iPhone 6 Plus越獄設(shè)備做實(shí)驗(yàn)的截圖,可以和上述步驟進(jìn)行一下對(duì)比,雖然有所不同,但是上述內(nèi)容在調(diào)試下方內(nèi)容時(shí)也是適用的。


本篇博客的內(nèi)容就到這兒吧,至此,你應(yīng)該能將LLDB與Hopper結(jié)合起來(lái)使用了吧。今天我們以“微信”為例子,并沒(méi)有別的意思,只是想在真正的實(shí)例中實(shí)現(xiàn)一下。使用微信做實(shí)驗(yàn)的原因就是微信做的足夠安全,畢竟微信的團(tuán)隊(duì)還是很強(qiáng)大的。因?yàn)橛梦业脑姜z設(shè)備做完上述實(shí)驗(yàn)后,該越獄設(shè)備已經(jīng)不能登錄微信賬號(hào)了,肯定是微信的后臺(tái)監(jiān)測(cè)到該“越獄設(shè)備”的異常行為了,從而做了一些安全措施。
“攻與防”就像“矛與盾”相輔相成。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
iOS10語(yǔ)音識(shí)別框架SpeechFramework應(yīng)用詳解
在iOS10系統(tǒng)了,apple開(kāi)放了與語(yǔ)音識(shí)別相關(guān)的接口,開(kāi)發(fā)者可以將其應(yīng)用到自己的App中,實(shí)現(xiàn)用戶通過(guò)語(yǔ)音進(jìn)行功能操作。 這篇文章主要介紹了iOS10語(yǔ)音識(shí)別框架SpeechFramework應(yīng)用,需要的朋友可以參考下2016-09-09
AVFoundation AVCaptureSession媒體捕捉
這篇文章主要為大家介紹了ios開(kāi)發(fā)AVFoundation AVCaptureSession媒體捕捉詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
iOS開(kāi)發(fā)中使用NSURLConnection類處理網(wǎng)絡(luò)請(qǐng)求的方法
這篇文章主要介紹了iOS開(kāi)發(fā)中使用NSURLConnection類處理網(wǎng)絡(luò)請(qǐng)求的方法,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-12-12
iOS overFullScreen與fullScreen區(qū)別分析
這篇文章主要介紹了iOS overFullScreen與fullScreen區(qū)別分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
Objective-C方法的聲明實(shí)現(xiàn)及調(diào)用方法
這篇文章主要介紹了Objective-C方法的聲明實(shí)現(xiàn)及調(diào)用方法,包括五參數(shù)的方法和單個(gè)參數(shù)的方法,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2024-02-02
iOS表情鍵盤(pán)的簡(jiǎn)單實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了iOS表情鍵盤(pán)的簡(jiǎn)單實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
IOS 手勢(shì)操作詳解及實(shí)例總結(jié)篇
這篇文章主要介紹了IOS 手勢(shì)操作詳解及實(shí)例總結(jié)篇的相關(guān)資料,需要的朋友可以參考下2017-01-01
iOS中解決Xcode9的Log日志無(wú)法輸出中文的問(wèn)題小結(jié)
這篇文章主要介紹了iOS中解決Xcode9的Log日志無(wú)法輸出中文的問(wèn)題小結(jié),需要的朋友可以參考下2017-11-11
iOS利用NSMutableAttributedString實(shí)現(xiàn)富文本的方法小結(jié)
這篇文章主要給大家介紹了關(guān)于iOS利用NSMutableAttributedString如何實(shí)現(xiàn)富文本的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05

