久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Android中動(dòng)態(tài)方式破解apk第一篇

 磐石9886 2016-05-22

一,、前言

今天我們開始apk破解的另外一種方式:動(dòng)態(tài)代碼調(diào)試破解,之前其實(shí)已經(jīng)在一篇文章中說到如何破解apk了:Android中靜態(tài)方式破解Apk

主要采用的是靜態(tài)方式,,步驟也很簡單,,首先使用apktool來反編譯apk,得到smail源碼,,然后分析smail代碼,,采用代碼注入技術(shù)來跟蹤代碼,然后找到關(guān)鍵方法進(jìn)行修改,,進(jìn)而破解,,同時(shí)還可以使用一些開源的hook框架,比如:Xposed和Cydia Substrate,來進(jìn)行關(guān)鍵方法的hook,。所以這里我們可以看到我們破解的第一步是使用apktool來進(jìn)行成功的反編譯,,然后是需要了解smali語法,不過關(guān)于smali語法其實(shí)很簡單,,網(wǎng)上有很多教程,。

二、知識(shí)概要分析

那么今天我們就用另外一種方式來破解apk:動(dòng)態(tài)方式,,關(guān)于動(dòng)態(tài)方式其實(shí)很廣義的,,因?yàn)閯?dòng)態(tài)方式相對(duì)于靜態(tài)方式來說,難度大一點(diǎn),,但是他比靜態(tài)方式高效點(diǎn),,能夠針對(duì)更過的破解范圍。當(dāng)然動(dòng)態(tài)方式很多,,所以這里就分為三篇文章來講解這塊:

1,、動(dòng)態(tài)方式破解apk前奏篇(Eclipse動(dòng)態(tài)調(diào)試smail源碼)

2、動(dòng)態(tài)方式破解apk升級(jí)篇(IDA動(dòng)態(tài)調(diào)試so源碼)

3,、動(dòng)態(tài)方式破解apk終極篇(應(yīng)對(duì)加固的apk破解方法)

從這三篇文章能夠讓我們破解一般的apk沒有任何問題,,不過不能代表能夠破解所有的apk,因?yàn)闆]有絕對(duì)的安全,,也是沒有絕對(duì)的破解,,兩方都在進(jìn)步,我們只能具體問題具體分析,。好了,,下面我們就來看第一篇文章,也是今天的重點(diǎn):Eclipse動(dòng)態(tài)調(diào)試smali源碼

首先需要解釋一下,,這里為什么說是調(diào)試smali源碼,,不是Java源碼,因?yàn)槲覀兣^反編譯的人知道,,使用apktool反編譯apk之后,,會(huì)有一個(gè)smali文件夾,這里就存放了apk對(duì)應(yīng)的smali源碼,,關(guān)于smali源碼這里不解釋了,,網(wǎng)上有介紹。

三,、案例分析

因?yàn)檫@一篇是一個(gè)教程篇,,所以不能光說,那樣會(huì)很枯燥的,,所以這里用一個(gè)例子來介紹一下:

我們就用阿里2014年安全挑戰(zhàn)賽的第一題:AliCrack_one.apk

看到這張圖了,,阿里還挺會(huì)制造氛圍的,,那么其實(shí)很簡單,我們輸入密碼就可以破解了,,下面我們就來看看如何獲取這個(gè)密碼,。

第一步:使用apktool來破解apk

java -jar apktool_2.0.0rc4.jar d -d AliCraceme_1.apk -o out

這里的命令不做解釋了。

但是有一個(gè)參數(shù)必須帶上,,那就是:-d

因?yàn)檫@個(gè)參數(shù)代表我們反編譯得到的smali是java文件,,這里說的文件是后綴名是java,如果不帶這個(gè)參數(shù)的話,,后綴名是smali的,,但是Eclipse中是不會(huì)識(shí)別smali的,而是識(shí)別java文件的,,所以這里一定要記得加上這個(gè)參數(shù),。

