我没有想法如何做到这一点:
你有一个文件,我们称之为test.exe,
它的const int值= 5;在其中,它所做的只是cout<<值;
我想创建修补test.exe的其他可执行文件,因此它现在输出10而不是5.我希望在运行之前完成此操作。
我尝试关闭ASLR,获取该变量的地址然后进行修补,但磁盘和内存中的地址与AFAIK不同。
答案 0 :(得分:1)
抱歉,此评论假定您正在使用Windows系统。如果没有,我确信使用其他可执行图像格式,您可以遵循类似的方法。
假设您正在尝试询问如何更改目标中的数据而不是如何在此特定示例中更改屏幕输出......
您是否考虑过查看可执行映像的PE标头?您可以将加载到内存中的特定数据的地址转换为PE文件中的偏移量,但要查看相关图像的PE标头内的IMAGE_SECTION_HEADER结构。
首先,计算内存中数据的RVA。这是相对于它所在部分的数据的地址。
其次,通过将文件头读入缓冲区,索引可执行文件PE头内的IMAGE_SECTION_HEADER结构。将此标头加载到内存缓冲区后,可以使用指针进行处理。像这样,
IMAGE_NT_HEADERS* pImageHeader = &peHeaderBuffer[0];
找到包含数据的正确IMAGE_SECTION_HEADER后,您可以访问结构的PointerToRawData成员,该成员将为您提供此部分所在PE文件开头的偏移量,如果添加RVA,您将获得从数据所在文件的起始位置开始的偏移量。
显然,我的回答没有解释如何索引节标题,因为这是一个相当繁琐的任务,需要一段时间才能解释。我建议你从一个简单的调试器(如OllyDbg)中查看一个exectuable的PE头,并参考MSDN在PE头上的文档 - 可以在这里找到:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms680336%28v=VS.85%29.aspx
如果你想做的只是反转这个目标的信息,使用OllyDbg很容易。只需浏览PE Header视图,直到看到与您的数据对应的部分,OllyDbg将列出那里的PointerToRawData成员,您可以将其添加到RVA中。
答案 1 :(得分:1)
通过签名查找:在值5周围获取8-16个字节,然后在.exe二进制文件中搜索它们。
另请注意,通常const int值被内联到汇编程序代码中,因此如果您有2个或更多引用它的语句,则必须对其进行修补。