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