反編譯成功之后,我們得到了一個(gè)out目錄,,如下:

源碼都放在smali文件夾中,,我們進(jìn)入查看一下文件:

看到了,這里全是Java文件的,,其實(shí)只是后綴名為java了,內(nèi)容還是smali的:

2,、修改AndroidManifest.xml中的debug屬性和在入口代碼中添加waitDebug

上面我們反編譯成功了,,下面我們?yōu)榱撕罄m(xù)的調(diào)試工作,所以還是需要做兩件事:

1》修改AndroidManifest.xml中的android:debuggable='true'

關(guān)于這個(gè)屬性,,我們前面介紹run-as命令的時(shí)候,,也提到了,他標(biāo)識(shí)這個(gè)應(yīng)用是否是debug版本,,這個(gè)將會(huì)影響到這個(gè)應(yīng)用是否可以被調(diào)試,,所以這里必須設(shè)置成true。

2》在入口處添加waitForDebugger代碼進(jìn)行調(diào)試等待,。

這里說的入口處,,就是程序啟動(dòng)的地方,就是我們一般的入口Activity,,查找這個(gè)Activity的話,,方法太多了,比如我們這里直接從上面得到的AndroidManifest.xml中找到,,因?yàn)槿肟贏ctivity的action和category是固定的,。

當(dāng)然還有其他方式,比如aapt查看apk的內(nèi)容方式,,或者是安裝apk之后用

adb dumpsys activity top 命令查看都是可以的,。

找到入口Activity之后,我們直接在他的onCreate方法的第一行加上waitForDebugger代碼即可,找到對(duì)應(yīng)的MainActivity的smali源碼:

然后添加一行代碼:

invoke-static {}, Landroid/os/Debug;->waitForDebugger()V

這個(gè)是smali語法的,,其實(shí)對(duì)應(yīng)的Java代碼就是:android.os.Debug.waitForDebugger();

這里把Java語言翻譯成smali語法的,,不難,網(wǎng)上有smali的語法解析,,這里不想再解釋了,。

第三步:回編譯apk并且進(jìn)行簽名安裝

java -jar apktool_2.0.0rc4.jar b -d out -o debug.apk

還是使用apktool進(jìn)行回編譯

編譯完成之后,將得到debug.apk文件,,但是這個(gè)apk是沒有簽名的,,所以是不能安裝的,那么下面我們需要在進(jìn)行簽名,,這里我們使用Android中的測(cè)試程序的簽名文件和sign.jar工具進(jìn)行簽名:

關(guān)于簽名的相關(guān)知識(shí),,可以看這篇文章:

Android中的簽名機(jī)制詳解

java -jar .\sign\signapk.jar .\sign\testkey.x509.pem .\sign\testkey.pk8 debug.apk debug.sig.apk

簽名之后,我們就可以進(jìn)行安裝了,。

第四步:在Eclipse中新建一個(gè)Java工程,,導(dǎo)入smali源碼

