首页 新闻 搜索 专区 学院

如何通过python ctypes 在64位平台 取得模块handle 和函数地址

0
悬赏园豆:10 [已解决问题] 解决于 2017-06-17 14:20

Python 灰帽第三章 软中断章节 有关于getmodulehandleA 和getprocAdress

函数来取模块及函数的handle 和相对地址 ,但在64位平台测试结果 handle 只返回32 位

是事实地址的低32位。如果在getprocaddress 的参数中输入64位的handle值 ,报错:太长的数据

请问在64系统中是如何处理这两个函数的?

问题补充:

在64位运行不正常的代码如下:

def func_resolve(self, dll, function):
    handle = kernel32.GetModuleHandleA(dll)
    print "handle:{}".format(hex(handle))
    address = kernel32.GetProcAddress(handle, function)
    kernel32.CloseHandle(handle)
    return address
 
每次调用,return address 都是返回0    
 
通过python shell 一条一条命令测试如下:
>>> from ctypes import *
>>> kernel32= windll.LoadLibrary('kernel32.dll')

>>> 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++的方式演示也可以,谢谢!

 

 
先完成一个小目标的主页 先完成一个小目标 | 初学一级 | 园豆:192
提问于:2017-06-07 16:07
< >
分享
最佳答案
0

python版本是32位还是64位的?可能也有区别吧?

收获园豆:10
codegay | 小虾三级 |园豆:1790 | 2017-06-11 10:39

我用的是 64位的、

原因,我找到了:

GetModuleHandleA 和 GetProcAddress 在调用前需要 把 argtypes 和 restypes 类型进行定义就可以。原因可能是默认的是32位的返回值。

先完成一个小目标 | 园豆:192 (初学一级) | 2017-06-17 14:18
其他回答(1)
0

楼主你好,我一开始也遇到这个问题,但是现在只能对GetModuleHandleA 和 GetProcAddress 这两个函数的参数和返回值定义,若是对CloseHandle函数定义参数为64位仍然出现错误,不定义也错误,干脆只能不要这个函数,可以获得process的地址。但这样在后面的开发中会出现没有关闭句柄带来的错误。

尤文不思 | 园豆:202 (菜鸟二级) | 2018-02-02 14:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册