获取华为解锁码的思路

本文介绍了两种获取华为手机bootloader解锁码的方法:一是通过已root的手机dump nvme分区并搜索WVDEVID关键字;二是利用华为工程模式,但需获得授权。详细步骤包括拨号进入工程模式、反编译相关文件及逆向分析atcmdserver进程。
该文章已生成可运行项目,

前言

华为手机在刷入第三方rom需要首先解锁手机,而获取解锁码必须要在华为官网进行,并且有14天限制,这无疑给某些特殊需求的用户和rom定制厂商设置了一个很大难题,也为华为保护自身定制软件提供了有利因素,因此这里给出获取华为解锁码的思路。


方法一   
通过在内置存储卡中dump出nvme分区,搜索WVDEVID关键字获得,这样做的缺陷是手机需要root

255|shell@hwp7:/ $ su
root@hwp7:/ # cd /storage/sdcard1/
root@hwp7:/storage/sdcard1 # mkdir -p PartitionBackup
root@hwp7:/storage/sdcard1 # cd PartitionBackup
root@hwp7:/storage/sdcard1/PartitionBackup # dd of=nvme \
> if=/dev/block/platform/hi_mci.0/by-name/nvme
8192+0 records in
8192+0 records out
4194304 bytes transferred in 0.916 secs (4578934 bytes/sec)
root@hwp7:/storage/sdcard1/PartitionBackup # dd of=oeminfo \
> if=/dev/block/platform/hi_mci.0/by-name/oeminfo
65536+0 records in
65536+0 records out
33554432 bytes transferred in 8.768 secs (3826919 bytes/sec)
root@hwp7:/storage/sdcard1/PartitionBackup # dd of=recovery \
> if=/dev/block/platform/hi_mci.0/by-name/recovery
32768+0 records in
32768+0 records out
16777216 bytes transferred in 4.419 secs (3796609 bytes/sec)
root@hwp7:/storage/sdcard1/PartitionBackup # strings nvme | grep WVDEVID -B 1  
<font color="#ff0000">1234567890123456</font>


方法二

通过华为工程模式获得,但是需要获得工程模式授权,具体逆向思路如下(华为工程模式的详细介绍请问度娘:))

0x00得到拨号*#*#2846579#*#*呼出的工程模式设置activity的信息

1.首先拨号*#*#2846579#*#*呼出工程模式菜单ProjectMenuAct

2.输入:adb shell dumpsys activity|grep “Runningactivities” –A 7

得到ProjectMenuAct这个Activity的信息,从下图可以看出来该Activity所在的包名为com.android.huawei.projectmenu。


3.得到包名为com.android.huawei.projectmenu对应的apk路径

可以知道ProjectMenuAct这个Activity在/system/app/ProjectMenuAct.apk中,我们把这个apk以及odex给pull下来进行逆向分析。

0x01 反编译ProjectMenuAct .odex

由于华为手机的dalvik虚拟机添加了一些内部java方法,直接用baksmali反编译会失败,需要特殊处理,请详见我博客上的文章: http://blog.youkuaiyun.com/autohacker/article/details/50159703

0x02 分析ProjectMenuAct应用



通过代码可以看出,ProjectMenuAct通过android属性系统启动了一个名为atcmdserver的进程用于作为华为手机工程模式的服务端。


0x03逆向atcmdserver

用IDA attach进程atcmdserver


通过在IDA中搜索字符串关键字key,结合交叉引用我们可以逐步找到华为工程模式的命令表所在的内存地址,如下图所示:


进一步调试发现华为工程模式的验证授权流程的主要逻辑是通过

AT^CHECKAUTHORITY
AT^CONFORMAUTHORITY=
而获取bootloader解锁码是如下指令(必须通过授权之后才能获得)
AT^WVKEY?

每一条指令都有先对应的函数来处理,下图中贴出AT^CHECKAUTHORITY的处理程序(图中的各函数通过各种分析处理后修复了堆栈平衡并且根据函数具体功能进行了重命名)


 
具体的逻辑请见测试代码,如下:
import serial
import time

def calckey(seed):
    pass  #这里不给出具体加密算法,鉴于合同原因,只给出思路

