十三、 将ESN写入手机
接下去就是搞定ESN了,这个过程很痛苦,我2月份研究过,以完美的失败告终。最近几天是重新研究,尝试过很多方法,有些没意义的,就不写了,有些有意义的,我会记录下来,供大家参考。
[分析说明]
2月份研究过的方法包括:
1、通过CDMA Workshop 3.3.5直接写(有很多写的方式),全部失败;
2、经典的内存扫描+QXDM手写方式(此处只是分析,该方法的操作步骤见后文):
a) 通过CDMA Workshop(或CDMA Universal、或UniCDMA)扫描9530的可读内存;
b) 把可读内存段导出,存为.bin文件;
c) 用16进制编辑器在导出的.bin文件中搜索9530的ESN(按“字节反序”,即,如果你手上的9530的ESN是1A-2B-3C-4D的话,你要在文件中搜索4D-3C-2B-1A),找到之后把地址全部记下来,并且换算成真实地址(该方法的操作步骤后面详述);
d) 用QXDM,打开Memory Viewer,找到所有的上述ESN所在地址,把这些ESN全部清为00000000,或者改成自己UIM卡的ESN F5XXXXXX;
可是面临的问题是,一旦重启,ESN又会恢复成9530自己原先的ESN。
所以最近几天主要在研究这个ESN的问题。经过对年初写号失败的反思,我有如下思路:
[分析说明]
1) 年初写ESN失败,可能是存在一些未知问题;例如:我找到的可读内存地址段不准确,导致从内存中搜索到的ESN数量不够全面,有遗漏,所以即使把我找到的ESN全部改写了也无效?
2) ESN是否存在硬件上或不可读取的系统文件内,9530的系统程序会从硬件上或系统文件中读取,所以我们无论如何修改内存都无效?
3) 我们修改内存,到底起到的是怎样的效果,拔掉电池之后我们写入的信息不会丢失吗?9530怎么才能将自己管理的ESN交给我们来修改呢?……
带着这些问题,最近几天,在google进行了一些关键字搜索,到国内外的网站上看了看帖子,了解到的新知识梳理如下:
[原理知识]
1、9530除了ESN之外,还有个MEID的东西(见上文的介绍),并且看起来好像9530是MEID控制硬件识别的(不好意思,之前一直不知道这么回事情,所以总是盯着ESN);
2、MEID和ESN有一定的对应关系(知道MEID可以推算出ESN,但反之不行);
3、9530中有一个SCM(可以翻译成状态类别码/状态类别标识、标记):
SCM (Station Class Mask)
If the Value is 0x2A then Phone is ESN Based
If the Value is 0x3A then Phone is MEID Based
这个大家都能看懂吧,不解释了。
[分析说明]
此时,再加上其他一些杂七杂八的信息,我在脑中仔细思考了一下摆在面前的困难,决定,坚决放弃原先只盯着ESN的思路,现在开始盯着ESN/MEID/SCM,我决定对这3个东西同时下手。
[A]ESN攻坚战预备阶段:
在ESN修改过程中,我们要做的第一阶段工作,就是扫描9530的可读内存段,并将这些可读内存导出来保存为.bin文件,然后在这些文件中找到MEID、ESN位置。
[操作步骤]
[A-1]扫描可读内存
2月份用CDMA Universal扫描内存、导出内存都很正常,最近却碰到了一些问题,不知道是不是因为我换了操作系统的缘故(当时是2003,现在是2008);所以我改用CDMA Workshop扫描内存(试用版也可以),大家可以根据各自情况选择CDMA Workshop、UniCDMA、CDMA Universal工具中的一个。
将9530连接到电脑,打开DM,再打看CDMA Workshop,选择COM端口(例如COM9),点“Connect”,如果连接成功,可以点击一下“Read”,看看读取9530信息是否正常,如果正常,则将CDMA Workshop切换到Memory一页进行内存扫描:
选择开始地址、结束地址以及步长,我选择的扫描步长是256字节,所以扫描速度很慢(一般用1024-4096),第一次扫描,从0000:0000开始,扫到3E24:1900时被我手工停掉了(没时间),扫描结果如下:
Scanning memory for readable areas:
Unreadable area from: 0000:0000
Readable area from: 01DF:2B00
Unreadable area from: 0268:5300
Readable area from: 17AE:B100
Unreadable area from: 17B2:6700
Readable area from: 17B2:8A00
Unreadable area from: 17FC:CB00
Process is stopped at: 3E24:1900
[特别注意]
上述扫描结果,我们需要从中挑出成对的“Readable”、“Unreadable”,例如第一对是:
Readable area from: 01DF:2B00
Unreadable area from: 0268:5300
表明从01DF:2B00到0268:5300这一段内存地址可读。
这是一个不严谨的说法,但是不影响我们的操作。如果要严谨地来说,应该是:
a) 从01DF:2B00开始的内存可读;
b) 也有可能在01DF:2B00之前某个地址的内存就已经可读,但不会提前到超过01DF:2A00(因为0x01DF2B00-0x100=0x01DF2A00,步长256就是0x100);
c) 我们所选择的这一段内存,也有可能中间会出现不可读的部分,因为我们是按照步长256字节进行跳跃式搜索的,不是一个字节一个字节地搜索的,可能不可读的部分被我们刚好跳过了,当然这种可能性很小,因为256字节在内存分配中是很小的数值了;
d) 直到0268:5300这个地址,内存开始不可读;
e) 也有可能在0268:5300这个地址之前,内存就已经不可读了,但不会提前到超过0268:5200(因为0x02685300-0x100=0x02685200,步长256就是0x100)。
f) ……
是不是很罗嗦?呵呵,技术工作就是这么个东西,不能不严谨,有可能不严谨会侥幸没出问题,但是如果你的技术工作是关系到重要系统或重要事件,等你出问题了就太晚了,要养成严谨的习惯。
后来我有空的时候,又从3E24:1900开始扫描,到6724:F900结束,这一段没有扫到可读内存。再后来我就没继续扫下去了。
经过上述过程,我通过扫描得到的可读内存区间段如下:
[重要数据]
共三段(没有扫完,只扫了0000:0000到6724:F900的部分,因为我觉得后面的内存肯定没啥用)
第一段可读内存:
起始地址:01DF2B00
结束地址:02685300
总字节数:8988672 bytes(10进制)
第二段可读内存:
起始地址:17AEB100
结束地址:17B26700
总字节数:243200 bytes(10进制)
实际导出时在17B266E0处结束
实际字节数:243168 bytes(10进制)
第三段可读内存:
起始地址:17B28A00
结束地址:17FCCB00
总字节数:4866304 bytes(10进制)
(这一段我忘记是否全部导出了,反正不会相差太多,因为我的扫描步长是256字节,已经足够精确了。)
特别注意:关于扫描内存,我走过弯路,感谢maxpda论坛的1007给我解答,请大家务必注意——新版本的ROM限制了内存扫描操作,请使用老版本ROM,否则你会发现无法进行。(我用的是9530AllLang_PBr4.7.0_rel140_PL4.0.0.125_A4.7.0.99)
[A-1]导出可读内存,存为.bin文件
大家可以根据各自情况选择CDMA Workshop、UniCDMA、CDMA Universal工具中的一个,将上述可读内存全部导出;我用的是CDMA Workshop 3.3.5。
[操作步骤]
[A-2]在内存镜像文件中搜索ESN、MEID
有了这3个.bin文件,我们就可以找ESN和MEID了;
[操作步骤]
打开UltraEdit,并依次用16进制编辑方式打开.bin文件,并在该文件中搜索16进制的内容(9530手机自身的MEID和ESN),注意,搜索的内容需要“按字节反序”,例如:
MEID是A0 00 00 0D F1 E2 D3
ESN是80 1A 2B 3C
则我们需要搜索的实际上分别是:
D3 E2 F1 0D 00 00 A0
3C 2B 1A 80
友情提醒:其实你可以搜索两、三个字节,即可。
如下图所示,我们在第一个.bin文件中,在0086ebdf-0086ebe6这个位置搜索到了第一个MEID:
由于第一个.bin文件实际上是从01DF2B00开始的,因此,我们找到的这个MEID实际上在内存中的位置是:0x01DF2B00 + 0x0086ebdf = 0x026616DF。
以此类推,你需要从所有的文件中找出所有的MEID和ESN。
下面是我找到的所有地址记录(我的9530用的是.99的ROM,你的可能跟我的不太一样):
[重要数据]
先说MEID,共3处(看绝对地址就行):
起始地址:0x01DF2B00
偏移地址:0x0086ebdf
绝对地址:0x026616DF
起始地址:0x17B28A00
偏移地址:0x0011dbb8
绝对地址:0x17C465B8
起始地址:0x17B28A00
偏移地址:0x0029fe10
绝对地址:0x17DC8810
还有两个地址,有时候会用来存放MEID:
0x17DC88E0
0x17DD1960
我觉得它们只是缓存,临时用的内存地址,不需要关注。
此外还有个特殊地址0x17FCB20D,请见ESN内存部分的描述。
接着说ESN,ESN比较不确定,我找到10余处,有些地址会永远都是ESN码,有些地址却有时候会变化。不多说,列在这里:
[重要数据]
0x02663F1C
0x02663F33(以上这两个地址非常重要,我们可以称它们为第一组ESN地址)
注:第一组ESN地址会发生变化,根据我最近操作过的所有记录来看,我一共发现过三组这样的ESN地址,其规律就是都在0x0266:0000至0x0266:FFFF这一段内存空间中。另外两组分别是0x02664042和0x02664059,以及0x0266405A和0x02664071。你也会有一组这样的ESN地址。
0x17AEB8A4
0x17B0FCDC
0x17B1C244
0x17B9F0B8
0x17C4613C
以上5个ESN地址也很重要,我们可以称它们为第二组ESN地址,目前我实验过N次,这些地址没有发生过变化。
下面还有几个地址,有时候会存放ESN,大部分时候是0,可以适当关注:
0x17C46214
0x17C4C8A0
0x17C5AC2C
还有一个特殊的地址:
0x17FCB20D
第一次研究的时候,发现该地址有时候是ESN,有时候是00000000;在本文刚写成的时候,在我修改esn成功的那一次,它还变成过MEID;在本文v1.1版本修订过程中,可以确定该地址为QXDM的command缓存地址,事实上可以不用关注。
这样,我们一共找到11处ESN,有些是会变的,大家记住这一点就行了,反正我们在操作过程中对这些地址进行多次检查,注意不要遗漏即可。
正式开战
本部分包括如下操作:
1、用QXDM Memory Viewer改内存中的MEID,共3处,全部改为0;
2、用QXDM Memory Viewer改内存中的ESN,共7-10处左右(不一定每个都是必须,但为了保险,我全部改了);全部改为0;
[关键节点检查]
这个时候ESN和MEID在内存中均为0,此时应该出现一个现象,即,你可以使用命令修改ESN或MEID中的任意一个(我在这里列出关键节点,是为了让你方便检查错误,如果上述两个步骤没有成功,这个检查就会有重要帮助了;你不需要手工检查,直接做下面的第3步,如果出错,再回头检查上面的内容):
可以用命令修改ESN为任意值,包括0;
可以用命令修改MEID为一个非0值了(只有0x00000000000000不可以,其他都可以,如果你输入位数不足14位,它会自动在前面补0,如果你输入位数超过14位,系统会报错)——这个仅仅是我自己感兴趣的测试,大家不需要测试,该动作不是必须的,而且,如果用命令修改了MEID,请注意ESN一定会随之发生变化;
3、接下来应该通过QXDM的命令把ESN修改为自己UIM卡的ESN,同时确保MEID为全0;
4、将网络设置为GSM,并尝试打开网络;
5、拔下USB线,然后冷启动(拔电池,再装上电池);
6、机器启动之后,检查GSM网络和信号标示状态,应该是SOS;
7、此时内存中的第一个MEID地址(0x026616DF)处应该已经恢复位MEID,用QXDM的Memory Viewer将其改为0;然后将网络改为1XEV,然后拨打10000号、拨打自己的其他手机,看是否正常;
8、如果正常就再次冷启动,就大功告成了。
下文详述:
[B-1]第一步,把9530内存中所有的MEID和ESN清0
得到上述重要数据(地址)之后,开始忙活,祭出法宝QXDM:
(要打开DM,并确认自己的9530连接电脑的端口是COM几,我的是COM9,然后用QPST Configuration配置一下端口,确认连接正常)
1、打开QXDM之后,先到Options-Communications里面设置连接的端口,然后打开两个窗口,一个Memory Viewer(F4),一个Command Output,并确认已经连接成功;
2、在QXDM主窗口的左下角,有个Command输入框,在这里输入命令,依次输入:
RequestNVItemRead meid(敲回车)
RequestNVItemRead esn(敲回车)
RequestNVItemRead scm(敲回车)
这样在Command Output窗口就可以看到返回的执行结果,如下:
RequestNVItemRead esn
DIAG TX item:
esn = 0x00000000
DIAG RX item:
esn = 0x80YYYYYY
RequestNVItemRead meid
DIAG TX item:
meid = 0x0000000000000000
DIAG RX item:
meid = 0x00A000000DYYYYYY
RequestNVItemRead scm
DIAG TX item:
scm = 0x00
DIAG RX item:
scm = 0x3A
不错,工作正常。
3、然后你可以试试看用RequestNVItemWrite命令改meid和esn,会很顺利地失败的:)
4、因为我在直接折腾ESN的时候,遭受过太多挫折,所以现在决定先灭掉MEID,具体方式如下:
在QXDM的Memory Viewer中,找到如下3个地址
绝对地址:0x026616DF
绝对地址:0x17C465B8
绝对地址:0x17DC8810
把它们统统改成00000000000000并点击“Write”;
然后再通过Command去Read一下,确认是否修改完成。
5、接着也别耽误了,用同样的方法找到所有的ESN,全部改为00000000
6、用Command确认一下:
嗯,很完美。
到目前,我们做了3件事情:
SCM被改成了0x2A
MEID被清为了0
ESN被清为了0
[B-2]第二步,把9530内存中的ESN改为我们UIM卡上的ESN
7、现在试试看用Command去写ESN,写自己UIM卡上的ESN,发现没有报错:
8、继续通过Read的方式确认一下:
不错,经过反复确认,发现没什么问题(修正:不必关注上图中的scm值,按照改进后的方法,此时scm应该是0x3A)。
9、在手机上进入Manage Connections菜单,选择Mobile Network Options,然后将Network Technology设置为GSM/UMTS;然后再退到Manage Connections里面,勾上Mobile Network前面的勾,这时候手机屏幕右上角的信号标示应该是个叉号,或者是个SOS;
10、我们需要把机器重新启动一下。经过kaka推荐,我用的是冷启动,就是直接拔电池,然后启动。
11、等手机启动好了之后,先检查一下手机屏幕右上角的信号标示,应该是个SOS;
12、在QXDM中通过命令读一下scm、meid、esn的值,应该分别是0x2A、老的meid、自己UIM卡的esn;
13、如果你不放心,可以再次冷启动手机,并再次确认手机屏幕右上角的信号标示、scm、meid、esn;应该与11、12条一样;
14、在QXDM中输入命令RequestNVItemWrite meid_cd 1,并敲回车;然后通过QXDM的Memory Viewer,将meid修改为0,正常的话,应该只有0x026616DF这一个地址需要修改,另外两个meid地址处都是0,无需修改了;
15、在QXDM中输入命令RequestNVItemWrite meid_cd 0,并敲回车;在QXDM中通过命令读一下scm、meid、esn的值,应该分别是0x2A、0、自己UIM卡的esn;
16、在手机上进入Manage Connections菜单,选择Mobile Network Options,然后将Network Technology设置为1XEV;然后再退到Manage Connections里面,勾上Mobile Network前面的勾,这时候手机屏幕右上角的信号标示应该显示出网络信号正常;
17、请拨打10000号,如果正常,再拨打其他手机号码试试看,如果正常就重新冷启动手机;
18、如果一切顺利,现在你的手机已经可以正常使用电话功能了。
此外,你还可以进入手机菜单的Options-Status,确认一下状态:
你会看到两个重要变化:
原先这个界面的最下面是MEID,现在变成pESN了!
更重要的是,这里的ESN已经被改写成我们自己UIM的ESN啦!
但同时还会发现另外一个问题:
##000000进入手编界面,你看到的pESN是0
而Status里面看到的ESN是我们UIM卡上的ESN(上文图),这两个不一致(目前使用中没有影响)。
一切正常,恭喜你终于可以使用自己烧号的9530了!
不论上述测试过程对大家是否有所帮助,都希望大家多提意见,集思广益,互相帮助,谢谢!
备注:
1、 第一次发布的方法,大家在实际操作中最容易出现的一个问题,就是meid会自动还原,不能保持0的状态;
2、 因此,我仔细研究了这个问题,发现如下值得留意的信息:
A) 在MEID和ESN都是0的情况下,可以用命令修改MEID或ESN中的一个,不同的是——如果修改MEID,ESN会自动随之变换成对应的值,如果修改ESN,MEID当时是0,而重启之后,MEID会变成上一个有效值;
我推测,9530会自动保存上一个有效值,那么它到底如何判断“有效”呢?
A) 要么是必须修改文件中的值;
B) 要么是必须用Write命令写成功;
C) 要么是它会根据上一次成功连接网络的情况自动保存一下MEID,下次启动时恢复;
D) ……
所以我想,可能得先让9530“忘记”它的meid,因此,我通过设置GSM-1XEV网络来回切换的方式,最终修改了MEID,并让它记住了0这个值。最后的修改版本,更彻底,直接用修改meid_cd标记的方式使机器不再校验meid,从而达到我们的目的。
以上为推测,不知道RIM是如何设计它的保护措施的,因此,仅供参考。
上传的附件: