我刚刚在Windows 10中成功地将一个部分和一些代码添加到pe文件(在本例中是我的proxy.exe)中。我还将入口点更改为我的新部分的开头。当我运行修补的.exe时,我的存根被调用,我听到一个高频率的蜂鸣声(我先用蜂鸣声测试过),到目前为止一直很好。
但现在我想回到OEP。但如何计算我的oep在内存中的地址? 我想到了这个问题,我提出了一个解决方案?:
计算除了新添加的部分之外的所有部分的Rsize,然后我在内存中获取存根的地址(delta偏移)并从中减去总部分大小。现在我应该在内存中的.text部分的开头。之后我添加了oep的偏移量,就是这样。
这种方式会起作用还是我犯了错误?还有另一种可能更简单的方法吗?对于dll来说,整个过程有什么不同吗?
http://i.imgur.com/tpUH8x4.png< - stub的图片
提前多多谢谢! ;)
答案 0 :(得分:0)
使用OEP我想你暗示修复IMAGE_OPTIONAL_HEADER。 AddressOfEntryPoint。
好的,如果我说得对,那你就拿IP - >用预期的RVA(相关虚拟地址)减去偏移量,得到模块的加载地址,并将其添加到OEP的RVA中,以获得入口点的实际地址。 如果你做正确的数学,这应该工作。
我没有评论权限但我认为它应该作为评论而不是回答,因为我没有尝试过这个东西,但它是一个提案,类似于编译器将为二进制文件做的事情。
OEP是一种RVA,在注射过程中您可以使用ORIG_RVA和您已替换的注射_RVA。在您的注入逻辑中,只需添加
offset:push orig_rva。
然后为偏移量在PE的重定位表中添加重定位条目。装载机将完成剩下的工作。