如何直接从手机内存中获取CellID?

来源:互联网 发布:上网管理行为软件 编辑:程序博客网 时间:2024/05/17 09:34

     前几天在研究通过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:

      memmap

 

我们可以看到v代表虚的,p代表映射的物理内存,最后一列代表地址区间的大小,我们可以用最笨的办法一块一块dump出来,我首次选择0x8a000000这一块,结果一步找到:)

memdump

 

接下来我们就开始分析我们dump出来的0x8a0.bin文件,同过WinHEX打开它:

winHex

 

我们找需要有根据,国内的MCC是460,那么我们找16进制的04 06 00 03,最有的03代表长度,我感觉是字符串类型的写入:)

searchHex

 

我们可以找到第一个04060003的位置,然后分析后面的数据:

findedHex

 

我们可以看到后面又连续着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

 

 

原创粉丝点击