- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在学习如何在 Windows 7 上使用 ctypes 在 python 中创建一个简单的调试器。我的问题是下面给出的代码似乎返回了一个无效地址(这是我对问题的猜测),但我可以弄清楚为什么。我想这可能是因为返回的句柄在我的代码使用它时不再有效,或者我返回的句柄与我的脚本无关,因为我只是提供“msvcrt.dll”作为模块。我已经做了很多修补,但还没有找到解决方案。
编辑: 地址返回为 False。我从下面的代码片段中收到以下错误:
错误 126:找不到指定的模块。
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
上面的代码是从这个简短的测试脚本中调用的:
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()
这是我附加到其进程的脚本:
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,这似乎不对。
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
谁能看出我做错了什么?如果需要,我可以提供所有代码。
最佳答案
我也一直在研究 GreyHat Python 这本书,并顽固地将 my_debugger.py 文件转换为支持 64 位调试。我找到了解决这个问题的方法。
将您的 func_resolve 设置为:
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 位地址。
关于python - GetProcAddress 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28681717/
当我通过 win32api 调用 GetProcAddress() 时,我成功获得了句柄,但 ctypes 没有。 代码是: from ctypes import windll import win3
我使用名为“render()”的函数创建了一个 DLL,我想将它动态加载到我的应用程序中,但 GetProcAddress 找不到它。这是 DLL .h: #ifdef D3D_API_EXPORTS
这个问题在这里已经有了答案: Exporting functions from a DLL with dllexport (4 个答案) 关闭 5 年前。 我在动态库中有一个函数,如下所示: nam
正如我们所知,我们可以使用 GetProcAddress 从 DLL 句柄获取函数指针,例如在 DLL 中定义的方法 foo: int foo(long) 对于 foo 函数,我们可以得到这样的函数指
我得到了 MyDll.dll 及其函数定义如下 void pascal Myfunction(BOOL); 当我试图在另一个项目中使用该函数时,我无法使用 GetProcAddress() 获取该函数
我需要在 C++ 中动态加载一个 dll。 我已遵循本教程 http://msdn.microsoft.com/en-us/library/ms235636.aspx创建 dll,一切正常。 然后我关
我有一个游戏的 DLL,我正在导入到 Windows32 应用程序中,我已经成功加载它并调用了很多函数。但是我遇到了一个问题,我需要使用的某个函数需要传递给它的结构。 当我反汇编 DLL 时,我似乎可
这个问题在这里已经有了答案: GetProcAddress cannot find my functions (2 个答案) 关闭 9 年前。 我尝试使用 LoadLibrary 和 GetProc
有人解释下为什么下一段代码会在 ntdll.dll 中返回一个指针吗? GetProcAddress(LoadLibraryA("kernel32.dll"), "EncodePointer"); G
我尝试使用 getprocaddress 查找变量地址。但是我在这方面遇到了问题。问题是我将变量名称一个一个地存储在 char buff[100] 中,就像在循环中一样。那个时候我不知道变量的类型。那
我正在学习如何在 Windows 7 上使用 ctypes 在 python 中创建一个简单的调试器。我的问题是下面给出的代码似乎返回了一个无效地址(这是我对问题的猜测),但我可以弄清楚为什么。我想这
出于某种原因,每当我的 C# .NET 2.0 应用程序调用 GetProcAddress 时,它总是返回零。 public class MyClass { internal static c
使用 dlopen,您可以提供 NULL 作为库名称,并获得一个句柄,允许您在 任何 加载的库中找到一个符号库: If filename is a NULL pointer, then the ret
我正在尝试通过 Firemonkey 框架使用 Delphi XE2 来制作一个插件系统。问题是我收到错误 GetProcAddress 是未声明的标识符。当我尝试在 VCL 项目中使用 GetPro
我必须使用 DLL 中的一个简单函数;我能够加载库,但 GetProcAddress 返回 NULL。我想我了解名称修改,但也许我做错了什么。谢谢(代码如下,我会尽快添加所需的其他信息): mydll
我正在尝试使用 LoadLibrary 和 GetProcAddress 加载 dll。 LoadLibrary 返回一个有效的句柄,但我对 GetProcAddress 的调用返回 NULL。调用
这是我的代码。这看起来很简单,但不知何故它就是行不通。对该函数的最终调用总是因访问错误而失败。 extern "C" { typedef const char* (*Init_fptr_t)(
这个问题几乎可以归结为“我可以安全地将函数指针转换为参数可转换为这些类型的函数指针吗?”,但如果没有实际示例,这听起来非常可疑。 我制作了一个小的实用函数来从 DLL 中调用某些东西,给定 DLL 名
在我的例子中,我通过有效导出函数名称的 GetProcAddress 获得了一个函数指针,一旦我的应用程序调用导出函数,它就会在显示输出后崩溃。如果我从函数和 typdef 中删除参数并直接将 193
我目前在访问 dll 文件中的方法时遇到问题。我尝试访问的方法属于该类型。 int dstoch (float,float,float,float,float,float,float,float,fl
我是一名优秀的程序员,十分优秀!