這里我們新建一個(gè)Java工程,記住不是Android工程,,因?yàn)槲覀冏詈笳{(diào)試其實(shí)是借助于Java的調(diào)試器,,然后勾選掉Use default location選項(xiàng),選擇我們的smali源碼目錄,,也就是我們上面反編譯之后的out目錄,,點(diǎn)擊完成

我們導(dǎo)入源碼之后的項(xiàng)目工程結(jié)構(gòu):

主要看MainActivity類:

第五步:找到關(guān)鍵點(diǎn),然后打斷點(diǎn)

這一步我們看到,,其實(shí)說的比較廣義了,,這個(gè)要具體問題具體分析了,比如這個(gè)例子中,,我們知道當(dāng)我們輸入密碼之后,,肯定要點(diǎn)擊按鈕,然后觸發(fā)密碼的校驗(yàn)過程,,那么這里我們知道找到這個(gè)button的定義的地方,,然后進(jìn)入他的點(diǎn)擊事件中就可以了。這里分為三步走:

1》使用Eclipse自帶的View分析工具找到Button的ResId

點(diǎn)擊之后,,需要等待一會(huì),,分析View之后的結(jié)果:

看到了,這里我們能夠看到整個(gè)當(dāng)前的頁面的全部布局,,已經(jīng)每個(gè)控件的屬性值,,我們需要找到button的resource-id

這里我們看到定義是@+id/button這個(gè)值。

2》我們得到這個(gè)resId之后,,能否在smali工程中全局搜索這個(gè)值,,就可以定位到這個(gè)button的定義的地方呢,?

然后我們看看搜到的結(jié)果:

這時(shí)候我們其實(shí)是在資源文件中搜到了這個(gè)id的定義,這個(gè)id值對(duì)應(yīng)的是0x7F05003E,。

當(dāng)然除了這種方式,,我們還有一種方式能快速找到這個(gè)id對(duì)應(yīng)的整型值,那就是在反編譯之后的values/public.xml文件中:

這個(gè)文件很有用的,,他是真?zhèn)€apk中所有資源文件定義的映射內(nèi)容,,比如drawable/string/anim/attr/id 等這些資源文件定義的值,名字和整型值對(duì)應(yīng)的地方:

這個(gè)文件很重要,,是我們?cè)趯ふ彝黄瓶诘闹匾P(guān)鍵,,比如我們有時(shí)候需要通過字符串內(nèi)容來定位到關(guān)鍵點(diǎn),這里就可以通過string的定義來找到對(duì)應(yīng)的整型值即可,。

當(dāng)我們找到了button對(duì)應(yīng)的id值了之后,,我們就可以用這個(gè)id值在一次全局搜索一下,因?yàn)槲覀冎?,Android中編譯之后的apk,,在代碼中用到的resId都是用一個(gè)整型值代替的,這個(gè)整型值就是在R文件中做了定義,,將資源的id和一個(gè)值對(duì)應(yīng)起來,,然后代碼里面一般使用R.id.button這樣的值,在編譯出apk的時(shí)候,,這個(gè)值就會(huì)被替換成對(duì)應(yīng)的整型值,,所以在全局搜索0x7F05003E

搜索的結(jié)果如下:

看到了,這里就定位到了代碼中用到的這個(gè)button,,我們進(jìn)入代碼看看:

在這里,看到了,,使用了findViewById的方式定義Button,我們?cè)谕旅婧唵畏治鲆幌聅mali語法,,下面是給button添加一個(gè)按鈕事件,這里用的是內(nèi)部類MainActivity$1,,我們到這個(gè)類看看,,他肯定實(shí)現(xiàn)了OnClickListener接口,那么直接搜onClick方法:

在這里我們就可以下個(gè)斷點(diǎn)了,,這里就是觸發(fā)密碼校驗(yàn)過程,。

第六步:運(yùn)行程序,設(shè)置遠(yuǎn)程調(diào)試工程

在第五步中,,我們找到了關(guān)鍵點(diǎn),,然后打上斷點(diǎn),下面我們就來運(yùn)行程序,,然后在Eclipse中設(shè)置遠(yuǎn)程調(diào)試的工程

首先我們運(yùn)行程序,,因?yàn)槲覀兗尤肓藈aitForDebug的代碼,,所以啟動(dòng)的時(shí)候會(huì)出現(xiàn)一個(gè)Wait debug的對(duì)話框。不過,,我測(cè)試的時(shí)候,,我的手機(jī)沒有出現(xiàn)這個(gè)對(duì)話框,而是一個(gè)白屏,,不過這個(gè)不影響,,程序運(yùn)行起來之后,我們看看如何在Eclipse中設(shè)置遠(yuǎn)程調(diào)試工程,,首先我們找到需要調(diào)試的程序?qū)?yīng)遠(yuǎn)程調(diào)試服務(wù)端對(duì)應(yīng)的端口:

這里我們看到有幾個(gè)點(diǎn):

