Python 灰帽第三章 软中断章节 有关于getmodulehandleA 和getprocAdress
函数来取模块及函数的handle 和相对地址 ,但在64位平台测试结果 handle 只返回32 位
是事实地址的低32位。如果在getprocaddress 的参数中输入64位的handle值 ,报错:太长的数据
请问在64系统中是如何处理这两个函数的?
在64位运行不正常的代码如下:
>>> handle = kernel32.GetModuleHandleA("kernel32")
>>> handle
-437780480
通过PCHunter 查看python 进程内的kernel32 的模块基地址 是:
C:\Windows\system32\KERNEL32.DLL 0x00007FFDE5E80000
低32位是DE5E80000高位是1,转换成十进制 等 于-437780480 ,证明GetModuleHandleA 不支持64位。
另外 测试:
>>> kernel32.GetProcAddress(0x00007FFDE5E80000,"printf")
Traceback (most recent call last):
File "<pyshell#20>", line 1, in <module>
kernel32.GetProcAddress(0x00007FFDE5E80000,"printf")
ArgumentError: argument 1: <type 'exceptions.OverflowError'>: long int too long to convert
输入的参数不能是64位。
请问,64位平台要通过别的API 还是 通过什么方式处理,才可以支持可以用C、C++的方式演示也可以,谢谢!
python版本是32位还是64位的?可能也有区别吧?
我用的是 64位的、
原因,我找到了:
GetModuleHandleA 和 GetProcAddress 在调用前需要 把 argtypes 和 restypes 类型进行定义就可以。原因可能是默认的是32位的返回值。
楼主你好,我一开始也遇到这个问题,但是现在只能对GetModuleHandleA 和 GetProcAddress 这两个函数的参数和返回值定义,若是对CloseHandle函数定义参数为64位仍然出现错误,不定义也错误,干脆只能不要这个函数,可以获得process的地址。但这样在后面的开发中会出现没有关闭句柄带来的错误。