如何下載360云盤(pán)Android客戶端(360云盤(pán)手機(jī)客戶端下載)
2024-03-29
更新時(shí)間:2024-03-29 00:16:44作者:佚名
很久有寫(xiě)過(guò)一個(gè)廣工圖書(shū)館主頁(yè)一個(gè)類爬蟲(chóng)的demo(因?yàn)闆](méi)接口,只能扒取靜態(tài)網(wǎng)頁(yè)),實(shí)現(xiàn)一些圖書(shū)館系統(tǒng)的一些功能。但最近發(fā)現(xiàn)圖書(shū)館系統(tǒng)在html頁(yè)面上做了手腳,一頁(yè)html頁(yè)面中嵌入了幾千行的注釋,并有了自己的App,應(yīng)該是為了增加扒取的流量成本來(lái)防止別人去扒取網(wǎng)頁(yè),不過(guò)加注釋這手段就不敢恭維了,內(nèi)網(wǎng)訪問(wèn)速度還行,但外網(wǎng)訪問(wèn)的話體驗(yàn)很差的。
如下圖:一堆注釋,導(dǎo)致一個(gè)網(wǎng)頁(yè)要2MB
主頁(yè)上的APP,必然是用了圖書(shū)館的后臺(tái)接口和服務(wù)器交互的,從而想試試用反編譯的手段來(lái)看看APP使用了什么接口。(另外更簡(jiǎn)單可以通過(guò)tcpdump來(lái)給Android手機(jī)抓包分析其接口,再用Wireshark來(lái)分析tcp包,不過(guò)你想要知道全部接口的話,可能需要一個(gè)個(gè)接口去調(diào)用,會(huì)比較麻煩,采用反編譯,可能集中在一個(gè)類中找到這些接口)。
首先要準(zhǔn)備的工具:(了解更多反編譯工具可以去看雪論壇下載或者學(xué)習(xí)-Link)
APKTool是GOOGLE提供的APK編譯工具,需要JAVA運(yùn)行環(huán)境。可以對(duì)APK進(jìn)行反編譯,使用它可以將其反編譯成非常接近打包前的原始格式。逆向AndroidManifest.xml、資源文件 resources.arsc以及將dex文件反編譯成可以調(diào)試的smali文件。修改后,可以將其編譯回apk文件。APKTool也可以用來(lái)漢化Android軟件然后重新打包發(fā)布。
官方:http://code.google.com/p/android-apktool/
解壓縮APKTool,并把要反編譯的APK放入目錄中
反編譯:
通過(guò)CMD進(jìn)入上面的目錄,執(zhí)行命令: apktool decode ZhaoBenShu.apk outdir
稍等片刻完成反編譯,反編譯后的文件會(huì)在outdir目錄下。
---outdir目錄結(jié)構(gòu)
res :資源文件,跟adnroid工程目錄下的res基本一樣,各種UI圖片 XML布局文件 values xml文件(多了一個(gè)public.xml,有各個(gè)資源的id號(hào)(R.java中的id))
smail:這個(gè)是重點(diǎn)文件夾,里面都是smail格式文件,是Dalvik虛擬機(jī)執(zhí)行的操作碼(Dalvik opcodes),這些操作嗎有自己的語(yǔ)法,如果有學(xué)過(guò)JNI的話, 這些語(yǔ)法還是比較容易看懂和理解的。AndroidManifest.xml:Android工程下的AndroidManifest.xml
apktool.yml:用于重打包。
smail語(yǔ)法:(全部語(yǔ)法請(qǐng)link)
smail中的數(shù)據(jù)類型簽名跟java中的是一樣的,如下。
B---byteC---charD---doubleF---floatI---intJ---longS---shortV---voidZ---boolean[XXX---arrayLxxx/yyy---object
smail代碼例子:
初看smail文件,可能會(huì)覺(jué)得有一些凌亂。不過(guò)只要把幾種語(yǔ)法弄懂了,就可以很好地閱讀smail文件。
smail比較常用語(yǔ)法 ( 非全部)分為: 賦值,取值,函數(shù)調(diào)用,if語(yǔ)句,返回值等。
賦值取值:
例子: iget-object v6, p0, Lcom/zbsh/code/clas/ClassSystem$9;->val$vBarCodes:Ljava/util/ArrayList;
分析:
iget個(gè)取值操作,i=instance,是用來(lái)instance filed(實(shí)例變量),object是類的意思。 v6是本地寄存器,p0在這里是代表this(在非static函數(shù)正代表this,在static函數(shù)中代表第一個(gè)參數(shù))。Lcom/zbsh/code/clas/ClassSystem是表示包路徑為 Lcom/zbsh/code/clas下的ClassSystem類,->相當(dāng)于C/C++的箭頭操作符,后面是類中的變量或者方法vBarCodes是ClassSystem中的一個(gè)變量,Ljava/util/ArrayList是vBarCodes這個(gè)變量的類型 (是java中類的簽名)
作用:
把ClassSystem中vBarCodes的值存放在寄存器v6中,vBarCodes的類型必須是對(duì)象,且是實(shí)例變量非靜態(tài)變量。
其中object可以是替換成基本數(shù)據(jù)類型:iget-boolean iget-byte iget-char iget-short等等。
同樣的:
sget- [type]用來(lái)獲取static變量。(少了一個(gè)p0,因?yàn)殪o態(tài)變量是沒(méi)有this的)
aget-[type]用來(lái)獲取array類型。
[x]get vx, vy,把寄存器vy中的值賦給vx。
賦值:
同樣都有以下幾種:
iput-[type]
sput-[type]
aput-[type]
也支持寄存器和寄存器之間的賦值,寄存器和變量之間的賦值。
函數(shù)調(diào)用:
invoke-direct 調(diào)用private函數(shù)
invoke-super 調(diào)用父類函數(shù)
invoke-static 調(diào)用靜態(tài)函數(shù)
invoke-virtual 用于調(diào)用protected或public函數(shù)(相當(dāng)于C++的虛函數(shù),java的重載函數(shù),只有protect和public能夠重載)
還有一種比較特殊的:invoke-xxxxx/range:參數(shù)多于5個(gè)的時(shí)候,要加/rang
例子:
invoke-virtual {v4, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
v4是this,代表 Ljava/lang/String的一個(gè)實(shí)例,v1是函數(shù)的第一個(gè)參數(shù),在這里是調(diào)用放在V4寄存器中類型為L(zhǎng)java/lang/String的實(shí)例的equal ()方法,并傳入?yún)?shù)v1,返回的結(jié)果是Z類型,也就是boolean類型。
如果是invoke-static{v4, v1}, 不同遇在于invoke-virtual {v4, v1}的是v4不是this,而是第一個(gè)參數(shù)。v1是第二個(gè)參數(shù),所調(diào)用的方法需要兩個(gè)參數(shù)。
返回值:
獲取返回值:
move-result vx :把上一個(gè)方法返回的值,存在寄存器 vx中。
返回返回值:
return-void 沒(méi)返回。
return vx 返回寄存器中vx的值 。
if語(yǔ)句:
if-eq vx,vy,target:eq:equal 如果vx==xy 跳轉(zhuǎn)到target目標(biāo)代碼,否則執(zhí)行順序執(zhí)行下一句代碼
if-ne vx,vy,target:nq :not equal 如果vx!=xy 跳轉(zhuǎn)到target目標(biāo)代碼,否則執(zhí)行順序執(zhí)行下一句代碼
if-eqz vx,target:eqz : equal zero 如果vx==0 跳轉(zhuǎn)到target目標(biāo)代碼,否則執(zhí)行順序執(zhí)行下一句代碼
if-nez vx,target:nez :not equal zero 如果vx!=0 跳轉(zhuǎn)到target目標(biāo)代碼,否則執(zhí)行順序執(zhí)行下一句代碼
讀smail,找接口:
以搜索接口為例子:
根據(jù)文件命名找到GropZbshFind.smali這個(gè)文件,應(yīng)該就是搜索Activity。
在其中有一段代碼:
復(fù)制代碼
代碼如下:
# virtual methods
.method public onCreate(Landroid/os/Bundle;)V
.locals 3
.parameter "savedInstanceState"</font></p><p><font face="Courier New"> .prologue
.line 13
invoke-super {p0, p1}, Lcom/zbsh/code/thrd/GroupActivity;->onCreate(Landroid/os/Bundle;)V</font></p><p><font face="Courier New"> .line 14
const-class v0, Lcom/zbsh/code/ZbshFindMain;</font></p><p><font face="Courier New"> invoke-virtual {v0}, Ljava/lang/Class;->getName()Ljava/lang/String;</font></p><p><font face="Courier New"> move-result-object v0</font></p><p><font face="Courier New"> new-instance v1, Landroid/content/Intent;</font></p><p><font face="Courier New"> const-class v2, Lcom/zbsh/code/ZbshFindMain;</font></p><p><font face="Courier New"> invoke-direct {v1, p0, v2}, Landroid/content/Intent;->(Landroid/content/Context;Ljava/lang/Class;)V</font></p><p><font face="Courier New"> invoke-virtual {p0, v0, v1}, Lcom/zbsh/code/GropZbshFind;->startChildActivity(Ljava/lang/String;Landroid/content/Intent;)V</font></p><p><font face="Courier New"> .line 15
return-void
.end method
很明顯是通過(guò)startActivity來(lái)啟動(dòng)ZbshFindMain這個(gè)Activity,
在ZbshFindMain中找到Onclick方法。
復(fù)制代碼
代碼如下:
# virtual methods
.method public onClick(Landroid/view/View;)V
.........省略一坨代碼...........
iget-object v0, v5, Lcom/zbsh/code/clas/ClassSystem;->ipAddress:Ljava/lang/String;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> .line 199
.local v0, ipAddress:Ljava/lang/String;
new-instance v5, Ljava/lang/StringBuilder;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> invoke-static {v0}, Ljava/lang/String;->valueOf(Ljava/lang/Object;)Ljava/lang/String;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> move-result-object v6</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> invoke-direct {v5, v6}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> const-string v6, "Find/GetBookList.aspx?a="</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> move-result-object v5</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> const-string v6, "gdut"</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> move-result-object v5</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> const-string v6, "&b="</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> move-result-object v6</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> iget-object v5, p0, Lcom/zbsh/code/ZbshFindMain$4;->this$0:Lcom/zbsh/code/ZbshFindMain;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> invoke-virtual {v5}, Lcom/zbsh/code/ZbshFindMain;->getApplication()Landroid/app/Application;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> move-result-object v5</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> check-cast v5, Lcom/zbsh/code/clas/ApplZbsh;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> iget-object v5, v5, Lcom/zbsh/code/clas/ApplZbsh;->iSystem:Lcom/zbsh/code/clas/ClassSystem;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> iget-object v5, v5, Lcom/zbsh/code/clas/ClassSystem;->searchType:Ljava/lang/String;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> invoke-virtual {v6, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> move-result-object v5</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> const-string v6, "&c="</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> move-result-object v6</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> iget-object v5, p0, Lcom/zbsh/code/ZbshFindMain$4;->this$0:Lcom/zbsh/code/ZbshFindMain;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> invoke-virtual {v5}, Lcom/zbsh/code/ZbshFindMain;->getApplication()Landroid/app/Application;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> move-result-object v5</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> check-cast v5, Lcom/zbsh/code/clas/ApplZbsh;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> iget-object v5, v5, Lcom/zbsh/code/clas/ApplZbsh;->iSystem:Lcom/zbsh/code/clas/ClassSystem;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> iget-object v5, v5, Lcom/zbsh/code/clas/ClassSystem;->inputKeywords:Ljava/lang/String;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> invoke-virtual {v6, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> move-result-object v5</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> const-string v6, "&d="</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> move-result-object v5</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> sget v6, Lcom/zbsh/code/clas/ClassDataParameter;->count:I</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> move-result-object v5</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> const-string v6, "&e="</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> move-result-object v5</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> sget v6, Lcom/zbsh/code/clas/ClassDataParameter;->page:I</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> move-result-object v5</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> invoke-virtual {v5}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> move-result-object v3</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> .line 201
.local v3, urlPath:Ljava/lang/String;
iget-object v5, p0, Lcom/zbsh/code/ZbshFindMain$4;->this$0:Lcom/zbsh/code/ZbshFindMain;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> invoke-virtual {v5}, Lcom/zbsh/code/ZbshFindMain;->getApplication()Landroid/app/Application;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> move-result-object v5</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> check-cast v5, Lcom/zbsh/code/clas/ApplZbsh;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> iget-object v5, v5, Lcom/zbsh/code/clas/ApplZbsh;->iSystem:Lcom/zbsh/code/clas/ClassSystem;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> iget-object v6, p0, Lcom/zbsh/code/ZbshFindMain$4;->this$0:Lcom/zbsh/code/ZbshFindMain;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> iget-object v6, v6, Lcom/zbsh/code/ZbshFindMain;->mUIHandler:Landroid/os/Handler;</font></pre><pre class="brush: php; highlight: [5, 15]; html-script: true"><font face=""> invoke-virtual {v5, v0, v3, v6}, Lcom/zbsh/code/clas/ClassSystem;->GetFindOnThread(Ljava/lang/String;Ljava/lang/String;Landroid/os/Handler;)V
上面這段代碼,實(shí)現(xiàn)的是通過(guò)StringBuilder,通過(guò)append方法,拼成一個(gè)地址出來(lái),再調(diào)用ClassSystem;->GetFindOnThread這個(gè)方法,傳入?yún)?shù),進(jìn)行一個(gè)異步圖書(shū)搜索的任務(wù)。
再?gòu)腃lassDataParameter.smali中找到一些定義host地址常量。
復(fù)制代碼
代碼如下:
.line 20
const-string v0, "<a </p><p> sput-object v0, Lcom/zbsh/code/clas/ClassDataParameter;->IPADDRESS_TEL:Ljava/lang/String;</p><p> .line 21
const-string v0, "<a </p><p> sput-object v0, Lcom/zbsh/code/clas/ClassDataParameter;->IPADDRESS_EDU:Ljava/lang/String
我們可以拼出圖書(shū)搜索的接口是:http://222.200.98.173:7778/Find/GetBookList.aspx?a=&b=1&c=java&d=40&e=100
返回的是Json數(shù)據(jù)格式化下:
復(fù)制代碼
代碼如下:
{
"error": "0",
"findtotal": "1612",
"findcache": "20131124024041.htm",
"find_list": [
{
"CtrlNo": "70658",
"Isbn": "7-301-03477-6 ",
"Title": "Java教程(Internet面向?qū)ο蟪绦蛟O(shè)計(jì))",
"Author": "Mary Campione",
"Edition": " ",
"Publisher": "北大版",
"PubDate": "97.12"
},
{
"CtrlNo": "70657",
"Isbn": "7-301-03476-8 ",
"Title": "Java類手冊(cè)",
"Author": "Patrick Chan",
"Edition": " ",
"Publisher": "北大版",
"PubDate": "97.12"
},
{
"CtrlNo": "605337",
"Isbn": "978-7-115-30271-7 ",
"Title": "Java 7基礎(chǔ)教程= Java 7 for absolute beginners",
"Author": "(美) Jay Bryant著;李鵬, 韓智譯",
"Edition": " ",
"Publisher": "人民郵電出版社",
"PubDate": "2013.01"
},
{
"CtrlNo": "604835",
"Isbn": "978-7-302-30346-6 ",
"Title": "Java改錯(cuò)學(xué)習(xí)法 [專著]",
"Author": "朱福喜編著",
"Edition": " ",
"Publisher": "清華大學(xué)出版社",
"PubDate": "2013"
}
]
}
其次:
還可以通過(guò)反編譯更強(qiáng)大的用處是用來(lái)修改smali代碼,再重打包apk,來(lái)破解一些收費(fèi)軟件,去除廣告之類,或者了解一些優(yōu)秀軟件的實(shí)現(xiàn)邏輯。