压在透明的玻璃上c-国产精品国产一级A片精品免费-国产精品视频网-成人黄网站18秘 免费看|www.tcsft.com

逆向APK進(jìn)行smali注入實(shí)現(xiàn)“秒破WIFI”

  近期開始關(guān)注手機(jī)安全了,以往都是在PC上玩,對(duì)這個(gè)領(lǐng)域也想了解一下,可是拿什么來開刀呢?突然想起Wifi萬能鑰匙這個(gè)神器了,這個(gè)軟件的wifi分享模式鄙人非常喜歡,裝了這貨基本上很多地方都有免費(fèi)的WIFI用!(這并非植入廣告!是真心話!)鄙人也把自己的家用wifi給共享了,10M的帶寬歡迎你連進(jìn)來(只要你敢,嘿嘿)。不過這個(gè)軟件還是有美中不足的地方,軟件提供wifi連接的功能,但是并不會(huì)告訴你wifi的密碼是什么,估計(jì)廠家也是基于安全和隱私的角度考慮,這樣做也是對(duì)的,但其實(shí)密碼應(yīng)該就在軟件的某個(gè)地方,只要想找肯定會(huì)找到(在data/misc/wifi/wpa_supplicant.conf文件中),但這不是本文的重點(diǎn),本文主要討論的是apk軟件的逆向和修改打包技術(shù),純技術(shù)交流用途。

  好了,開始說干貨了(高手直接飄過吧),這次開刀的版本是官方2.9.27版本。首先APKTOOL反編譯安裝包,請(qǐng)注意版本號(hào)Apktool 2.0.0-Beta9。

  得到smali源碼后開始找關(guān)鍵代碼,我們的主要目的是讓wifi萬能鑰匙把從服務(wù)器傳回來的密碼顯示出來,這樣我們不但能連入wifi,而且還能知道明文密碼。

  首先與PC端軟件逆向的流程應(yīng)該是一樣的,找關(guān)鍵字定位關(guān)鍵代碼,這軟件每次連wifi都會(huì)顯示一些日志,其中有一條很關(guān)鍵,“嘗試獲取網(wǎng)絡(luò)密碼成功”,這應(yīng)該是成功獲取到了密碼之后的日志,這個(gè)字符串位于資源目錄中的strings.xml文件里。

  依據(jù)XML的name字段"act_autoconnect_state_get_net_pwd_success"我們可以繼續(xù)搜索到位于public.xml中對(duì)應(yīng)的字符串ID。

  依據(jù)這個(gè) id="0x7f0d051e",我們能定位到關(guān)鍵的smali代碼,WiFiMastersmalicomsndawifilocatinguiactivityfc.smali這里使用了這個(gè)字符串,代碼如下:

  const v1, 0x7f0200bdconst v2, 0x7f0d051e    invoke-virtual {v0, v1, v2}, Lcom/snda/wifilocating/ui/activity/fe;->b(II)V     iget-object v0, p0, Lcom/snda/wifilocating/ui/activity/fc;->a:Lcom/snda/wifilocating/ui/activity/AutoConnectActivityWithStateList;     iget-object v1, p0, Lcom/snda/wifilocating/ui/activity/fc;->a:Lcom/snda/wifilocating/ui/activity/AutoConnectActivityWithStateList;     invoke-static {v1}, Lcom/snda/wifilocating/ui/activity/AutoConnectActivityWithStateList;->i(Lcom/snda/wifilocating/ui/activity/AutoConnectActivityWithStateList;)Lcom/snda/wifilocating/f/s;    move-result-object v1可以從代碼中看到0x7f0d051e字符串作為參數(shù)傳遞進(jìn)了b方法中,而后又被AutoConnectActivityWithStateList這個(gè)類進(jìn)行了多次調(diào)用,看來AutoConnectActivityWithStateList類是個(gè)非常關(guān)鍵的環(huán)節(jié),我們不如直接找到這個(gè)類的實(shí)現(xiàn)代碼進(jìn)去看看。

  這個(gè)類的smali代碼路徑如下:WiFiMastersmalicomsndawifilocatinguiactivityAutoConnectActivityWithStateList.smali

  為了節(jié)省篇幅,省去讀這個(gè)類代碼的過程描述,直接粘貼關(guān)鍵代碼如下(大概1500行的位置):

  .method private a(Lcom/snda/wifilocating/ui/activity/support/AccessPoint;Ljava/lang/String;)Lcom/snda/wifilocating/ui/activity/fd;    .locals 5     const/4 v4, -0x1    new-instance v0, Ljava/lang/StringBuilder;    const-string v1, "connect ap:"    invoke-direct {v0, v1}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V    iget-object v1, p1, Lcom/snda/wifilocating/ui/activity/support/AccessPoint;->b:Ljava/lang/String;    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;    move-result-object v0    const-string v1, " with pwd:"    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;    move-result-object v0    invoke-virtual {v0, p2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;    move-result-object v0    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;    invoke-static {p2}, Landroid/text/TextUtils;->isEmpty(Ljava/lang/CharSequence;)Z    move-result v0    if-nez v0, :cond_0這是一個(gè)非常關(guān)鍵的方法的實(shí)現(xiàn),我們看到該方法有兩個(gè)參數(shù),一個(gè)是AccessPoint類的對(duì)象,另一個(gè)是String字符串,方法的一開始就實(shí)例化了一個(gè)StringBuilder的對(duì)象,然后使用append不斷的拼接該字符串,大概的拼接規(guī)則是這樣的:

  “connect ap: ”+ “AccessPoint;->b”+“with pwd:”+“String”

  看到了這里似乎就已經(jīng)明朗了,意思就是 連接熱點(diǎn):XXX 使用密碼:XXX。

  所以我們完全有理由相信,這個(gè)String類型的參數(shù)實(shí)際上就是wifi熱點(diǎn)的密碼!

  OK,到了這里,我們要做一些工作來進(jìn)行驗(yàn)證,你可以選擇使用ADB調(diào)試然后跟蹤到這里,或者干脆修改smali,讓它輸出這里的String給我們看,我選擇第二種方法,因?yàn)楸緛砦覀円彩菫榱艘屗@示密碼。

  手動(dòng)輸入如下的代碼插入到該方法中(smali有很嚴(yán)格的語法規(guī)則,拿到一段代碼先要搞清楚含義,隨意插在什么地方幾乎是跑不通的,關(guān)于smali的語法網(wǎng)上有很多資料了,建議先學(xué)習(xí)懂了以后再去寫,當(dāng)然如果你是高手就飄過吧)

  new-instance v5,Landroid/app/AlertDialog$Builder;invoke-direct {v5,p0}, Landroid/app/AlertDialog$Builder;-><init>(Landroid/content/Context;)Vconst-string v6, "|Cracked by u6210u738Bu8D25u5BC7| PASSWORD IS:"invoke-virtual {v5,v6}, Landroid/app/AlertDialog$Builder;->setTitle(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;invoke-virtual {v5,p2},Landroid/app/AlertDialog$Builder;->setMessage(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;invoke-virtual {v5},Landroid/app/AlertDialog$Builder;->create()Landroid/app/AlertDialog;move-result-object v6invoke-virtual {v6},Landroid/app/AlertDialog;->show()V這段代碼就是使用AlertDialog類的一系列方法彈出對(duì)話框,把密碼顯示出來。(真搞不懂java彈個(gè)對(duì)話框怎么要用到這么多方法,這里懷念一下windows的MessageBoxA。)

  插入過后就是對(duì)整個(gè)代碼進(jìn)行編譯打包的工作了,不要以為這個(gè)活就干完了,真正鬧心的還在后面呢!

  我們使用apktool b [反編譯后的目錄] 進(jìn)行打包,多數(shù)情況你會(huì)發(fā)現(xiàn)打包過程是會(huì)報(bào)錯(cuò)的,千奇百怪的錯(cuò)!只有少數(shù)APK會(huì)成功打包。后來我專門研究了一下這個(gè)問題,主要其實(shí)是資源出的錯(cuò),當(dāng)然前提是要先把smali代碼編譯過去,剩下再解決資源的問題。本例中的這個(gè)APK也是有報(bào)錯(cuò)的,好在還不多,都一一解決了。其實(shí)我本來想把資源報(bào)錯(cuò)這個(gè)問題的細(xì)節(jié)寫進(jìn)來,但其實(shí)這是個(gè)體力活!而且每款軟件都不同,幾乎沒有借鑒意義。所以我準(zhǔn)備把一些方法性的東西告訴大家,具體問題你只能具體分析了。

  解決打包報(bào)錯(cuò)問題的基本思路就是先看報(bào)錯(cuò)內(nèi)容(這不是廢話么~),因?yàn)檫@是我們唯一的線索,先搞清楚問題的原因再去對(duì)癥下藥,smali報(bào)錯(cuò)我就不說了,因?yàn)檫@多數(shù)是語法的問題,只能好好學(xué)學(xué)了。如果報(bào)錯(cuò)類型是資源文件出錯(cuò),例如string.xml、public.xml什么的,那你就把原始的apk資源解包出來,然后把反編譯的對(duì)照原始資源文件進(jìn)行參考修改,缺啥就補(bǔ)啥,多啥就刪啥,引用錯(cuò)了啥就改啥,這也是需要你對(duì)安卓的整個(gè)打包文件結(jié)構(gòu)有一定的了解才行,具體問題具體分析。

  好了,此處省略一萬次報(bào)錯(cuò)修改的過程……(真心希望google能把a(bǔ)pktool好好做做,這么多bug不像是google的產(chǎn)品作風(fēng)啊!)最后終于生成出了打包好的文件,它在你反編譯后的dist目錄中。

  先別急,我們還要對(duì)這個(gè)APK進(jìn)行簽名,否則安裝不了。

  OK,我們下面安裝這個(gè)APK,來看看效果。

  安裝后開啟wifi,然后點(diǎn)擊一鍵查詢?nèi)f能鑰匙,搜出來個(gè)901,估計(jì)是門牌號(hào),信號(hào)很好并且已經(jīng)共享了wifi,我們連進(jìn)去看看。

  點(diǎn)擊“萬能鑰匙自動(dòng)連接”,順利的話就應(yīng)該能爆出密碼了。

  OK,密碼已經(jīng)成功彈出,大功告成!有了這貨你基本上就可以秒破很多WIFI了!對(duì)于已經(jīng)修改好的APK我就不提供下載了,我們的目的是純技術(shù)交流,你懂的。

 

上一篇:智能無懼挑戰(zhàn) 山石網(wǎng)科轟動(dòng)RSA2015

下一篇:竊聽風(fēng)云:生活中無處不在的間諜設(shè)備