在加载之前修改装配说明

时间:2010-11-30 16:41:30

标签: c++ assembly instructions disassembly

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

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您(至少)有两个选择:

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

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

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

还有DLL injection的技术可以达到同样的目的。


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


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

相关问题