直接上代码:

1、

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),
("dwFlags",DWORD),
("wShowWindow",WORD),
("bcReserved2",WORD),
("lpReserved2",LPBYTE),
("hStdInput", HANDLE),
("hStdOutput", HANDLE),
("hStdError", HANDLE),
] class PROCESS_INFORMATION(Structure):
_fields_=[
("hProcess",HANDLE),
("hThread", HANDLE),
("dwProcessId", DWORD),
("dwThreadId", DWORD),
]

2、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 startupinfo=STARTUPINFO()
process_information=PROCESS_INFORMATION() startupinfo.dwFlags=0x1
startupinfo.wShowWindow
startupinfo.cb=sizeof(startupinfo) #win32api函数CreatProcess用来创建一个新的进程和他的主线程,
#这个新进程运行指定的可执行文件,由第一个参数指定
if kernel32.CreateProcessW(path_to_exe, #should be CreateProcessW ,not CreateProcessA ,it is UNICODE API
None,
None,
None,
None,
#指定附加的、用来控制优先类和进程的创建的标志。
creation_flags,
None,
None,
#该参数指向一个用于决定新进程的主窗体如何显示的STARTUPINFO结构体。
byref(startupinfo), #byref() 按地址传递
#该参数指向一个用来接收新进程的识别信息的PROCESS_INFORMATION结构体。
byref(process_information)#这里有个问题:
#结构体之间的赋值是如何进行的?
#因为这里定义的process_information跟
#creatprocess中process_information的参数数量一致
#而startupinfo是不一致的
):
print("We have sucessfully lunched the process")
print("PID:%d"%process_information.dwProcessId) else:
print("Error:0x%08x."%kernel32.GetLastError())

尝试,调用函数:

 import my_debugger

 debugger=my_debugger.debugger()

 debugger.load("C:\Windows\System32\calc.exe")

问题:

#结构体之间的赋值是如何进行的?按顺序?
#这里自己定义的process_information结构体跟
#win32函数中creatprocess中process_information的成员数量、位置是必须一致的吗?

#好像也不是这样,因为我process_information是一致的,成功传参了,而我startupinfo不一致,也成功了。

关于win32函数中creatprocess中process_information、startupinfo见http://baike.baidu.com/view/2421585.htm

最新文章

  1. Java Map按键(Key)排序和按值(Value)排序
  2. iOS测试常见崩溃
  3. mysql 修改字符集
  4. CSS 属性设置优先级问题
  5. ORACLE-用户常用数据字典的查询使用方法
  6. SQL查询中的in与join效率比较
  7. Matlab计算矩阵间距离
  8. 转 常用JQuery插件整理
  9. 讨论UML概念和模型UML九种图。
  10. IOC 容器初始化
  11. BZOJ 3243 Clever Y
  12. python基础(六)
  13. war和war exploded区别
  14. Beta冲刺(4/5)(麻瓜制造者)
  15. es6小记
  16. 什么是AOP?
  17. P3121 [USACO15FEB]审查(黄金)Censoring (Gold)
  18. 学习笔记-AngularJs(三)
  19. Python打包文件夹的方法小结(zip,tar,tar.gz等)
  20. 事件类型(js)

热门文章

  1. 【转载】opencv 二值化函数——cv2.threshold
  2. JMS学习十(ActiveMQ支持的传输协议)
  3. Spring Boot教程(二十)开发Web应用(1)
  4. centos网卡配置NM_CONTROLLED=”yes” 慎用
  5. Hbase meta 表异常修复
  6. crontab定时调度shell脚本
  7. 大数据笔记(二十四)——Scala面向对象编程实例
  8. 解决img标签与其它标签间隙问题?
  9. 高级软件测试技术-小组任务分配和安排-Day01
  10. SRCNN 卷积神经网络