在Python中设置x86寄存器以用于被调用的DLL函数

时间:2014-06-27 13:12:33

标签: python winapi reverse-engineering ctypes

背景

使用Python调用未导出的DLL函数。要调用的函数假定其中一个通用寄存器已设置为缓冲区的位置 - 它不是通过堆栈变量设置的。缓冲区将由Python脚本拥有。理想情况下,解决方案应该独立运行,而不是在调试器的上下文中运行。

问题

在调用DLL函数之前,是否可以使用Python将其中一个x86寄存器(在本例中为ECX)设置为Python变量的内存位置? (并且没有获取/存储寄存器的过程)。

考虑方法

我看过几种方法,所有这些方法看起来都比较重,我很快就达到了我的知识范围:

  • 使用GetThreadContext - 我认为这需要在一个单独的线程中运行DLL函数,获取并更新线程上下文 - 如果这是一个很好的方法,那么有一个很好的等级方法
  • 使用某种形式的corepy / pyasm来构建一个小程序 - 可能会在调用DLL函数之前冒险删除寄存器。
  • 在Immunity Debugger等调试器中使用Python脚本 - 这可以解决大部分问题,但理想情况下我们希望脚本独立运行。

对于如何处理此问题,我将非常感激。

1 个答案:

答案 0 :(得分:1)

我认为唯一可行的方法是编写在asm中调用函数的代码。只有在该级别控制它才能确保没有其他方可以修改注册表。

一种方法是静态地执行它并让编译器/链接器构建一个可以从Python代码调用的DLL,传递所需的任何信息。特别是函数地址和传递给函数所需的任何参数。

另一种方法是在运行时使用动态代码生成器之类的某种抖动生成代码。这种方法可能更难做到,尽管它提供了更大灵活性的前景。