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位置

   [email protected]:/ $ 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 看雪找下吧 :)

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

 

时间: 2024-10-26 21:18:34

HUAWEI TAG-AL00 找IMEI的过程的相关文章

找bug的过程

关于昨天程序出差我找bug的过程记录 昨天才程序 https://www.cnblogs.com/pythonywy/p/11006273.html ├── xxxx │ ├── src.py │ └── fil_mode.py │ └── data_time.py │ └── loading.py │ └── data_time.py │ └── logger.py src.py与打印日志相关片段 if __name__ == '__main__': logger_start('程序主界面')

关于找工作的过程中需要注意的地方

在辞职之后,我迅速的投入到找工作的大军中,很快,工作有了回应,我一直期待进入的两个公司给我了回信,但是都需要一段时间的报批Offer,第一个公司需要等待一周多的时间,第二个公司本来说要很快的把进度提前的,结果HR一直没有给我打电话,而技术那边对我的印象一直都还不错,一直说会要我.着一周的时间里,我也面试了其他的公司,但是由于要求回复的时间太短,无一例外的被我推掉了,但是很不幸,我之前一直说我没有问题的公司都没有录用我,此时的我感觉很无助,两家公司的说法都是我工作的年限太短,而且他们判断的标准是我

[分享] 很多人手机掉了,却不知道怎么找回来。LZ亲身经历讲述手机找回过程,申请加精!

文章开头:(LZ文笔不好,以下全部是文字描述,懒得配图.因为有人说手机掉了,他们问我是怎么找回来的.所以想写这篇帖子.只不过前段时间忙,没时间.凑端午节给大家一些经验) 还是先谢谢被偷经历吧!5月22号凌晨1点多,家中被盗(我之前有发过帖子).损失很多,手机.笔记本电脑.老姐的钱包.信用卡.老姐的两部手机,都被偷了.然后报了警,警察来拍了照片,做了笔录(没他们的事了,一下都是靠我自己的能力找回,JC只是配角~~) 22日晚买了FT(FACETIME),在某宝上买的.价格不贵,可以查到偷手机的人注

TGraphiControl响应WM_MOUSEMOVE的过程(以TPaintBox为例)

起因:非Windows句柄控件也可以处理鼠标消息,我想知道是怎么处理的:并且想知道处理消息的顺序(比如TPaintBox和TForm都响应WM_Mouse消息该怎么办)界面:把TPaintBox放到TForm的最左上角,不留一点缝隙,这样可以准确发送消息给TPaintBox,然后看看它处理完以后,是否同时发送给TForm继续处理,还是被截断了.代码:分别给TForm1.PaintBox1MouseMove和TForm1.FormMouseMove事件添加代码,随便写点什么比如paintbox1.

FOJ 2232 匈牙利算法找二分图最大匹配

题目链接 简单理解匈牙利算法 简单理解二分图 尽量让每一个随从击败一个对手且随从全部存活,关键是为每一个随从找对手(递归过程),"腾". #include<iostream> #include<cstdio> #include<cstring> using namespace std; int used[110]; int g[110][110]; //建立随从和对手的对战关系 int ee[110]; int n; struct people{ i

点击Button2后,执行MouseDown的过程

Form1上放两个按钮Button1和Button2,默认输入焦点是Button1,现在点击Button2,产生WM_LBUTTONDOWN消息procedure TForm1.Button2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);begin tag := 2000;end; 其实这个过程使用Call Stack观察的很清楚,这里就是做学习笔记,并细化一下:TButto

写一本书和找一本书

端午和朋友去了苏州金鸡湖游玩,不料第二天下大雨.就呆在酒店玩Linux内核编译...感觉没意思就開始看那本总也看不完的<失控>,读到了一个思想,感觉挺有思想.藏品多没什么意义,关键是索引,你能用最快的速度找到你想找的那件,这才是有意义的.在一个博尔赫斯的那种包括全部图书的图书馆,找到一本书和写出那本书相同困难,找书的过程事实上就是写书的过程. 狄德罗,百科全书派人物.畅想了人类知识的汇总,汇总于一个博尔赫斯的图书馆中,可是他如果不论什么知识都是不可压缩的.即你不能用一个更短的短语来描写叙述一个

【转】关于找工作的鸡零狗碎(续)

0.不是前言的前言      这两天折腾来折腾去,算是把自己卖了.相比很多人来说我算是比较幸运的,找工作也还算顺利,但一顿折腾下来还是身心俱疲,一度连轴转过一个月中间没有一天休息,累得恨不得跳了小月河.我不经常逛BBS,发言也不多,算上几次失物招领贴和寻物启事贴,加起来发的帖子纵使手指头数不过来,加上脚趾头肯定够了. 之所以写这么长的文章,是对自己过去几个月来的经历的一个总结,也是希望自己的教训能够让大家少走一些弯路.我一直认为,找工作绝对不是你有我就没有的一 个零和游戏,而是一个大家互相帮助互

推荐给每个找工作的IT毕业生--打鸡血书

本文忘了在哪里下载的了,转过来与各位共享 一. 求职历程总结 2007年1月10日,随着在三方协议上郑重签下自己的名字,我的求职历程终于划上了一个圆满的句号.在这三个月漫长而艰辛的过程中,我付出了很 多,经历了很多,也收获了很多.这一路走来,要感谢的人太多太多,尤其要感谢每一个在找工作过程中关心.帮助过我的人,我会一生铭记你们的恩情.现在,尘 埃落定,到了该回报的时候,我首先要回报的就是我的母校和同学.所以,决定把自己找工作中积累的经验写出来给大家分享,希望能对那些将要找工作或还在找工 作的同学