首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GetProcAddress返回值

GetProcAddress返回值
EN

Stack Overflow用户
提问于 2015-02-23 19:24:28
回答 2查看 1.5K关注 0票数 1

我正在学习如何在python中使用Windows 7上的ctype创建一个简单的调试器。我的问题是,下面给出的代码似乎返回了一个无效的地址(这是我对这个问题的猜测),但我不知道原因。我认为可能是因为返回的句柄在我的代码使用时不再有效,或者因为我只是提供"msvcrt.dll“作为模块,所以返回了一个与脚本无关的句柄。我做了很多修补工作,但到目前为止还没有找到解决方案。

编辑:地址返回为False。我从下面的片段中得到以下错误:

错误126 :找不到指定的模块。

代码语言:javascript
复制
def func_resolve(self, dll, function):
    error = None

    handle = kernel32.GetModuleHandleA(dll)
    if handle == False:
        print "Handle is FALSE"
        error = GetLastError()

    address = kernel32.GetProcAddress(handle, function)
    if address == False:
        print "Address is FALSE"
        error = GetLastError()

    if error is not None:
        print "ERROR %d : %s" % (error, FormatError(error))
        return False

    kernel32.CloseHandle(handle)

    return address

上面的代码是从这个简短的测试脚本调用的:

代码语言:javascript
复制
import my_debugger

debugger = my_debugger.debugger()

pid = raw_input("Input PID of process to attach to: ")
debugger.attach(int(pid))

printf_address = debugger.func_resolve("msvcrt.dll", "printf")
print "[*] Address of printf: 0x%08x" % printf_address
debugger.bp_set(printf_address)

debugger.run()
debugger.detach()

这是我要附加到的脚本:

代码语言:javascript
复制
from ctypes import *
import time

msvcrt = cdll.msvcrt
counter = 0

while True:
    msvcrt.printf("Loop iteration %d /n", counter)
    time.sleep(2)
    counter += 1

所以我运行上面的脚本,在任务管理器中找到PID,然后运行我的测试脚本并给它PID。我每次都得到以下输出。用户定义的printf断点永远不会到达,并且它的地址总是被指定为0x00000000,这似乎是不对的。

代码语言:javascript
复制
Input PID of process to attach to: 8124
Process PID: 8124
[*] Address of printf: 0x00000000       
[*] Setting breakpoint at 0x00000000    
[*] Waiting for debug events...
[*] Event Code: 3       Thread ID: 7664
[*] Event Code: 6       Thread ID: 7664
[*] Event Code: 6       Thread ID: 7664
[*] Event Code: 6       Thread ID: 7664
[*] Event Code: 6       Thread ID: 7664
[*] Event Code: 6       Thread ID: 7664
[*] Event Code: 6       Thread ID: 7664
[*] Event Code: 6       Thread ID: 7664
[*] Event Code: 6       Thread ID: 7664
[*] Event Code: 6       Thread ID: 7664
[*] Event Code: 6       Thread ID: 7664
[*] Event Code: 6       Thread ID: 7664
[*] Event Code: 6       Thread ID: 7664
[*] Event Code: 6       Thread ID: 7664
[*] Event Code: 6       Thread ID: 7664
[*] Event Code: 6       Thread ID: 7664
[*] Event Code: 6       Thread ID: 7664
[*] Event Code: 6       Thread ID: 7664
[*] Event Code: 6       Thread ID: 7664
[*] Event Code: 6       Thread ID: 7664
[*] Event Code: 6       Thread ID: 7664
[*] Event Code: 2       Thread ID: 7124
[*] Event Code: 1       Thread ID: 7124
[*] Exception address: 0x76e00590
[*] Hit the first breakpoint
[*] Event Code: 4       Thread ID: 7124

有人能看出我做错了什么吗?如果需要的话我可以提供所有的代码。

EN

回答 2

Stack Overflow用户

发布于 2017-07-15 13:56:14

我还一直在阅读GreyHat的Python,并且顽固地将my_debugger.py文件转换为支持64位调试。我已经找到了解决这个问题的办法。

将func_resolve设置为如下所示:

代码语言:javascript
复制
def func_resolve(self,dll,function):

    _GetModuleHandleA = kernel32.GetModuleHandleA
    _GetModuleHandleA.restype = POINTER(c_void_p)

    _GetProcAddress = kernel32.GetProcAddress
    _GetProcAddress.restype = c_void_p

    handle = _GetModuleHandleA(dll)
    if handle is None:
        print 'Error getting handle'

    address = _GetProcAddress(handle, function)
    if address is None:
        print 'Error getting address'

    kernel32.CloseHandle(handle)
    return address

这应该会为函数返回一个有效的64位地址。

票数 1
EN

Stack Overflow用户

发布于 2018-07-10 14:48:08

我正在使用本书作为模板在github中建立一个存储库,但更改为支持windows 10 redux/tree/master/chapter03上的redux/tree/master/chapter03,遇到了与其他评论中提到的相同的问题--使用了错误的DLL,我使用了以下方法来解决这个问题:

代码语言:javascript
复制
msvcrt = cdll[ctypes.util.find_msvcrt()]

如果您确保无论何时要解析msvcrt,都可以使用它,那么您应该可以使用它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28681717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档