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 看雪找下吧 :)

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

     

  • 相关阅读:
    WCF中NetTCp配置
    生产者消费者模式
    MVC 引擎优化
    Wcf
    MongoDB运用
    Sock基础
    WebService
    线程
    委托
    特性
  • 原文地址:https://www.cnblogs.com/wang-xiaohao/p/5693064.html
Copyright © 2011-2022 走看看