回答
是的。只要你的模块挂钩进程,你就可以共享相同的地址空间。这意味着进程已分配的内存(例如,类实例)将会被您访问。
如果你知道类实例的偏移量,那么你可以:
- 施放此内存地址的指针类(只要你有包括类的头)从
- 使用补偿这个内存地址访问类的成员。
请参阅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.
正如其他评论者指出,寻找类的偏移基地是这一过程中最难的部分。但是,如果您有方便的类定义,这实际上是您必须完成的唯一工作(即,您也不必查找类成员偏移量)。
主要问题是找到东西的地址。一个非调试版本将会删除大部分元数据,这使得找到任何不是全局的东西(甚至在一些情况下甚至是一堆东西)变得相当复杂。 – cHao
非常如此。检查等效的Linux二进制文件(编译后的程序集与我的经验类似)通常更容易,然后在运行时使用签名扫描来查找偏移量。问题提问者已经知道如何与流程挂钩的事实让我相信他已经有了抵消。如果不是,那么这是一个完全不同的问题。 – Saul
@SaulRennison你的意思是如果一个宿主进程加载一个DLL,你的意思是这个DLL可以在宿主进程中访问一个类成员变量?另外,如果我有exe文件,我可以检查它并在运行时进行签名扫描,也就是当DLL实际加载时?此外,你的意思是dll可以签名扫描它的主机进程? – xybrek
- 1. 阅读SSIS变量
- 2. 阅读Json变量
- 3. 阅读类变量
- 4. 阅读JS变量
- 5. 阅读$ _ POST变量
- 6. 的Python:阅读的变量
- 7. 阅读rails env变量rspec
- 8. 阅读变量内容
- 9. 阅读蟒蛇变量
- 10. 阅读JSON数据变量
- 11. 阅读与jQuery的外部PHP变量
- 12. 阅读HTML文件的JavaScript变量(Windows)
- 13. 阅读TCL中的Bash环境变量
- 14. 阅读Oracle 10gas上的环境变量
- 15. 阅读shell中变量的每一列
- 16. 阅读环境Jmeter中的变量值
- 17. while循环变量的阅读问题
- 18. 阅读私有变量的类成员
- 19. 如何阅读Awesomium的Javascript变量? C++
- 20. 阅读一个文本文件w/WIN32
- 21. 发布阅读变量并通过
- 22. 阅读变量从SEO友好URLS
- 23. 阅读环境变量是慢操作?
- 24. 阅读字符串变量RUBY
- 25. 在Python中阅读Javascript变量
- 26. Laravel没有阅读env变量
- 27. JQuery阅读JSON(全局/本地变量)
- 28. 在PHP中阅读JavaScript变量
- 29. Python和阅读JavaScript变量值
- 30. 全局变量和阅读器monad
如果您可以找到存储变量的位置并拥有正确的权限,请继续:[ReadProcessMemory](http://msdn.microsoft.com/en-us/library/windows/desktop/ms680553(v = vs.85)的.aspx)。这并不是说这是你在大多数情况下特别想做的事情。 – chris
-1,你能澄清你在这里问什么吗?我根本不懂。 –
@MichaelKristofik他想编写一个程序来附加到已经运行的程序,以读取类内变量的内容。他有这个正在运行的程序的源代码。基本上他想实现一个调试器的基本组件(变量监视/检查)。 –