在Python中设置一个x86寄存器,以便在被调用的DLL函数中使用

在Python中设置一个x86寄存器,以便在被调用的DLL函数中使用,python,winapi,reverse-engineering,ctypes,Python,Winapi,Reverse Engineering,Ctypes,背景 使用Python调用未导出的DLL函数。要调用的函数假定其中一个通用寄存器已设置为缓冲区的位置—它不是通过堆栈变量设置的。缓冲区将由Python脚本拥有。理想情况下,解决方案应该独立运行,而不是在调试器的上下文中运行 问题 在调用DLL函数之前,是否可以使用Python将x86寄存器之一(在本例中为ECX)设置为Python变量的内存位置?(且无需获取/存储登记册的过程,并将其销毁) 经过深思熟虑的方法 我研究了几种方法,所有这些方法似乎都比较重要,我很快就达到了我的知识水平: 使用-我

背景

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

问题

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

经过深思熟虑的方法

我研究了几种方法,所有这些方法似乎都比较重要,我很快就达到了我的知识水平:

  • 使用-我认为这需要在单独的线程中运行DLL函数,获取并更新线程上下文-如果这是一个好方法,最好采用高级方法
  • 使用某种形式的corepy/pyasm来构建一个小程序——在调用DLL函数之前可能会损坏寄存器
  • 在调试器(如免疫调试器)中使用Python脚本-这将解决大多数问题,但理想情况下,我们希望脚本独立运行

如果您能给我一些建议,我将不胜感激。

我认为唯一可行的方法是编写在asm中调用函数的代码。只有将其控制在该级别,您才能确保没有其他方会修改寄存器

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

另一种方法是在运行时生成带有某种抖动的代码,比如动态代码生成器。这种方法可能更难做到正确,尽管它提供了更大的灵活性