本文將以O(shè)neplus one為例講解Kali Nethunter代碼的移植方式,同時(shí)也在三星的i9100g手機(jī)上測(cè)試成功
Kali Nethunter大體分為三個(gè)部分
定制過(guò)的手機(jī)內(nèi)核:由于需要使用OTG外接usb網(wǎng)卡、用手機(jī)模擬HID設(shè)備、用手機(jī)模擬CDROM光驅(qū),必須對(duì)手機(jī)內(nèi)核進(jìn)行修改添加對(duì)應(yīng)的驅(qū)動(dòng),以及patch相關(guān)的代碼,如果沒(méi)有這一部分修改過(guò)的內(nèi)核,Kali Nethunter將無(wú)法使用與硬件相關(guān)的所有功能
chroot環(huán)境的文件系統(tǒng):所有相關(guān)的軟件程序以ARM架構(gòu)的Kali為基礎(chǔ)集成在一個(gè)文件系統(tǒng)內(nèi),通過(guò)linux的chroot功能可以在Android中跳轉(zhuǎn)至Kali文件系統(tǒng),然后把內(nèi)核相關(guān)的東西mount進(jìn)kali的文件系統(tǒng),之后就可以在這個(gè)chroot后的Kali中執(zhí)行對(duì)應(yīng)的命令了
用于提供界面的APK手機(jī)APP,僅僅是作為UI界面起展示作用,實(shí)際是通過(guò)調(diào)用chroot的Kali中的命令來(lái)實(shí)現(xiàn)所有功能的,當(dāng)然這些APP也提供了一鍵掛載并啟用Kali chroot的功能
其中修改內(nèi)核要求手機(jī)內(nèi)核代碼必須開(kāi)源,盡管內(nèi)核代碼根據(jù)GPL協(xié)議必須開(kāi)源,國(guó)內(nèi)某些手機(jī)仍然不公開(kāi)其內(nèi)核源代碼,這也是Kali Nethunter僅支持Oneplus、三星和谷歌Nexus的原因
首先,我們?yōu)榱撕?jiǎn)化修改內(nèi)核的過(guò)程,可以直接編譯一份CyanogenMod 12.1的代碼,其中就包括了對(duì)應(yīng)機(jī)型(Oneplus one、三星i9100g)的內(nèi)核代碼。而且鑒于Kali Nethunter本身采用的就是CM 12.1的ROM,為了避免其他ROM中可能存在的兼容性問(wèn)題,建議選擇CyanogenMod支持的手機(jī)來(lái)進(jìn)行移植
你可以參考CyanogenMod官方wiki上對(duì)應(yīng)機(jī)型的編譯說(shuō)明,這里在Ubuntu上以O(shè)neplus和i9100g為例演示編譯過(guò)程
親測(cè)編譯時(shí)硬盤(pán)至少需要100G可用空間,虛擬機(jī)至少需要4GB內(nèi)存,不要問(wèn)我如果達(dá)不到要求會(huì)發(fā)生什么……全是眼淚啊
在開(kāi)始配置環(huán)境之前,先提示大家后文會(huì)有簡(jiǎn)化的環(huán)境配置方式,不過(guò)建議大家還是按部就班地用“官方”方式配置,因?yàn)閷?lái)CM可能會(huì)有新的版本出現(xiàn),而官方配置方式可以獲取到最新的代碼
比如對(duì)于Oneplus one的官方示范:http://wiki.cyanogenmod.org/w/Build_for_bacon
sudo apt-get install bison build-essential curl flex git gnupg gperf libesd0-dev liblz4-tool libncurses5-dev libsdl1.2-dev libwxgtk2.8-dev libxml2 libxml2-utils lzop openjdk-7-jdk openjdk-7-jre pngcrush schedtool squashfs-tools xsltproc zip zlib1g-dev
然后64位系統(tǒng)還需要:
sudo apt-get install g++-multilib gcc-multilib lib32ncurses5-dev lib32readline-gplv2-dev lib32z1-dev
如果遇到軟件包不存在,可以apt-cache search一下包名,看看是不是改名字了
之后同步Android代碼(代碼從google上拿,該怎么訪(fǎng)問(wèn)google是你自己要解決的問(wèn)題,下同,不再提示)
$ mkdir -p ~/bin$ mkdir -p ~/android/system$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo$ chmod a+x ~/bin/repo
然后把~/bin加進(jìn)PATH中:
添加到~/.profile中
# set PATH so it includes user's private bin if it existsif [ -d '$HOME/bin' ] ; then PATH='$HOME/bin:$PATH'fi
然后配置repo
$ cd ~/android/system/$ repo init -u https://github.com/CyanogenMod/android.git -b cm-12.1
然后有兩種方式可以獲取特定設(shè)備(Oneplus One)的相關(guān)代碼文件,一種是按照CyanogenMod Wiki上的做,另一種可以去百度(來(lái)自一加社區(qū)的《玩機(jī)組出品,CyanogenMod12編譯教程》),請(qǐng)自行百度自己設(shè)備的代碼獲取方式
mkdir ~/android/cm/.repo/local_manifestsgedit ~/android/cm/.repo/local_manifests/local_manifests.xml
添加
<?xml version='1.0' encoding='UTF-8'?><manifest><project name='CyanogenMod/android_device_oneplus_bacon' path='device/oneplus/bacon' remote='github' /><project name='CyanogenMod/android_device_qcom_common' path='device/qcom/common' remote='github' /><project name='CyanogenMod/android_device_oppo_msm8974-common' path='device/oppo/msm8974-common' remote='github' /><project name='CyanogenMod/android_device_oppo_common' path='device/oppo/common' remote='github' revision='cm-12.0' /><project name='CyanogenMod/android_kernel_oneplus_msm8974' path='kernel/oneplus/msm8974' remote='github' /><project name='TheMuppets/proprietary_vendor_oppo' path='vendor/oppo' remote='github' /><project name='TheMuppets/proprietary_vendor_oneplus' path='vendor/oneplus' remote='github' /><project name='CyanogenMod/android_frameworks_opt_connectivity' path='frameworks/opt/connectivity' remote='github' revision='cm-11.0' /></manifest>
之后就可以開(kāi)始同步Android代碼了
$ repo sync
注意,到這步之后不需要再get prebuilt了,因?yàn)槲覀冇玫氖荂M 12.1,老版本的CM才需要get prebuilt
之后就是編譯了(先不要修改內(nèi)核,確保能夠編譯成功),進(jìn)入android/system文件夾
source build/envsetup.sh
使用CCACHE可以加快編譯速度,但會(huì)吃掉硬盤(pán)空間,為了速度推薦設(shè)置為50G到100G之間,非必須
export USE_CCACHE=1prebuilts/misc/linux-x86/ccache/ccache -M 50G
之后就可以開(kāi)始編譯了,bacon是設(shè)備名
$ croot$ brunch bacon
編譯成功后將會(huì)生成cm-12.1-20151127-UNOFFICIAL-bacon.zip,這個(gè)就是ROM的刷機(jī)包了
所有環(huán)境配置問(wèn)題都可以用Woobuntu系統(tǒng)來(lái)解決,直接安裝Woobuntu后內(nèi)部已經(jīng)集成了Android編譯環(huán)境(包括adb)
代碼我給大家打包好了,27個(gè)G,解壓縮就好(已經(jīng)把內(nèi)核patch過(guò)了),在Woobuntu中編譯命令如下:
tar -jxvf cm12_bacon_source.tar.bz2cd android/system/sudo su rootsource build/envsetup.shexport USE_CCACHE=1prebuilts/misc/linux-x86/ccache/ccache -M 20Gcrootbrunch bacon
簡(jiǎn)單解釋一下,由于壓縮檔的文件屬主是我,而不是你,部分文件權(quán)限會(huì)有問(wèn)題,所以建議直接root權(quán)限編譯(其實(shí)更優(yōu)雅的方式是chown -R,只不過(guò)27個(gè)G代碼都來(lái)chown一遍實(shí)在受不了),sudo時(shí)會(huì)要求輸入你的密碼,而我CCACHE只用了20G是因?yàn)槲业挠脖P(pán)實(shí)在太小,我最后親自從安裝Woobuntu開(kāi)始測(cè)試了一遍,確認(rèn)可以編譯成功。
簡(jiǎn)而言之,這個(gè)簡(jiǎn)化版本只需要你自己處理設(shè)備相關(guān)代碼就好了,比如說(shuō)i9100g就只需要重新按照wiki設(shè)置breakfast i9100g和extract-files(如果網(wǎng)上能搜到更簡(jiǎn)單的方式更好),之后brunch i9100g即可
在修改Android內(nèi)核時(shí),我們需要交叉編譯ARM架構(gòu)的代碼
cd到對(duì)應(yīng)機(jī)型的kernel文件夾下,例如演示的oneplus內(nèi)核目錄為 [email protected]:~/android/system/kernel/oneplus/msm8974
export ARCH=arm
之后在arch/arm/configs文件夾里面找到cm所用的defconfig,然后如下所示
make cyanogenmod_bacon_defconfig
之后就可以make menuconfig了
make menuconfig
然后就是根據(jù)Nethunter的github WIKI上的說(shuō)明自由選擇驅(qū)動(dòng)程序了,不過(guò)我只需要ATH9K的芯片驅(qū)動(dòng),所以直接在Device drivers -> Network device supports -> Wireless lan 里面選中Atheros Wireless Cards ,如果你使用其他芯片的無(wú)線(xiàn)網(wǎng)卡,請(qǐng)自己去選中對(duì)應(yīng)的驅(qū)動(dòng)程序
然后在networking support -> Wireless 里面把Generic IEEE 802.11 Networking Stack (mac80211) 選中
由于Oneplus自己默認(rèn)選中了OTG驅(qū)動(dòng),如果您為別的機(jī)型編譯,請(qǐng)檢查device driver里面usb的otg選項(xiàng)有沒(méi)有選中
設(shè)置完畢后保存退出
make savedefconfigcp defconfig arch/arm/configs/cyanogenmod_bacon_defconfigmake mrproper
您如果是第一次嘗試,可以重新編譯一遍CM看看有無(wú)錯(cuò)誤,然后我們就可以開(kāi)始patch內(nèi)核了
wget http://patches.aircrack-ng.org/mac80211.compat08082009.wl_frag+ack_v1.patchpatch -p1 < mac80211.compat08082009.wl_frag+ack_v1.patch
然后到https://github.com/pelya/android-keyboard-gadget里面尋找自己內(nèi)核版本的patch,這里是3.4內(nèi)核
wget https://raw.githubusercontent.com/pelya/android-keyboard-gadget/master/kernel-3.4.patchpatch -p1 < kernel-3.4.patch
如果不出意外的話(huà),這個(gè)patch一定會(huì)報(bào)錯(cuò),因?yàn)閗ernel代碼是不斷更新著的,不過(guò)別擔(dān)心,我們可以手動(dòng)去patch
報(bào)錯(cuò):
[email protected]:~/android/system/kernel/oneplus/msm8974$ patch -p1 < kernel-3.4.patchpatching file drivers/usb/gadget/Makefilepatching file drivers/usb/gadget/android.cHunk #1 succeeded at 75 (offset 1 line).Hunk #2 succeeded at 2192 with fuzz 2 (offset 101 lines).Hunk #3 FAILED at 2156.Hunk #4 FAILED at 2481.2 out of 4 hunks FAILED -- saving rejects to file drivers/usb/gadget/android.c.rejpatching file drivers/usb/gadget/f_hid.cHunk #7 succeeded at 403 (offset -9 lines).Hunk #8 succeeded at 422 (offset -9 lines).Hunk #10 succeeded at 594 (offset -4 lines).Hunk #11 succeeded at 614 (offset -6 lines).Hunk #12 succeeded at 662 (offset -8 lines).Hunk #13 succeeded at 713 (offset -8 lines).patching file drivers/usb/gadget/f_hid.hpatching file drivers/usb/gadget/f_hid_android_keyboard.cpatching file drivers/usb/gadget/f_hid_android_mouse.c[email protected]:~/android/system/kernel/oneplus/msm8974$
可以看到是android.c第3和第4處patch失敗,我們?nèi)ナ謩?dòng)patch
前兩處都已經(jīng)patch成功了,所以跳過(guò)就好了
解釋一下:左邊是patch代碼,右邊是目前的android.c,patch的意思是要在&uasp_function,
下面加一個(gè)&hid_function,
,第四處也去找一下用大腦找到位置敲上代碼即可
然后就是重新編譯CM,然后生成的刷機(jī)包就是Nethunter超強(qiáng)定制內(nèi)核的CM 12.1了
i9100g編譯時(shí)直接成功,而Oneplus則會(huì)報(bào)個(gè)錯(cuò),是跟usb驅(qū)動(dòng)有關(guān)的,找到報(bào)錯(cuò)位置代碼,然后發(fā)現(xiàn)是一個(gè)結(jié)構(gòu)體還有一個(gè)函數(shù)在使用前沒(méi)有定義,于是我無(wú)比瀟灑地把這個(gè)調(diào)用函數(shù)的代碼!刪!掉!了!,經(jīng)測(cè)試刪掉該代碼不影響手機(jī)正常功能,Nethunter功能也經(jīng)過(guò)測(cè)試非常穩(wěn)定
在Kali Nethunter的github頁(yè)面內(nèi)有詳細(xì)的說(shuō)明,強(qiáng)烈建議在Kali中進(jìn)行Nethunter的編譯
mkdir ~/arm-stuffcd ~/arm-stuffgit clone https://github.com/offensive-security/gcc-arm-linux-gnueabihf-4.7export PATH=${PATH}:/root/arm-stuff/gcc-arm-linux-gnueabihf-4.7/bingit clone https://github.com/offensive-security/kali-nethuntercd ~/arm-stuff/kali-nethunter./build-deps.sh./androidmenu.sh
在編譯時(shí)選擇僅編譯rootfs(因?yàn)槲覀円约翰傩膬?nèi)核的事情了)
如果你不會(huì)刷機(jī),請(qǐng)先百度一下如何正常刷機(jī),比如unlock bootloader啦,TWRP啦,這些百度去吧
刷機(jī)順序?yàn)椋合人yanogenMod,再刷Kali Nethunter的rootfs
下圖是在測(cè)試HID攻擊的i9100g
檢查各項(xiàng)功能:
檢查DriveDroid能否模擬USB光驅(qū)
檢查UsbKeyboard能否偽造鼠標(biāo)和鍵盤(pán)設(shè)備
插上OTG和USB無(wú)線(xiàn)網(wǎng)卡,看看能不能使用Wifite破解無(wú)線(xiàn)密碼
在移植至三星i9100g手機(jī)時(shí),由于手機(jī)內(nèi)存儲(chǔ)空間不夠大(Kali Nethunter刷機(jī)方式要求至少有2GB的可用空間),因此一直刷機(jī)失敗,當(dāng)終于定位到問(wèn)題所在后,最終決定采用其他的方式加載Kali Nethunter的rootfs。首先把kali nethunter的rootfs編譯出來(lái),然后做成一個(gè)img磁盤(pán)鏡像文件,之后把這個(gè)img文件放在sd卡中,動(dòng)態(tài)掛載到/data/local/kali-armhf中,這樣就解決了內(nèi)存儲(chǔ)空間不夠的問(wèn)題
如果編譯內(nèi)核出錯(cuò),您在debug的時(shí)候可以只編譯內(nèi)核,toolchains在prebuilt文件夾里面,自己設(shè)置cross_compile變量吧(常見(jiàn)是把亂選的驅(qū)動(dòng)清除掉,能解決絕大部分報(bào)錯(cuò))
以后我們就可以開(kāi)始玩耍Nethunter了,比如把整個(gè)WooyunWifi都移植到手機(jī)上,再做上離線(xiàn)劫持釣魚(yú)的功能……不過(guò)這些都是編譯完Nethunter之后的事情了
結(jié)尾圖片:在手機(jī)上的WooyunWifi,開(kāi)啟了熱點(diǎn)用于釣魚(yú)
聯(lián)系客服