zoukankan      html  css  js  c++  java
  • HUAWEI TAG-AL00 找IMEI的过程

    前几天,遇到一台华为机型,IMEI获取有问题,然后就找了一下。

    以下是解决过程,权当记录一下,尽管为知笔记已经有备份了 :)

    0x01: 起因

      测试小哥发现,一台机型IMEI获取不全,有问题,拨号页面获取出来 MEID/IMEI1/IMEI2 而我们只能获取 其中两个,丢了一个

        然后抱着手机过来问能不能处理一下,型号为: HUAWEI TAG-AL00

      我抱着试试看的态度,跑了一下之前获取方式,果然少了一个,然后就开始找哪里出了问题。

    0x02:过程

      a. 准备工作,找apk文件和位置

      既然自己获取和拨号页面“*#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 看雪找下吧 :)

       排版不太好,不熟悉编辑器,见谅

     

  • 相关阅读:
    Atitit  atiMail atiDns新特性 v2  q39
    Atitit  atiMail atiDns新特性 v2  q39
    Atitit.aticmd v4  新特性q39 添加定时器释放功能
    Atitit.aticmd v4  新特性q39 添加定时器释放功能
    Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39
    Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39
    Atitit.编程语言and 自然语言的比较and 编程语言未来的发展
    Atitit.编程语言and 自然语言的比较and 编程语言未来的发展
    atitit.解决struts2 SpringObjectFactory.getClassInstance NullPointerException  v2 q31
    知也atitit.解决struts2 SpringObjectFactory.getClassInstance NullPointerException  v2 q31无涯 - I
  • 原文地址:https://www.cnblogs.com/wang-xiaohao/p/5693064.html
Copyright © 2011-2022 走看看