- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
灰帽 Python之旅4.doc
4
PyDBG---纯PYTHON调试器
话说上回我们讲到如何在windows下构造一个用户模式的调试器,最后在大家的不懈努力下,终于历史性的完成了这一伟大工程。这回,咱们该去取取经了,看看传说中的PyDbg。传说又是传说,别担心,这个传说是真的,我用人格担保。PyDbg出生于2006年,出生地Montreal, Quebec,父亲Pedram Amini,担当角色:逆向工程框架PaiMei的核心组件。现在PyDbg已经用于各种各样的工具之中了,其中包括Taof (非常流行的fuzzer代理)ioctlizer(作者开发的一个针对windwos驱动的fuzzer)。如此强大的东西,不用就太可惜了(Python的好处就是别人有的你也会有)。首先用它来扩展下断点处理功能。接着干些高级的活:处理程序崩溃,进程快照还有将来Fuzz需要用的东西。现在就开工,开工,速度开工!
4.1 扩展断点处理
在前面的章节中我们讲解了用事件处理函数处理调试事件的方法。用PyDbg可以很容易的扩展这种功能,只需要构建一个用户模式的回调函数。当收到一个调试事件的时候,回调函数执行我们定义的操作。比如读取特定地址的数据,设置更更多的断点,操作内存。操作完成后,再将权限交还给调试器,恢复被调试的进程。
PyDbg设置函数的断点原型如下:
bp_set(address, description=,restore=True,handler=None)
address是要设置的断点的地址,description参数可选,用来给每个断点设置唯一的名字。restore决定了是否要在断点被触发以后重新设置,handler指向断点触发时候调用的回调函数。断点回调函数只接收一个参数,就是pydbg()类的实例化对象。所有的上下文数据,线程,进程信息都在回调函数被调用的时候,装填在这个类中。
以printf_loop.py为测试目标,让我们实现一个自定义的回调函数。这次我们在printf()函数上下断点,以便读取printf()输出时用到的参数counter变量,之后用一个1到100的随机数替换这个变量的值,最后再打印出来。记住,我们是在目标进程内处理,拷贝,操作这些实时的断点信息。这非常的强大!新建一个printf_random.py文件,键入下面的代码。
#printf_random.py
from pydbg import *
from pydbg.defines import *
import struct
import random
# This is our user defined callback function
def printf_randomizer(dbg):
# Read in the value of the counter at ESP + 0x8 as a DWORD
parameter_addr = dbg.context.Esp + 0x8
counter = dbg.read_process_memory(parameter_addr,4)
# When we use read_process_memory, it returns a packed binary
# string. We must first unpack it before we can use it further.
counter = struct.unpack(L,counter)[0]
print Counter: %d % int(counter)
# Generate a random number and pack it into binary format
# so that it is written correctly back into the process
random_counter = random.randint(1,100)
random_counter = struct.pack(L,random_counter)[0]
# Now swap in our random number and resume the process
dbg.write_process_memory(parameter_addr,random_counter)
return DBG_CONTINUE
# Instantiate the pydbg class
dbg = pydbg()
# Now enter the PID of the pr
您可能关注的文档
最近下载
- 社区养老服务驿站2025年运营策略与案例分析.docx
- 《跨境电商英语》课程标准.docx VIP
- 除颤仪迈瑞D3分布及使用.pptx VIP
- 2019年人教版九下化学《第12章 化学和生活》单元测试卷(解析版).doc VIP
- 中班语言绘本《绿绵羊在哪里》动态PPT课件.pptx VIP
- 人教版五年级上册数学全册教案(永威先学后教模式).pdf VIP
- 变电站验收要点.docx
- nubia主题修改教程附电脑和手机工具努比亚ui4.pdf VIP
- 2024-2025学年人教版化学九年级下学期《第8章 金属和金属材料》测试卷及答案解析.doc VIP
- 最新人教版九年级数学上册-全册课件全集(1215张).pptx VIP
文档评论(0)