1》在程序等待遠(yuǎn)程調(diào)試服務(wù)器的時(shí)候,,前面會(huì)出現(xiàn)一個(gè)紅色的小蜘蛛

2》在調(diào)試服務(wù)端這里我們會(huì)看到兩個(gè)端口號(hào):8600/8700,這里需要解釋一下,,為什么會(huì)有兩個(gè)端口號(hào)呢,?

首先在這里的端口號(hào),代表的是,,遠(yuǎn)程調(diào)試服務(wù)器端的端口,,下面在簡單來看一下,Java中的調(diào)試系統(tǒng):

這里我們看到,,這里有三個(gè)角色:

111》JDB Client端(被調(diào)試的客戶端),,這里我們可以認(rèn)為我們需要破解的程序就是客戶端,如果一個(gè)程序可以被調(diào)試,,當(dāng)啟動(dòng)的時(shí)候,,會(huì)有一個(gè)jdwp線程用來和遠(yuǎn)程調(diào)試服務(wù)端進(jìn)行通信

這里我們看到,我們需要破解的程序啟動(dòng)了JDWP線程,,注意這個(gè)線程也只有當(dāng)程序是debug模式下才有的,,也就是AndroidManifest.xml中的debug屬性值必須是true的時(shí)候,也就是一開始為什么我們要修改這個(gè)值的原因,。

222》JDWP協(xié)議(用于傳輸調(diào)試信息的,,比如調(diào)試的行號(hào),當(dāng)前的局部變量的信息等),,這個(gè)就可以說明,,為什么我們?cè)谝婚_始的時(shí)候,反編譯成java文件,,因?yàn)闉榱薊clipse導(dǎo)入能夠識(shí)別的Java文件,,然后為什么能夠調(diào)試呢?因?yàn)閟mali文件中有代碼的行號(hào)和局部變量等信息,,所以可以進(jìn)行調(diào)試的,。

333》JDB Server端(遠(yuǎn)程調(diào)試的服務(wù)端,一般是有JVM端),,就是開啟一個(gè)JVM程序來監(jiān)聽調(diào)試端,,這里就可以認(rèn)為是本地的PC機(jī),,當(dāng)然這里必須有端口用來監(jiān)聽,那么上面的8600端口就是這個(gè)作用,,而且這里端口是從8600開始,,后續(xù)的程序端口后都是依次加1的,比如其他調(diào)試程序:

那么有了8600端口,,為什么還有一個(gè)8700端口呢,?他是干什么的?

其實(shí)他的作用就是遠(yuǎn)程調(diào)試端備用的基本端口,,也就是說比如這里的破解程序,,我們用8600端口可以連接調(diào)試,8700也是可以的,,但是其他程序,,比如demo.systemapi他的8607端口可以連接調(diào)試,8700也是可以的:

所以呀,,可以把8700端口想象成大家都可以用于連接調(diào)試的一個(gè)端口,,不過,在實(shí)際過程中,,還是建議使用程序獨(dú)有的端口號(hào)8600,,我們可以查看8600和8700端口在遠(yuǎn)程調(diào)試端(本地pc機(jī))的占用情況:

看到了,這里的8600端口和8700端口號(hào)都是對(duì)應(yīng)的javaw程序,,其實(shí)javaw程序就是啟動(dòng)一個(gè)JVM來進(jìn)行監(jiān)聽的,。

好了,到這里我們就弄清楚了,,Java中的調(diào)試系統(tǒng)以及遠(yuǎn)程調(diào)試的端口號(hào),。

注意:

其實(shí)我們可以使用adb jdwp命令查看,當(dāng)前設(shè)備中可以被調(diào)試的程序的進(jìn)程號(hào)信息:

下面繼續(xù),,我們知道了遠(yuǎn)程調(diào)試服務(wù)端的端口:8600,,以及ip地址,這里就是本地ip:localhost/127.0.0.1

我們可以在Eclipse中新建一個(gè)遠(yuǎn)程調(diào)試項(xiàng)目,,將我們的smali源碼工程和設(shè)備中需要調(diào)試的程序關(guān)聯(lián)起來:

