huawei

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

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. 255|shell@hwp7:/ $ su  
  2. root@hwp7:/ # cd /storage/sdcard1/  
  3. root@hwp7:/storage/sdcard1 # mkdir -p PartitionBackup  
  4. root@hwp7:/storage/sdcard1 # cd PartitionBackup  
  5. root@hwp7:/storage/sdcard1/PartitionBackup # dd of=nvme \  
  6. > if=/dev/block/platform/hi_mci.0/by-name/nvme  
  7. 8192+0 records in  
  8. 8192+0 records out  
  9. 4194304 bytes transferred in 0.916 secs (4578934 bytes/sec)  
  10. root@hwp7:/storage/sdcard1/PartitionBackup # dd of=oeminfo \  
  11. > if=/dev/block/platform/hi_mci.0/by-name/oeminfo  
  12. 65536+0 records in  
  13. 65536+0 records out  
  14. 33554432 bytes transferred in 8.768 secs (3826919 bytes/sec)  
  15. root@hwp7:/storage/sdcard1/PartitionBackup # dd of=recovery \  
  16. > if=/dev/block/platform/hi_mci.0/by-name/recovery  
  17. 32768+0 records in  
  18. 32768+0 records out  
  19. 16777216 bytes transferred in 4.419 secs (3796609 bytes/sec)  
  20. root@hwp7:/storage/sdcard1/PartitionBackup # strings nvme | grep WVDEVID -B 1    
  21. <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.csdn.net/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的处理程序(图中的各函数通过各种分析处理后修复了堆栈平衡并且根据函数具体功能进行了重命名)


 
具体的逻辑请见测试代码,如下:
 
 
[python] view plain copy
在CODE上查看代码片 派生到我的代码片
  1. import serial  
  2. import time  
  3.   
  4. def calckey(seed):  
  5.     pass  #这里不给出具体加密算法,鉴于合同原因,只给出思路  
  6.   
  7. def serio(ser , istr , timeout = 0.5):  
  8.     ser.timeout = timeout  
  9.     istr=istr +"\r\n"  
  10.     ser.write(istr)  
  11.     ostr = ser.readall()  
  12.     print "send:%s\trecv:%s"%(repr(istr),repr(ostr))  
  13.     return ostr  
  14.       
  15. ser = serial.Serial('com31',115200)  
  16. #ostr = serio(ser , 'AT^LED')  
  17. #ostr = serio(ser , '?')  
  18. #ostr = serio(ser , 'AT^FBLOCK?')  
  19. ostr = serio(ser , 'AT^MODEM=0')  
  20. ostr = serio(ser , 'AT^CURC=0')  
  21. ostr = serio(ser , 'AT^WVKEY?')  
  22. ostr = serio(ser , 'AT^CHECKAUTHORITY=?')  
  23. ostr = serio(ser , 'AT^CHECKAUTHORITY')  
  24. seed = ostr.split("\r\n")[1]  
  25. seed = seed[seed.index(":")+1:].strip()  
  26. key = calckey(seed)  
  27. #key = 'aa06c7b48dd42909926e8223f34aed30baea9bbe44926d818aa81464f5178150a66da672483cbab08a13cc7240d85066878c2a640c4cf26f3d8a8b6969d0a788304bab1dd567fe80bc6c1ca170eda312af3cb0089f12bdde014dd2a0d516526e8ac403a112ec81e20f3f692dc3d7abb590c2b312613422d6a734817310732125'  
  28. ostr = serio(ser , 'AT^CONFORMAUTHORITY='+key)  
  29. time.sleep(3000)  
  30. """ 
  31. ostr = serio(ser , 'AT^CURC=0') 
  32. ostr = serio(ser , 'AT^SN?') 
  33. ostr = serio(ser , 'AT^BSN?') #Serial NR 
  34. ostr = serio(ser , 'AT^PHYNUM?')  
  35. ostr = serio(ser , 'AT^ALLVER?') 
  36. ostr = serio(ser , 'AT^FBLOCK?') 
  37. ostr = serio(ser , 'AT^GETRAM?') 
  38. ostr = serio(ser , 'AT^GETEMMC?') 
  39. ostr = serio(ser , 'AT^WVKEY?') 
  40. ostr = serio(ser , 'AT^VENDORCOUNTRY?') 
  41.  
  42. ostr = serio(ser , 'AT^MODEM=1') 
  43. ostr = serio(ser , 'AT^MODEM=1') 
  44. ostr = serio(ser , 'AT^CURC=0') 
  45. ostr = serio(ser , 'AT^CURC=0') 
  46. ostr = serio(ser , 'AT^PHYNUM?') 
  47. ostr = serio(ser , 'AT^SIMLOCKDATAREAD?') 
  48. ostr = serio(ser , 'AT^IDENTIFYSTART') 
  49. """  
  50. ser.close()  
另外我在上传了分析过程中保存的版本为IDA6.6的idb分析文件,用IDA打开后按快捷键ctrl+M能看到我处理过后的函数,能大大简化逆向分析工程,详见:
 

http://download.csdn.net/detail/autohacker/9438916
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值