灰帽 Python之旅4.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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

文档评论(0)

wfkm + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档