def serio(ser , istr , timeout = 0.5):
    ser.timeout = timeout
    istr=istr +"\r\n"
    ser.write(istr)
    ostr = ser.readall()
    print "send:%s\trecv:%s"%(repr(istr),repr(ostr))
    return ostr
    
ser = serial.Serial('com31',115200)
#ostr = serio(ser , 'AT^LED')
#ostr = serio(ser , '?')
#ostr = serio(ser , 'AT^FBLOCK?')
ostr = serio(ser , 'AT^MODEM=0')
ostr = serio(ser , 'AT^CURC=0')
ostr = serio(ser , 'AT^WVKEY?')
ostr = serio(ser , 'AT^CHECKAUTHORITY=?')
ostr = serio(ser , 'AT^CHECKAUTHORITY')
seed = ostr.split("\r\n")[1]
seed = seed[seed.index(":")+1:].strip()
key = calckey(seed)
#key = 'aa06c7b48dd42909926e8223f34aed30baea9bbe44926d818aa81464f5178150a66da672483cbab08a13cc7240d85066878c2a640c4cf26f3d8a8b6969d0a788304bab1dd567fe80bc6c1ca170eda312af3cb0089f12bdde014dd2a0d516526e8ac403a112ec81e20f3f692dc3d7abb590c2b312613422d6a734817310732125'
ostr = serio(ser , 'AT^CONFORMAUTHORITY='+key)
time.sleep(3000)
"""
ostr = serio(ser , 'AT^CURC=0')
ostr = serio(ser , 'AT^SN?')
ostr = serio(ser , 'AT^BSN?') #Serial NR
ostr = serio(ser , 'AT^PHYNUM?') 
ostr = serio(ser , 'AT^ALLVER?')
ostr = serio(ser , 'AT^FBLOCK?')
ostr = serio(ser , 'AT^GETRAM?')
ostr = serio(ser , 'AT^GETEMMC?')
ostr = serio(ser , 'AT^WVKEY?')
ostr = serio(ser , 'AT^VENDORCOUNTRY?')

ostr = serio(ser , 'AT^MODEM=1')
ostr = serio(ser , 'AT^MODEM=1')
ostr = serio(ser , 'AT^CURC=0')
ostr = serio(ser , 'AT^CURC=0')
ostr = serio(ser , 'AT^PHYNUM?')
ostr = serio(ser , 'AT^SIMLOCKDATAREAD?')
ostr = serio(ser , 'AT^IDENTIFYSTART')
"""
ser.close()

另外我在上传了分析过程中保存的版本为IDA6.6的idb分析文件,用IDA打开后按快捷键ctrl+M能看到我处理过后的函数,能大大简化逆向分析工程,详见:
 