右擊被調(diào)試的項(xiàng)目=》選擇Debug Configurations:

然后開始設(shè)置調(diào)試項(xiàng)目

選擇Romote Java Application,在Project中選擇被調(diào)試的smali項(xiàng)目,,在Connection Type中選擇SocketAttach方式,,其實(shí)還有一種方式是Listener的,關(guān)于這兩種方式其實(shí)很好理解:

#Listner方式:是調(diào)試客戶端啟動(dòng)就準(zhǔn)備好一個(gè)端口,,當(dāng)調(diào)試服務(wù)端準(zhǔn)備好了,,就連接這個(gè)端口進(jìn)行調(diào)試

#Attach方式:是調(diào)試服務(wù)端開始就啟動(dòng)一個(gè)端口,等待調(diào)試端來連接這個(gè)端口

我們一般都是選擇Attach方式來進(jìn)行操作的,。

好了,,我們?cè)O(shè)置完遠(yuǎn)程調(diào)試的工程之后,,開始運(yùn)行,擦發(fā)現(xiàn),,設(shè)備上的程序還是白屏,,這是為什么呢?看看DDMS中調(diào)試程序的狀態(tài):

擦,,關(guān)聯(lián)到了這個(gè)進(jìn)程,,原因也很簡單,我們是上面使用的是8700端口號(hào),,這時(shí)候我們選中了這個(gè)進(jìn)程,,所以就把smali調(diào)試工程關(guān)聯(lián)到了這個(gè)進(jìn)程,所以破解的進(jìn)程沒反應(yīng)了,,我們立馬改一下,,用8600端口:

好了,這下成功了,,我們看到紅色的小蜘蛛變成綠色的了,,說明調(diào)試端已經(jīng)連接上遠(yuǎn)程調(diào)試服務(wù)端了。

注意:

我們?cè)谠O(shè)置遠(yuǎn)程調(diào)試項(xiàng)目的時(shí)候,,一定要注意端口號(hào)的設(shè)置,,不然沒有將調(diào)試項(xiàng)目源碼和調(diào)試程序關(guān)聯(lián)起來,是沒有任何效果的

第七步:開始運(yùn)行調(diào)試程序,,進(jìn)入調(diào)試

下面我們就開始操作了,,在程序的文本框中輸入:gggg內(nèi)容,點(diǎn)擊開始:

好了,,到這里我們看到期待已久的調(diào)試界面出來了,,到了我們開始的時(shí)候加的斷點(diǎn)處,這時(shí)候我們就可以開始調(diào)試了,,使用F6單步調(diào)試,,F(xiàn)5單步跳入,F(xiàn)7單步跳出進(jìn)行操作:

看到了,,這里使用v3變量保存了我們輸入的內(nèi)容

這里有一個(gè)關(guān)鍵的地方,,就是調(diào)用MainActivity的getTableFromPic方法,獲取一個(gè)String字符串,,從變量的值來看,,貌似不是規(guī)則的字符串內(nèi)容,這里先不用管了,,繼續(xù)往下走:

這里又遇到一個(gè)重要的方法:getPwdFromPic,,從字面意義上看,應(yīng)該是獲取正確的密碼,,用于后面的密碼字符串比對(duì),。

查看一下密碼的內(nèi)容,,貌似也是一個(gè)不規(guī)則的字符串,但是我們可以看到和上面獲取的table字符串內(nèi)容格式很像,,接著往下走:

這里還有一個(gè)信息就是,,調(diào)用了系統(tǒng)的Log打印,log的tag就是v6保存的值:lil

這時(shí)候,,我們看到v3是保存的我們輸入的密碼內(nèi)容,,這里使用utf-8獲取他的字節(jié)數(shù)組,然后傳遞給access$0方法,,我們使用F5進(jìn)入這個(gè)方法:

