繁体   English   中英

在加载之前修改装配说明

[英]Modifying assembly instructions before loading

我有一个我需要加载的DLL(我编写并编译它),我想在将DLL加载到内存之前在汇编代码的现有指令之间插入指令。 当然,你不能只读取每个字节并在那之间插入它们,因为指令有时是多个字节。

我正在考虑使用像Udis86这样的东西并逐个阅读说明,然后将它们写入内存,并在它们之间编写我的其他指令。 这是一个好方法还是有更好的方法?

转移说明并不是一个好主意。 许多x86指令取决于它们的位置,所以如果你改变它们,你可能会破坏很多东西。
您可以做的是将指令复制到需要修补的地方; 修补程序有一个jmp到一些空闲区域,然后在那个空闲区域放入复制的指令,你的额外代码然后最后一个jmp回到原始代码。 不是微不足道的,但可行的。 检查这个这个可能的实现。
也就是说, 为什么你只需修改源代码就可以修改二进制文件? 你应该问实际的问题,而不是“如何做X [因为我决定我需要X来解决我的问题]”。

我不知道你在哪里插入代码。 但是如果它位于函数体的中间而不一定是函数序言或结尾,那么为什么不使用带有一堆nop的__asm块来填充你要编写代码的区域。 然后只需填写nop在运行时的代码。

你有(至少)两种选择:

  • 打开DLL文件并使用文件读/写操作对其进行修改
  • 加载DLL并在执行之前修改指令

两者都是可能的,但是后者有必要规避或禁用安全保护:代码(而不是数据)被加载到内存中,这在大多数(如果不是全部不确定的CE)Windows环境中是不可写的。

加载代码后,可以直接支持查找符号地址。 修改文件将需要有关解码符号信息和解释文件偏移的高级知识,或者专门为此目的搜索文件中放置的模式。 这可以是DllMain入口点中的逻辑,该入口点被调用以初始化DLL或DLL中已知足够早执行的任何其他函数。

还有DLL注入技术可以实现相同的目的。


但是,一旦你编写了要执行的代码,那么安排DLL使用一些回调函数会传递给它,而不是所有这些? 如果不了解更多关于你想要完成的事情,很难说出什么是有用的。


至于如何做,一种简单的方法是在汇编模块中编写指令,组装它,然后检查生成的字节。 当然,您应该彻底了解目标汇编语言,以便正确计算或修复分支和相对跳转偏移以及数据引用。 虽然在运行时反汇编指令是可能的,有时也是可行的,但通过其他方法(如调试器)已经识别指令通常更容易,并让程序查找字节序列,然后执行所需的任何转换。

暂无
暂无

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

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