2012-06-20 64 views
2

如果我可以掛接到一個Win32進程,我將能夠做到:從流程內類內閱讀Win32的變量

  • 讀變量?

  • 我有上面的Win32應用程序的完整源代碼,我可以使用它作爲此主題的參考嗎?

乾杯。

+3

如果您可以找到存儲變量的位置並擁有正確的權限,請繼續:[ReadProcessMemory](http://msdn.microsoft.com/en-us/library/windows/desktop/ms680553(v = vs.85)的.aspx)。這並不是說這是你在大多數情況下特別想做的事情。 – chris

+0

-1,你能澄清你在這裏問什麼嗎?我根本不懂。 –

+0

@MichaelKristofik他想編寫一個程序來附加到已經運行的程序,以讀取類內變量的內容。他有這個正在運行的程序的源代碼。基本上他想實現一個調試器的基本組件(變量監視/檢查)。 –

回答

2

是的。只要你的模塊掛鉤進程,你就可以共享相同的地址空間。這意味着進程已分配的內存(例如,類實例)將會被您訪問。

如果你知道類實例的偏移量,那麼你可以:

  • 施放此內存地址的指針類(只要你有包括類的頭)從
  • 使用補償這個內存地址訪問類的成員。

請參閱MSDN上的Traversing the Module List。一旦你想要「掛鉤」的過程的MODULEENTRY32,您可以使用modBaseAddr作爲您的偏移的基礎。例如,如果你知道它指向是0x000AD421一個類的實例一個全局變量,你可以這樣做:

ClassName *pClassBase = moduleEntry->modBaseAddr + 0x000AD421; 
pClassBase->UseSomeFunctions(); 

unsigned char *pClassBase = moduleEntry->modBaseAddr + 0x000AD421; // if we don't know the exact definition of the class we want to play with 
float flMemberValue = *reinterpret_cast<float*>((unsigned char *)pClassBase + 24); // float member value at offset 24 
// value of member is flMemberValue 

*reinterpret_cast<float*>((unsigned char *)pClassBase + 24) = 15.25; // setting the same member value to 15.25. 

正如其他評論者指出,尋找類的偏移基地是這一過程中最難的部分。但是,如果您有方便的類定義,這實際上是您必須完成的唯一工作(即,您也不必查找類成員偏移量)。

+1

主要問題是找到東西的地址。一個非調試版本將會刪除大部分元數據,這使得找到任何不是全局的東西(甚至在一些情況下甚至是一堆東西)變得相當複雜。 – cHao

+0

非常如此。檢查等效的Linux二進制文件(編譯後的程序集與我的經驗類似)通常更容易,然後在運行時使用簽名掃描來查找偏移量。問題提問者已經知道如何與流程掛鉤的事實讓我相信他已經有了抵消。如果不是,那麼這是一個完全不同的問題。 – Saul

+0

@SaulRennison你的意思是如果一個宿主進程加載一個DLL,你的意思是這個DLL可以在宿主進程中訪問一個類成員變量?另外,如果我有exe文件,我可以檢查它並在運行時進行簽名掃描,也就是當DLL實際加載時?此外,你的意思是dll可以簽名掃描它的主機進程? – xybrek