HUAWEI TAG-AL00 找IMEI的過程

 

前幾天,遇到一臺華爲機型,IMEI獲取有問題,而後就找了一下。java

如下是解決過程,權當記錄一下,儘管爲知筆記已經有備份了 :)python

 

0x01: 原由android

 

  測試小哥發現,一臺機型IMEI獲取不全,有問題,撥號頁面獲取出來 MEID/IMEI1/IMEI2 而咱們只能獲取 其中兩個,丟了一個git

    而後抱着手機過來問能不能處理一下,型號爲: HUAWEI TAG-AL00shell

  我抱着試試看的態度,跑了一下以前獲取方式,果真少了一個,而後就開始找哪裏出了問題。app

 

0x02:過程編輯器

 

  a. 準備工做,找apk文件和位置ide

 

  既然本身獲取和撥號頁面「*#06#」 出來的不一致,直接從撥號頁面入手看它是如何獲取的。函數

  找撥號頁面信息,先找到撥號頁面信息。經過 Log查看,TAG: ActivityManager,在過濾下 "START" ,找到撥號頁面的Activity。工具

 

  shell裏命令:

   1 logcat -s ActivityManager | grep START 

  get:

   1 "act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x14200000 cmp=com.android.contacts/.activities.DialtactsActivity" 

  

  同時根據包名 」com.android.contacts「 找apk位置

   shell@HWTAG-L6753:/ $ pm path com.android.contacts 

   package:/system/priv-app/Contacts/Contacts.apk 

  

  而後把apk文件夾pull出來。由於包含oat文件

 

  b.開始找位置:

 

  首先是oat文件轉換成dex,不轉換也能夠,拖到ida裏面看smali,不過既然能夠看僞代碼,仍是看僞代碼吧...

  oat轉換dex工具爲git某大神寫好的python,在此感謝,

  不過少數oat文件解析有問題,正在學python,但願之後能夠改一下。

  不出意外,能夠得到完整dex文件。

  而後將classes.dex拖到Contacts.apk 中去,方便解包。也能夠直接看dex,不用合併。

  

  而後,apk文件拖到jeb,找對應的Activity位置:

   com.android.contacts.activities.DialtactsActivity 

  

  沒看到明顯獲取IMEI位置,全局找字符串: "*#06#",定位到:  

   com.android.dialer.SpecialCharSequenceMgr.java 

   

  找到位置後,查看顯示獲取IMEI位置,函數:

   static boolean handleDeviceIdDisplay(Context context, String input)  

 

  c. 具體實現:  

  

static boolean handleDeviceIdDisplay(Context context, String input) {
        boolean v11_boolean;
        Object v10_phone_server = context.getSystemService("phone");
        if(v10_phone_server == null || !input.equals("*#06#")) {
            v11_boolean = false;
        }
        else {
            context.getResources().getString(2131231984);
            ArrayList v3 = new ArrayList();
            String v9_product = SystemProperties.get("ro.product.name", "");
            String v0_CountryIso = ((TelephonyManager)v10_phone_server).getNetworkCountryIso();
            String v8_cdma = SystemProperties.get("cdma.meid", null);
            String v4_imei1 = SystemProperties.get("gsm.imei1", null);
            String v5_imei2 = SystemProperties.get("gsm.imei2", null);
            Log.d("xionghaifeng", "meid: " + v8_cdma + " imei1 " + v4_imei1 + " imei2 " + v5_imei2 + " product " + v9_product
                     + " PLMN " + v0_CountryIso);
            if(!v9_product.equalsIgnoreCase("TAG-TL00") || !v0_CountryIso.equals("cn")) {
                if(v8_cdma != null && !TextUtils.isEmpty(((CharSequence)v8_cdma))) {
                    ((List)v3).add("MEID:" + v8_cdma.toUpperCase());
                }
                if(v4_imei1 != null && !TextUtils.isEmpty(((CharSequence)v4_imei1))) {
                    ((List)v3).add("IMEI1:" + v4_imei1);
                }
                if(v5_imei2 == null) {
                    goto label_63;
                }
                if(TextUtils.isEmpty(((CharSequence)v5_imei2))) {
                    goto label_63;
                }
                ((List)v3).add("IMEI2:" + v5_imei2);
            }
            else {
                if(v8_cdma != null) {
                    TextUtils.isEmpty(((CharSequence)v8_cdma));
                }
                if(v4_imei1 == null) {
                    goto label_63;
                }
                if(TextUtils.isEmpty(((CharSequence)v4_imei1))) {
                    goto label_63;
                }
                ((List)v3).add("IMEI:" + v4_imei1);
            }
        label_63:
            new AlertDialog$Builder(context).setTitle("IMEI_IMEI").setItems(((List)v3).toArray(new String[((
                    List)v3).size()]), null).setPositiveButton(17039370, null).setCancelable(false).
                    show();
            v11_boolean = true;
        }
        return v11_boolean;
    }

 

    還看到了小哥的log信息,仔細看了下log,果真有..... :)

    xiong兄弟,很差意思哈

 

    而後根據僞代碼開始寫獲取IMEI部分

    發現大部分是使用的: android.os.SystemProperties 獲取的,然而「SystemProperties 被Hide了,沒法正常使用。

    源碼裏看了下:SystemProperties.get(String key); 

    恰巧,前幾天看:android.os.Build 代碼時候,其中:private static String More ...getString(String property)  函數實際調用的就是:SystemProperties.get(String key)

    而後,直接反射走起...其實反射:android.os.SystemProperties 或者 反射 :android.os.Build 結果都是同樣的,

 

    代碼以下,多了一個for循環,能夠直接一步找函數的:

    

        /**
         * huaweiTAGAL00獲取IMEI特殊
         * @param context
         * @param imeis
         */
        private void getMeid_HuaweiTAGAL00(Context context, HashSet<String> imeis) {
            
            try {
                Class<?> classz = Class.forName("android.os.Build");
                Method[] declaredMethods = classz.getDeclaredMethods();
                for (int i = 0; i < declaredMethods.length; i++) {
                    Method method = declaredMethods[i];
                    if (method.getName().equals("getString")) {
                        method.setAccessible(true);
                        String meid = (String) method.invoke(classz, "cdma.meid");
                        String imei1 = (String) method.invoke(classz, "gsm.imei1");
                        String imei2 = (String) method.invoke(classz, "gsm.imei2");
                        
                        Log.d("wyy","meid"+meid);
                        Log.d("wyy","imei1"+imei1);
                        Log.d("wyy","imei2"+imei2);
                        
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            
        }

 

    測試OK,獲取值和撥號頁面一致。

    搞定收工。

 

 0x03: 後續

    至於爲何在撥號的Activity沒有找到明顯位置,再次確認了下,撥號頁面註冊了鍵盤監聽,SpecialCharSequenceMgr爲回調位置。

 

   Over

   附 oat提取dex工具地址: https://github.com/ManyFace/ExtractDexFromOat

   其餘功能工具: jeb 看雪找下吧 :)

   排版不太好,不熟悉編輯器,見諒

相關文章
相關標籤/搜索