繁体   English   中英

获取二进制指令的内存地址

[英]Get Memory Address of Binary Instructions

我目前正在处理一些系统级代码,在这些代码中,我希望能够识别来自已加载二进制文件的内存部分,以便检测诸如损坏或修改的指令之类的内容。

从本质上讲,我所追求的是在Win32中使用C ++的一种方法,以获取指向指令范围的指针。 这有点类似于要求指向.text节的开始和结束的函数指针。 我对exe格式的理解是.text节是存储指令的地方,而.data节则存放着诸如全局变量之类的东西。 不幸的是,我发现0可能在哪里(我没有看到win32函数调用,TIB中什么也没有,等等)。

谁能引导我到可以找到/计算此信息的地方?

PS我知道,如果有人恶意更改代码,他们可能会找到并更改它; 我仍然对自己的好奇心对如何获取此信息的细节感兴趣。

您真的不能期望它与内存二进制文件一起使用。 加载程序会修改对导入的DLL的任何函数调用,以指向目标过程在DLL中的实际位置。

例如,假设您在kernel32.dll中调用一个函数。 然后发生Windows更新,该更新更改了kernel32.dll。 下次运行应用程序时,跳转到kernel32.dll中的函数的地址将与应用Windows更新之前的地址不同。

当然,所有这些都假定DLL在其首选地址处加载。 然后,您可能会有一些自我修改的代码。

等等等等。

这不会直接回答您的问题,但是对于您的整体解决方案,您可以考虑使用Code Signing 如果您喜欢此解决方案,则Windows上已有现有的实现。

如您所说,仅二进制验证无法解决您的问题。 您还应该考虑将应用程序安装在需要提升权限/管理员权限(例如程序文件)的文件系统区域中,或者将其部署在用户无法直接修改它的位置(例如Web服务器)。

您可以在PE标头中找到代码的入口点。 从MSDN下载PE(便携式可执行文件)文件定义-它具有所有信息。 程序在内存中的格式实际上与磁盘上的格式相同。 从代码中,您可以通过GetModuleHandle()函数获得指向内存中PE标头的指针(该句柄实际上是指向第一页的指针)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM