前几天在研究通过RIL_GetCellTowerInfo的API获取CellID的问题,当时发现了一些机型没法直接通过这个API来获取CellID的问题,在网上查了一些资料如何使用C#在Windows mobile裝置上擷取CellID 说可以直接从内存直接读取这些信息,我这两天验证了一把,这里给大家share一下,这个方法的缺点就是我们每个机型都要一个个分析,但是可行:)!
首先我们需要下载一个开源的工具包 ,主要是把机器当时的内存信息给导出来,然后通过WinHEX工具分析导出来的内存信息,找到MCC,因为国内的MCC是460,各个国家的MCC可以网上查到。
我的环境:
VS2008 + WM6 SDK + P800(多普达真机) + C#/C++
首先需要说明的一点需要得到该信息需要对程序进行签名,要不然直接会出现访问异常:),刚开始写了C#版本的一直报异常,最后加上签名就OK了!
首先我们先分析:
下载到工具后进入CMD到解压的目录,看一下内存的map:
我们可以看到v代表虚的,p代表映射的物理内存,最后一列代表地址区间的大小,我们可以用最笨的办法一块一块dump出来,我首次选择0x8a000000这一块,结果一步找到:)
接下来我们就开始分析我们dump出来的0x8a0.bin文件,同过WinHEX打开它:
我们找需要有根据,国内的MCC是460,那么我们找16进制的04 06 00 03,最有的03代表长度,我感觉是字符串类型的写入:)
我们可以找到第一个04060003的位置,然后分析后面的数据:
我们可以看到后面又连续着120位这样的信息,ok,位置找到了,那么我们就可以开始code了,记录下这个地址:0x003b2958,那么我们在程序中要找的地址就是0x8a000000+0x003b2958=???????
代码很简单,我下面给出我的C++代码:
-------------------------------------------------------------------
// 内存Cell的结构
struct MEMCellStruct
{
byte MCC[3];
byte MCCLength[1];
byte MNC[2];
byte UnKnow1[2];
byte LAC[2];
byte UnKnow2[4];
byte CID[2];
byte UnKnow3[104];
//total=120
};
struct CellStruct
{
CString MCC;
CString MNC;
CString LAC;
CString CID;
UINT Strength;
};
BOOL bPerMode = SetKMode(TRUE);
DWORD dPermissions = SetProcPermissions(0xFFFFFFFF);
UINT MemLoation = 0x8a3b2958;
MEMCellStruct* Mem = NULL;
MEMCellStruct MEMCellTower;
UINT CPermissions;
CellStruct CellTower[7];
CRITICAL_SECTION CriticalSection;
// Initialize the critical section one time only.
/*if (!InitializeCriticalSectionAndSpinCount(&CriticalSection, MemLoation) )
return;*/
InitializeCriticalSection(&CriticalSection);
EnterCriticalSection(&CriticalSection);
int i = 0;
while (i < 7)
{
//读内存
Mem = (MEMCellStruct*)MemLoation;
MEMCellTower = *Mem;
short *pCID = (short*)(MEMCellTower.CID);
CString strTmp =_T("");
strTmp.Format(_T("%d"),*pCID);
CellTower[i].CID = strTmp;
short *pLAC = (short*)(MEMCellTower.LAC);
strTmp.Format(_T("%d"),*pLAC);
CellTower[i].LAC = strTmp;
strTmp.Format(_T("%d%d%d"),MEMCellTower.MCC[0],MEMCellTower.MCC[1],MEMCellTower.MCC[2]);
CellTower[i].MCC = strTmp;
strTmp.Format(_T("%d%d"), MEMCellTower.MNC[0],MEMCellTower.MNC[1]);
CellTower[i].MNC = strTmp;
//CellTower[i].Strength = Mem->Strength[0];
MemLoation = MemLoation + 0x78;
i++;
}
// Release ownership of the critical section.
LeaveCriticalSection(&CriticalSection);
// Release resources used by the critical section object.
DeleteCriticalSection(&CriticalSection);
SetProcPermissions(dPermissions);
SetKMode(bPerMode);
代码比较乱,编译过了,没有问题,数据也得到了,不过和网上文章有些不一样的地方,感觉他前面的信息有些多余:),或者不正确。
至于程序怎么签名,我这里就不多少了,直接放在你的手机里测试一下:),这里说明一点,很多手机的内存结构可能不一样,每款都需要你自己分析,需要有耐心:),兴奋吧!我们也hacking!!!
转载注明出处,谢谢!
wangweixing2000 2009-06-22