我正在处理一些系统级代码,我希望能够识别来自加载的二进制文件的内存部分,以便检测损坏或修改的指令等内容;
基本上我所追求的是在使用C ++的Win32中获取指向范围指针的方法。这有点类似于要求指向.text部分的开始和结束的函数指针。我对exe格式的理解是.text部分是存储指令的地方,而.data部分则保存全局变量之类的东西。不幸的是我发现了0暗示这可能是什么(我看过没有win32函数调用,TIB中没有任何东西等)。
有人可以指引我到我能找到的地方/计算这些信息吗?
P.S。我确实理解,如果有人恶意更改代码,他们可能会发现这些代码并对其进行更改;我仍然对如何根据自己的好奇心获取这些信息的细节感兴趣。
答案 0 :(得分:4)
你真的不能期望这与内存二进制文件一起工作。任何对导入的DLL的函数调用都将被加载器修改为指向加载的DLL中目标过程的实际位置。
例如假设您在kernel32.dll中调用了一个函数。然后发生更新kernel32.dll的Windows更新。下次运行应用程序时,跳转到kernel32.dll中的函数将转到与应用Windows更新之前不同的内存地址。
当然,这一切都假设DLL加载到它们的首选地址。然后你可能会有一些自我修改的代码。
依此类推,等等。
答案 1 :(得分:1)
这不会直接回答您的问题,但对于您的整体解决方案,您可以查看Code Signing。如果您喜欢这个解决方案,那么Windows上就有现有的实现。
正如您所说,仅靠二进制验证无法解决您的问题。您还应该考虑在文件系统的一个区域中安装您的应用程序,该区域需要高级/管理员权限才能写入,例如Program Files,或者将其部署在用户无法直接修改它的地方,例如Web服务器。
答案 2 :(得分:1)
您可以在PE标头中找到代码的入口点。从MSDN下载PE(可移植可执行文件)文件定义 - 它包含所有信息。内存中程序的格式与磁盘上的格式几乎相同。在代码中,您可以通过GetModuleHandle()函数获取指向内存中PE头的指针(句柄实际上是指向第一页的指针)。