在這個(gè)方法中,,還有一個(gè)bytesToAliSmsCode方法,使用F5進(jìn)入:

那么這個(gè)方法其實(shí)看上去還是很簡單的,,就是把傳遞進(jìn)來的字節(jié)數(shù)組,,循環(huán)遍歷,取出字節(jié)值,,然后轉(zhuǎn)化成int類型,,然后在調(diào)用上面獲取到的table字符串的chatAt來獲取指定的字符,使用StringBuilder進(jìn)行拼接,,然后返回即可,。

按F7跳出,查看,,我們返回來加密的內(nèi)容是:日日日日,,也就是說gggg=>日日日日

最后再往下走,可以看到是進(jìn)行代碼比對(duì)的工作了,。

那么上面我們就分析完了所有的代碼邏輯,,還不算復(fù)雜,我們來梳理一下流程:

A>調(diào)用MainActivity中的getTableFromPic方法,,獲取一個(gè)table字符串

我們可以進(jìn)入看看這個(gè)方法的實(shí)現(xiàn):

這里可以大體了解了,,他是讀取asset目錄下的一個(gè)logo.png圖片,然后獲取圖片的字節(jié)碼,,在進(jìn)行操作,,得到一個(gè)字符串,那么我們從上面的分析可以知道,,其實(shí)這里的table字符串類似于一個(gè)密鑰庫,。

B>通過MainActivity中的getPwdFromPic方法,獲取正確的密碼內(nèi)容

C>獲取我們輸入內(nèi)容的utf-8的字節(jié)碼,,然后調(diào)用access$0方法,獲取加密之后的內(nèi)容

D>access$0方法中在調(diào)用bytesToAliSmsCode方法,,獲取加密之后的內(nèi)容

這個(gè)方法是最核心的,,我們通過分析知道,,他的邏輯是,通過傳遞進(jìn)來的字節(jié)數(shù)組,,循環(huán)遍歷數(shù)組,,拿到字節(jié)轉(zhuǎn)化成int類型,然后在調(diào)用密鑰庫字符串table的charAt得到字符,,使用StringBuilder進(jìn)行拼接,。

通過上面的分析之后,我們知道獲取加密之后的輸入內(nèi)容和正確的密碼內(nèi)容做比較,,那么我們現(xiàn)在有的資源是:密鑰庫字符串和正確的加密之后的密碼,,以及加密的邏輯

那么我們的破解思路其實(shí)很簡單了,相當(dāng)于,,我們知道了密鑰庫字符串,,也知道了,加密之后的字符組成的字符串,,那么可以通過遍歷加密之后的字符串,,循環(huán)遍歷,獲取字符,,然后再去密鑰庫找到指定的index,,然后在轉(zhuǎn)成byte,保存到字節(jié)數(shù)組,然后用utf-8獲取一個(gè)字符串,,那么這個(gè)字符串就是我們要的密碼,。

下面我們就用代碼來實(shí)現(xiàn)這個(gè)功能:

代碼邏輯,很簡單吧,,其實(shí)這個(gè)函數(shù)相當(dāng)于上面加密函數(shù)的bytesToAliSmsCode的反向?qū)崿F(xiàn),,運(yùn)行結(jié)果:

OK,得到了正確的密碼,,下面來驗(yàn)證一下:

哈哈,,不要太激動(dòng),成功啦啦~~,。破解成功,。

補(bǔ)充:

剛剛我們?cè)跀帱c(diǎn)調(diào)試的時(shí)候,看到了代碼中用了Log來打印日志,,tag是lil,,那么我們可以打印這個(gè)log看看結(jié)果:

看到了,這里table是密鑰庫,,pw是正確的加密之后的密碼,,enPassword是我們輸入之后加密的密碼。

所以從這里可以看到,這個(gè)例子,,其實(shí)我們?cè)谄平鈇pk的時(shí)候,,有時(shí)候日志也是一個(gè)非常重要的信息。

破解需要的資料,,我已經(jīng)上傳了,,想動(dòng)手的同學(xué)可以嘗試的操作,下載地址:

