Python论坛  - 讨论区

标题:有没有看过《Python灰帽子》的朋友,进来帮个忙

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() 

********************************************************
my_debugger_defines.py:
from ctypes import *
# Let's map the Microsoft types to ctypes for clarity
WORD      = c_ushort
DWORD     = c_ulong
LPBYTE    = POINTER(c_ubyte)
LPTSTR    = POINTER(c_char) 
HANDLE    = c_void_p
# Constants
DEBUG_PROCESS = 0x00000001
CREATE_NEW_CONSOLE = 0x00000010
# Structures for CreateProcessA() function
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),
        ("hStdOutput",    HANDLE),
        ("hStdError",     HANDLE),
    ]
class PROCESS_INFORMATION(Structure):
    _fields_ = [
        ("hProcess",    HANDLE),
        ("hThread",     HANDLE),
        ("dwProcessId", DWORD),
        ("dwThreadId",  DWORD),
    ]
**********************************************************
my_test.py:
import my_debugger
debugger = my_debugger.debugger()
debugger.load("C:\\WINDOWS\\system32\\calc.exe")
*************************************************************


经实验没有问题。书中确实是错误的,应该是排版问题,页码之间遗失了代码。
当初我在是中蠎的googlecode中找到的论坛人员贡献的翻译电子版文档才解决的。你可以试着在啄木鸟bbs中找找,应该有。

2011年05月11日 星期三 13:46

CreateProcessA的参数问题,太大意了,非常感谢楼上两位朋友,感谢感谢!

2011年07月05日 星期二 22:53

 你好,请问这本书应该怎么学习比较好呢?

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号