如何直接從手機記憶體中擷取CellID?

來源:互聯網
上載者:User

     前幾天在研究通過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

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.