http://download.csdn.net/detail/jiangwei0910410003/9526113

四,、思路整理

1,、我們通過apktool工具進(jìn)行apk的反編譯,得到smali源碼和AndroidManifest.xml,,然后修改AndroidManifest.xml中的debug屬性為true,,同時(shí)在入口處加上waitForDebug代碼,進(jìn)行debug等待,,一般入口都是先找到入口Activity,,然后在onCreate方法中的第一行這里需要注意的是:apktool工具一定要加上-d參數(shù),這樣反編譯得到的文件是java文件,,這樣才能夠被Eclipse識(shí)別,,進(jìn)行調(diào)試。

2,、修改完成AndroidManifest.xml和添加waitForDebug之后,,我們需要在使用apktool進(jìn)行回編譯,回編譯之后得到的是一個(gè)沒有簽名的apk,,我們還需要使用signapk.jar來進(jìn)行簽名,,簽名文件直接使用測(cè)試程序的簽名文件就可以,最后在進(jìn)行安裝,。

3,、然后我們將反編譯之后的smali源碼導(dǎo)入到Eclipse工程中,找到關(guān)鍵點(diǎn),,進(jìn)行下斷點(diǎn),,這里的關(guān)鍵點(diǎn),一般是我們先大致了解程序運(yùn)行的結(jié)構(gòu),,然后找到我們需要破解的地方,,使用View分析工具,或者是使用jd-gui工具直接查看apk源碼(使用dex2jar將dex文件轉(zhuǎn)化成jar文件,,然后用jd-gui進(jìn)行查看),,找到代碼的大體位置。然后下斷點(diǎn),,這里我們可以借助Eclipse的DDMS自帶的View分析工具找到對(duì)應(yīng)控件的resid,,然后在全局搜索這個(gè)控件的resid,,或者直接在values/public.xml中查找,最終定位到這個(gè)控件位置,,在查看他的點(diǎn)擊事件即可,。

4、設(shè)置遠(yuǎn)程調(diào)試工程,,首先運(yùn)行需要調(diào)試程序,然后在DDMS中找到對(duì)應(yīng)的調(diào)試服務(wù)端的端口號(hào),,然后在Debug Configurations中設(shè)置遠(yuǎn)程調(diào)試項(xiàng)目,,設(shè)置對(duì)應(yīng)的調(diào)試端口和ip地址(一般都是本機(jī)pc,那就是localhost),然后紅色小蜘蛛變成綠色的,,表示我們的遠(yuǎn)程調(diào)試項(xiàng)目連接關(guān)聯(lián)上了調(diào)試程序,,這里需要注意的是,一定需要關(guān)聯(lián)正確,,不然是沒有任何效果的,,關(guān)聯(lián)成功之后,就可以進(jìn)行操作,。

5,、操作的過程中,會(huì)進(jìn)入到關(guān)鍵的斷點(diǎn)處,,通過F6單步,,F(xiàn)5單步進(jìn)入,F(xiàn)7單步跳出,,來進(jìn)行調(diào)試,,找到關(guān)鍵方法,然后通過分析smali語法,,了解邏輯,,如果邏輯復(fù)雜的,可以通過查看具體的環(huán)境變量的值來觀察,,這里也是最重要的,,也是最復(fù)雜的,同時(shí)這里也是沒有規(guī)章可尋的,,這個(gè)和每個(gè)人的邏輯思維以及破解能力有關(guān)系,,分析關(guān)鍵的加密方法是需要功底的,當(dāng)然這里還需要注意一個(gè)信息,,就是Log日志,,有時(shí)候也是很重要的一個(gè)信息。

6,、最后一般當(dāng)我們知道了核心方法的邏輯,,要想得到正確的密碼,,還是需要自己用語言去實(shí)現(xiàn)邏輯的,比如本文中的加密方法,,我們需要手動(dòng)的code一下加密的逆向方法,,才能得到正確的密碼。

