2011年05月07日 星期六 18:13
如题,书中第一个例子,运行总是出错:
File "D:\eclipse3.6\workspace\MyDebugger\src\Debugger\my_debugger.py", line 36, in load
byref(process_information)):
WindowsError: exception: access violation writing 0x1D1A9EF1
源码如下:
my_debugger_defines.py:
from ctypes import *
# 为ctype 变量创建符合匈牙利命名风格的匿名
WORD = c_ushort
DWORD = c_ulong
LPBYTE = POINTER(c_ubyte)
LPTSTR = POINTER(c_char)
HANDLE = c_void_p
#常量定义
DEBUG_PROCESS = 0x00000001
CREATE_NEW_CONSOLE = 0x00000010
#定义函数CreateProcessA()所需要的结构体
class STARTUPINFO(Structure):
_fields_ = [
("cb", DWORD),
("lpReserved", LPTSTR),
("lpDesktop", LPTSTR),
("lpTitle", LPTSTR),
("dwX", DWORD),
("dwY", DWORD),
("dwXSize", DWORD),
("dwYSize", DWORD),
("dwXCountChars", DWORD),
("dwYCountChars", DWORD),
("dwFillAttribute", DWORD),
("dwFlags", DWORD),
("wShowWindow", WORD),
("cbReserved2", WORD),
("lpReserved2", LPBYTE),
("hStdInput", HANDLE),
("hStdOuput", HANDLE),
("hStdError", HANDLE),
]
class PROCESS_INFORMATION(Structure):
_fields_ = [
("hProcess", HANDLE),
("hThread", HANDLE),
("dwProcessId", DWORD),
("dwThreadId", DWORD),
]
my_debugger.py
from ctypes import *
from my_debugger_defines import *
kernel32 = windll.kernel32
class debugger():
def __init__(self):
pass
def load(self,path_to_exe):
creation_flags = DEBUG_PROCESS
startupinfo = STARTUPINFO()
process_information = PROCESS_INFORMATION()
startupinfo.dwFlags = 0x1
startupinfo.wShowWindow = 0x0
startupinfo.cb = sizeof(startupinfo)
if kernel32.CreateProcessA(path_to_exe,
None,
creation_flags,
None,
None,
byref(startupinfo),
byref(process_information)):
print "[*] We have successfully launched the process!"
print "[*] PID: %d" % process_information.dwProcessId
else:
print "[*] Error: 0x%08x." % kernel32.GetLastError()
2011年05月09日 星期一 13:51
你自己写的么,好像跟例子里面的代码不一样呢?
2011年05月09日 星期一 15:17
不是我自己写的,哪里不一样?我是按书上的代码敲进去的。还望指正!
2011年05月09日 星期一 15:35
书上的my_debugger.py非常的长来着·~。
sorry,原来你是直接敲的书上的代码哟·~
仔细看下先。
2011年05月09日 星期一 15:45
你说的那个是不是下载的代码?
2011年05月09日 星期一 15:51
恩就是,我刚刚在看下载的代码。然后运行了下,完全ok
书上的代码还在看
2011年05月09日 星期一 16:19
嗯,找到问题一定告诉我!感激不尽!
2011年05月11日 星期三 10:17
我知道。
我把代码给你贴出来:
my_debugger.py:
from ctypes import *
from my_debugger_defines import *
kernel32 = windll.kernel32
class debugger():
def __init__(self):
pass
def load(self,path_to_exe):
# dwCreation flag determines how to create the process
# set creation_flags = CREATE_NEW_CONSOLE if you want
# to see the calculator GUI
creation_flags = DEBUG_PROCESS
# instantiate the structs
startupinfo = STARTUPINFO()
process_information = PROCESS_INFORMATION()
# The following two options allow the started process
# to be shown as a separate window. This also illustrates
# how different settings in the STARTUPINFO struct can affect
# the debuggee.
startupinfo.dwFlags = 0x1
startupinfo.wShowWindow = 0x0
# We then initialize the cb variable in the STARTUPINFO struct
# which is just the size of the struct itself
startupinfo.cb = sizeof(startupinfo)
if kernel32.CreateProcessA(path_to_exe,
None,
None,
None,
None,
creation_flags,
None,
None,
byref(startupinfo),
byref(process_information)):
print "[*] We have successfully launched the process!"
print "[*] PID: %d" % process_information.dwProcessId
else:
print "[*] Error: 0x%08x." % kernel32.GetLastError()
2011年05月11日 星期三 13:46
CreateProcessA的参数问题,太大意了,非常感谢楼上两位朋友,感谢感谢!
2011年07月05日 星期二 22:53
你好,请问这本书应该怎么学习比较好呢?
Zeuux © 2024
京ICP备05028076号