my_debugger_defines.py

 #encoding:utf-8

 from ctypes import *
from sys import version as py_ver # In python 2.7.6, LPBYTE is not defined in ctypes.wintypes
if py_ver.startswith(''):
LPBYTE = POINTER(c_byte) # 为ctypes创建匿名
WORD = c_ushort
DWORD = c_ulong
LPBYTE = POINTER(c_ubyte)
LPTSTR = POINTER(c_byte)
HANDLE = c_void_p # 常量定义
DEBUG_PROCESS = 0x00000001
CREATE_NEW_CONSOLE = 0x00000010
DBG_EXCEPTION_NOT_HANDLED = 0x80010001 # 定义行数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),
("hStdOutput", HANDLE),
("hStdError", HANDLE),
] class PROCESS_INFORMATION(Structure):
_fields_ = [
("hProcess", HANDLE),
("hThread", HANDLE),
("dwProcessId", DWORD),
("dwThreadId", DWORD),
]

my_debugger.py

#encoding:utf-8

from ctypes import *
from my_debugger_defines import * kernel32 = windll.kernel32 class debugger():
def __init__(self):
pass def load(self, path_to_exe): # 参数dwCreationFlags中标志位控制着进程的创建方式
# 若需要创建的进程独占一个新的控制台窗口,而不是与父进程公用同-
# - 一个控制台可以加上标志位 CREATE_NEW_CONSOLE
creation_flags = DEBUG_PROCESS #实例化之前的结构体
startupinfo = STARTUPINFO()
process_information = PROCESS_INFORMATION() # 在以下两位成员变量的共同作用下,新建的进程将单独的窗体中被显示
# 可以通过结构体 STARTUPINFO 中各个成员变量的值来控制debugee的进程行为
startupinfo.dwFlags = 0x1
startupinfo.wShowWindow = 0x0 # 设置结构体 STARTUPINFO的值
# cb的值,表示结构体本身的大小
startupinfo.cb = sizeof(startupinfo)
#print(startupinfo.cb)
## On 64-bit windows, sizeof(STARTUPINFO) == 104.
## On 32-bit windows, sizeof(STARTUPINFO) == 68.
#print(STARTUPINFO.cb.offset)
#print(STARTUPINFO.lpReserved.offset)
#print(STARTUPINFO.lpDesktop.offset)
#print(STARTUPINFO.lpTitle.offset)
#print(STARTUPINFO.dwX.offset)
#print(STARTUPINFO.dwY.offset)
#print(STARTUPINFO.dwXSize.offset)
#print(STARTUPINFO.dwYSize.offset)
#print(STARTUPINFO.dwXCountChars.offset)
#print(STARTUPINFO.dwYCountChars.offset)
#print(STARTUPINFO.dwFillAttribute.offset)
#print(STARTUPINFO.dwFlags.offset)
#print(STARTUPINFO.wShowWindow.offset)
#print(STARTUPINFO.cbReserved2.offset)
#print(STARTUPINFO.lpReserved2.offset)
#print(STARTUPINFO.hStdInput.offset)
#print(STARTUPINFO.hStdOutput.offset)
#print(STARTUPINFO.hStdError.offset)
if kernel32.CreateProcessW(c_wchar_p(path_to_exe),
c_wchar_p(0),
0,
0,
0,
creation_flags,
0,
0,
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_test.py

#!encoding:utf-8

import my_debugger

debugger = my_debugger.debugger()
debugger.load("C:\\Windows\\system32\\calc.exe")

参考:Python灰帽子-黑客与逆向工程师的Python编程之道

debuggee python的更多相关文章

  1. 《python灰帽子》学习笔记:写一个windos 调试器(一)

    一.开发内容介绍 为了对一个进程进行调试,你首先必须用一些方法把调试器和进程连接起来.所以, 我们的调试器要不然就是装载一个可执行程序然后运行它, 要不然就是动态的附加到一个运行的进程.Windows ...

  2. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

  3. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  4. Python 小而美的函数

    python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况   any any(iterable) ...

  5. JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议

    软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...

  6. 可爱的豆子——使用Beans思想让Python代码更易维护

    title: 可爱的豆子--使用Beans思想让Python代码更易维护 toc: false comments: true date: 2016-06-19 21:43:33 tags: [Pyth ...

  7. 使用Python保存屏幕截图(不使用PIL)

    起因 在极客学院讲授<使用Python编写远程控制程序>的课程中,涉及到查看被控制电脑屏幕截图的功能. 如果使用PIL,这个需求只需要三行代码: from PIL import Image ...

  8. Python编码记录

    字节流和字符串 当使用Python定义一个字符串时,实际会存储一个字节串: "abc"--[97][98][99] python2.x默认会把所有的字符串当做ASCII码来对待,但 ...

  9. Apache执行Python脚本

    由于经常需要到服务器上执行些命令,有些命令懒得敲,就准备写点脚本直接浏览器调用就好了,比如这样: 因为线上有现成的Apache,就直接放它里面了,当然访问安全要设置,我似乎别的随笔里写了安全问题,这里 ...

随机推荐

  1. ECMAScript中关于如何获取this的定义

    文章中一些名词的翻译存疑,没有查过正式的中文名称 前面都是具体过程的解释,懒得看可以直接看获取思路 有关this的取值请移步JavaScript笔记--this的取值 获取this的过程 Runtim ...

  2. Watering Grass

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=85904#problem/E 题意: 给定一条草坪,草坪上有n个喷水装置.草坪长 ...

  3. JAVA递归算法

    1.什么是递归算法 递归算法就是直接或间接调用自己的算法 2.问题1:一列数的规则如下: 1.1.2.3.5.8.13.21.34 ,求第30位数是多少?使用递归实现 public class Fib ...

  4. sql to_char 日期转换字符串

    1.转换函数 与date操作关系最大的就是两个转换函数:to_date(),to_char() to_date() 作用将字符类型按一定格式转化为日期类型: 具体用法:to_date('2004-11 ...

  5. SQL server 子查询、设置主键外键、变量及变量查询

    一.子查询 子查询,又叫做嵌套查询. 将一个查询语句做为一个结果集供其他SQL语句使用,就像使用普通的表一样,被当作结果集的查询语句被称为子查询. 子查询有两种类型: 一种是只返回一个单值的子查询,这 ...

  6. webshell下执行命令脚本汇集

    cmd1.asp <object runat=server id=shell scope=page classid="clsid:72C24DD5-D70A-438B-8A42-984 ...

  7. 使用 mock.js 让前端开发与后端独立

    直接上代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  8. PHP版本VC6与VC9、Thread Safe与None-Thread Safe等的区别

    PHP版本VC6与VC9.Thread Safe与None-Thread Safe等的区别 [摘要]PHP 是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言,在PHP发 ...

  9. IOS第八天(4:UITableViewController新浪微博, 代码创建布局和数据转模型)

    ******控制control #import "HMViewController.h" #import "HMStatus.h" #import " ...

  10. ActiveMQ: 搭建Broker集群(cluster)

    上一篇介绍了基于Networks of Borkers的2节点HA方案,这一篇继续来折腾Networks of Brokers,当应用规模日渐增长时,2节点的broker可能仍然抗不住访问压力,这时候 ...