五,、遺留問題

1,、使用apktool工具進(jìn)行反編譯有時(shí)候并不是那么順利,比如像這樣的報(bào)錯(cuò):

這個(gè)一般都是apktool中解析出現(xiàn)了錯(cuò)誤,,其實(shí)這個(gè)都是現(xiàn)在apk為了抵抗apktool,,做的apk加固策略,這個(gè)后面會(huì)寫一篇文章如何應(yīng)對(duì)這些加固策略,,如何進(jìn)行apk修復(fù),,其實(shí)原理就是分析apktool源碼,找到指定的報(bào)錯(cuò)位置,,進(jìn)行apktool代碼修復(fù)即可,。

2、本文中說到了Java的調(diào)試系統(tǒng),,但是為了篇幅限制,,沒有詳細(xì)的講解了整個(gè)內(nèi)容,后面會(huì)寫一篇文章具體介紹Java中的調(diào)試系統(tǒng)以及Android的調(diào)試系統(tǒng),。

3,、有時(shí)候我們還會(huì)遇到回編譯成功了,然后遇到運(yùn)行不起來的錯(cuò)誤,,這個(gè)就需要使用靜態(tài)方式先去分析程序啟動(dòng)的邏輯,,看看是不是程序做了什么運(yùn)行限制,比如我們?cè)陟o態(tài)分析那篇文章中,,提到了應(yīng)用為了防止反編譯在回編譯運(yùn)行,,在程序的入口處作了簽名校驗(yàn),如果校驗(yàn)失敗,,直接kill掉自己的進(jìn)程,,退出程序了,所以這時(shí)候我們還是需要使用靜態(tài)方式去分析apk,。

4,、如何做到不修改AndroidManifest.xml中的debug屬性就可以進(jìn)行調(diào)試:

1》 修改boot.img,從而打開系統(tǒng)調(diào)試,這樣就可以省去給app添加android:debuggable='true',,再重打包的步驟了,。

2》直接修改系統(tǒng)屬性,使用setpropex工具在已經(jīng)root的設(shè)備上修改只讀的系統(tǒng)屬性,。使用此工具來修改ro.secure和ro.debuggable的值,。

這個(gè)也會(huì)在后面詳細(xì)介紹這兩種方法

六,、總結(jié)

這篇文章我們就介紹了如何使用Eclipse去動(dòng)態(tài)調(diào)試反編譯之后的smali源碼,這種方式比靜態(tài)方式高效很多的,,比如本文中的這個(gè)例子,,其實(shí)我們也可以使用靜態(tài)方式進(jìn)行破解的,但是肯定效率沒有動(dòng)態(tài)方式高效,,所以以后我們又學(xué)會(huì)了一個(gè)技能,,就是動(dòng)態(tài)的調(diào)試smali源碼來跟蹤程序的核心點(diǎn),但是現(xiàn)在市場(chǎng)上的大部分應(yīng)用沒有這么簡單就破解了,,比如核心的加密算法放到了native層去做,,那么這時(shí)候就需要我們?nèi)?dòng)態(tài)調(diào)試so文件跟蹤,這個(gè)是我們下一篇文章的內(nèi)容,,也有的時(shí)候,apk進(jìn)行加固了,,直接在apktool進(jìn)行反編譯就失敗了,,這時(shí)候我們就需要先進(jìn)行apk修復(fù),然后才能后續(xù)的操作,,這個(gè)是我們下下篇的文章,,如何應(yīng)對(duì)apk的加固策略。通過這篇文章我們可以看到動(dòng)態(tài)方式破解比靜態(tài)方式高效的多,,但是有時(shí)候我們還需要使用靜態(tài)方式先做一些準(zhǔn)備工作,,所以在破解apk的時(shí)候,動(dòng)靜結(jié)合,,才能做到完美的破解,。

更多詳細(xì)內(nèi)容:www.wjdiankong.cn

關(guān)注微信公眾號(hào):Android技術(shù)分享

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多