HUAWEI TAG-AL00 找IMEI的过程
前几天,遇到一台华为机型,IMEI获取有问题,然后就找了一下。
以下是解决过程,权当记录一下,尽管为知笔记已经有备份了 :)
0x01: 起因
测试小哥发现,一台机型IMEI获取不全,有问题,拨号页面获取出来 MEID/IMEI1/IMEI2 而我们只能获取 其中两个,丢了一个
然后抱着手机过来问能不能处理一下,型号为: HUAWEI TAG-AL00
我抱着试试看的态度,跑了一下之前获取方式,果然少了一个,然后就开始找哪里出了问题。
0x02:过程
a. 准备工作,找apk文件和位置
既然自己获取和拨号页面“*#06#” 出来的不一致,直接从拨号页面入手看它是如何获取的。
找拨号页面信息,先找到拨号页面信息。通过 Log查看,TAG: ActivityManager,在过滤下 "START" ,找到拨号页面的Activity。
shell里命令:
logcat -s ActivityManager | grep START
get:
"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 看雪找下吧 :)
排版不太好,不熟悉编辑器,见谅
HUAWEI TAG-AL00 找IMEI的过程的更多相关文章
- 找bug的过程
关于昨天程序出差我找bug的过程记录 昨天才程序 https://www.cnblogs.com/pythonywy/p/11006273.html ├── xxxx │ ├── src.py │ └ ...
- [分享] 很多人手机掉了,却不知道怎么找回来。LZ亲身经历讲述手机找回过程,申请加精!
文章开头:(LZ文笔不好,以下全部是文字描述,懒得配图.因为有人说手机掉了,他们问我是怎么找回来的.所以想写这篇帖子.只不过前段时间忙,没时间.凑端午节给大家一些经验) 还是先谢谢被偷经历吧!5月22 ...
- 解决 iOS7 通过tag 找不到 UITableViewCell 的子控件
当iOS7问世,程序的世界就混乱了,以前良好的程序,现在是一塌糊涂,于是只能把问题一个一个攻破. 由于项目当中需要每个cell显示数目不同的图片,于是我在每个cell 赋值之前,通过一下方法把cell ...
- 解决 iOS7 通过tag 找不到 UITableViewCell 的子控件(转)
转自:http://www.cnblogs.com/waiwaibuzhidao/p/3340400.html 当iOS7问世,程序的世界就混乱了,以前良好的程序,现在是一塌糊涂,于是只能把问题一个一 ...
- 周末聊聊IT人员的人脉观:关于帮妹子找兼职有感
背景: 前几天,有个认识了好几年的网友,现在是大学生,在厦门读大一,说和她同学要一起到广州找兼职,看我有没有介绍. 像我这么积极热心善良的人,就说帮她找找看,结果问了几次,没消息,只好诚实的回复人家, ...
- iOS开发中的错误整理,关于用绑定Tag取控件的注意事项,有时候不绑定也是个错!
如图:红色框中是个自定义的导航工具条titlesView(没有绑定Tag),工具条中有五个按钮(按钮绑定了Tag)以及一个红色的指示器indicatorView(没有绑定Tag),下面的蓝色是可以滚动 ...
- 点击Button后,执行MouseDown的过程(使用Call Stack观察很清楚)
Form1上放两个按钮Button1和Button2,默认输入焦点是Button1,现在点击Button2,产生WM_LBUTTONDOWN消息 procedure TForm1.Button2Mou ...
- 计算机本科/硕士找offer的总结 节选
在这样的目标定位下,我的求职历程从2006年10月8日开始,到2007年1月10日正式结束,一共持续了3个月的时间.整个过程可以分为三个阶段:第一阶段:2006年10月份 找工作刚刚开始的阶段,什么都 ...
- Cyclic Components CodeForces - 977E(找简单环)
题意: 就是找出所有环的个数, 但这个环中的每个点都必须只在一个环中 解析: 在找环的过程中 判断度数是否为2就行...emm... #include <bits/stdc++.h> us ...
随机推荐
- CopyTranslator-复制即翻译的外文辅助阅读翻译解决方案
英语/English 复制即翻译的外文辅助阅读翻译解决方案 请尽快更新到,这是你没有体验过的全新版本,只需3分钟,你就会跟我一样,爱上这个软件. 如果您觉得软件对您有所帮助,不用follow,不用fo ...
- MySQL 开机自启动
MySQL 开机自启动 chkconfig add mysqld 或者 echo "/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc ...
- POJ-1422 Air Raid---二分图匹配&最小路径覆盖
题目链接: https://vjudge.net/problem/POJ-1422 题目大意: 有n个点和m条有向边,现在要在点上放一些伞兵,然后伞兵沿着图走,直到不能走为止 每条边只能是一个伞兵走过 ...
- C++11 新特性之 序列for循环
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/lr982330245/article/details/30971195 在C++中在C++中for循 ...
- 1.6 NBU Catalog备份还原
用户的数据保存到了磁盘或者磁带中,并且是安全的,NBU所在的机器还有可能发生故障,需要重新安装或者将NBU部署到其他的机器中继续使用. 在这种情况下,如何让NBU知道用户已经存在的备份策略和存储单元配 ...
- 用到UdpClient的一点经验
Thread.Abort对UdpClient.Receive阻塞的线程无效 http://computer-programming-forum.com/4-csharp/184f9d4ee63704f ...
- lintcode 77.Longest Common Subsequence(最长公共子序列)、79. Longest Common Substring(最长公共子串)
Longest Common Subsequence最长公共子序列: 每个dp位置表示的是第i.j个字母的最长公共子序列 class Solution { public: int findLength ...
- Linux查看CPU和内存使用情况[转]
在系统维护的过程中,随时可能有需要查看 CPU 使用率,并根据相应信息分析系统状况的需要.在 CentOS 中,可以通过 top 命令来查看 CPU 使用状况.运行 top 命令后,CPU 使用状态会 ...
- Linux(二) - Unix&Linux 基本概念
主机 = 内核 + 实用工具 内核(kernel) 当计算机启动时,计算机要经历一系列动作,这些动作构成了引导过程.引导过程的最后一个动作是启动一个非常复杂的程序,该程序就被称为内核(Kernel) ...
- maven环境、本地仓储配置(下载安装)idea配置maven
在第一步:下载maven 官网地址:http://maven.apache.org/download.cgi 下载后进行解压 解压成功 第二步:环境配置 我的电脑右键->属性->高级系统设 ...