http://download.youkuaiyun.com/detail/autohacker/9438916
本文章已经生成可运行项目
<think>嗯,用户想要获取MODIFY_PHONE_STATE权限的方法。我先看看用户提供的引用内容…… 引用[1]提到Android 2.3之后这个权限被修改了,需要system权限或者Google签名才行。用户显然遇到了困难,因为普通人根本拿不到厂商签名[^1]。 再看看引用[2]和[3],解释得更详细了:David把这个权限标记为signatureOrSystem级别。这说明只有预装在/system目录下的应用,或者用设备制造商证书签名的应用才能使用[^2][^3]。引用[3]还特别强调"没有变通方法",除非能让所有手机厂商把你的app预装进系统[^3]。 引用[4]虽然提到了READ_PHONE_STATE权限,但看起来是某个应用的隐私条款,和当前问题关联不大[^4]。 用户现在的问题很明确:想实现自动接听骚扰电话的功能,但被系统权限限制住了。从对话历史看,用户明显是个普通开发者,既没有厂商签名,也不会刷机打包ROM。 这种情况下,常规开发途径确实行不通。我得帮用户找替代方案: 首先想到的是免root方案。现在有些手机品牌开放了辅助功能API,比如小米的通话自动接听功能。这个思路应该告诉用户。 然后root方案也得提一下,虽然门槛高。需要用户刷入带签名的自定义ROM,或者用Magisk这类工具修改系统分区。但普通用户可能不会操作。 自动化工具可能最实用。像Tasker+AutoInput组合,通过模拟点击实现自动接听。虽然不够优雅但确实可行。 对了,还要提醒用户Android 10之后权限管理更严格,连取电话号都需要敏感权限声明。 最后得强调用户隐私问题。这类敏感功能必须明确告知用户,引用[4]的隐私条款虽然不直接相关,但精神值得借鉴[^4]。 用户可能会追问具体实现细节,所以最后准备几个深入问题:免root API怎么用、Tasker具体配置、root后的权限处理方法等。这样对话就能自然延续下去了。 </think>根据提供的引用信息和Android权限机制,获取`MODIFY_PHONE_STATE`权限的可行方法及限制如下: --- ### **核心限制(来自引用[1][2][3])** 1. **权限级别变更** Android 2.3+ 将`android.permission.MODIFY_PHONE_STATE`标记为 **`signatureOrSystem`** 级别: - **System级应用**:需预装在设备的`/system`分区(如厂商预装应用)。 - **厂商签名**:需使用手机制造商相同的证书签名(普通开发者无法获取)[^1][^2][^3]。 2. **无官方变通方案** 引用[3]明确强调:**没有合法绕行方法**,除非与手机厂商合作预装应用[^3]。 --- ### **替代方案与可行方法** #### 1. **免Root替代方案**(适用于自动接听) - **利用辅助功能(AccessibilityService)** 通过`AccessibilityService`模拟接听操作(无需`MODIFY_PHONE_STATE`): ```java public class CallAnswerService extends AccessibilityService { @Override public void onAccessibilityEvent(AccessibilityEvent event) { if (event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) { // 检测来电通知,执行接听操作 performGlobalAction(GLOBAL_ACTION_ANSWER_CALL); } } } ``` **权限声明**: ```xml <service android:name=".CallAnswerService" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService"/> </intent-filter> </service> ``` > ✅ 优点:用户手动启用辅助服务即可,兼容主流机型。 > ❗ 限制:需用户手动授权,无法完全后台静默操作。 #### 2. **Root设备方案** - **刷入自定义ROM** 将应用打包进自定义ROM的`/system`分区,直接获得System权限[^2][^3]。 - **使用Magisk模块** 通过Magisk将应用挂载到`/system`分区(需解锁Bootloader)。 - **修改`platform.xml`** 在Root后的设备中,向`/etc/permissions/platform.xml`添加: ```xml <permission name="android.permission.MODIFY_PHONE_STATE"> <group gid="dialout"/> <!-- 赋予权限组 --> </permission> ``` > ⚠️ 警告:操作风险高,可能导致系统不稳定。 #### 3. **厂商定制接口** - **利用厂商开放API** 部分厂商(如小米、华为)提供**自动接听白名单接口**,需申请特殊资质。 - **合作预装** 与手机厂商合作,将应用预置到出厂系统中(适合大型企业)。 --- ### **隐私与合规要求(引用[4]提醒)** 若应用涉及电话操作(如`READ_PHONE_STATE`): 1. 必须明确告知用户权限用途。 2. 提供隐私政策链接(Google Play强制要求)[^4]。 3. Android 10+ 需在代中动态申请敏感权限: ```java if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_CODE); } ``` --- ### **总结建议** 1. **优先选择免Root方案**:通过`AccessibilityService`实现自动接听(用户可控,合规性强)。 2. **放弃直接使用`MODIFY_PHONE_STATE`**:普通应用几乎无法获取该权限。 3. **Root方案仅限技术验证**:不适合上架应用商店。 > 📌 关键结论:**普通开发者无法合法获取`MODIFY_PHONE_STATE`权限**,必须转向系统允许的替代方案[^1][^2][^3]。 --- ### 相关问题 1. Android 10+ 如何通过辅助功能实现自动拒接电话? 2. 使用`AccessibilityService`接听电话是否会被谷歌商店下架? 3. Root环境下修改`platform.xml`的风险有哪些? 4. 如何为电话控制类应用编写合规的隐私政策?
评论 14
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值