2012-06-20 60 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