欢迎来到天天文库
浏览记录
ID:37059439
大小:88.51 KB
页数:11页
时间:2019-05-15
《灰帽python之旅4》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、4PyDBG---纯PYTHON调试器话说上回我们讲到如何在windows下构造一个用户模式的调试器,最后在大家的不懈努力下,终于历史性的完成了这一伟大工程。这回,咱们该去取取经了,看看传说中的PyDbg。传说又是传说,别担心,这个传说是真的,我用人格担保。PyDbg出生于2006年,出生地Montreal,Quebec,父亲PedramAmini,担当角色:逆向工程框架PaiMei的核心组件。现在PyDbg已经用于各种各样的工具之中了,其中包括Taof(非常流行的fuzzer代理)ioctlizer(作者开发的一个针对windwos驱动的fuzzer)
2、。如此强大的东西,不用就太可惜了(Python的好处就是别人有的你也会有)。首先用它来扩展下断点处理功能。接着干些高级的活:处理程序崩溃,进程快照还有将来Fuzz需要用的东西。现在就开工,开工,速度开工!4.1扩展断点处理在前面的章节中我们讲解了用事件处理函数处理调试事件的方法。用PyDbg可以很容易的扩展这种功能,只需要构建一个用户模式的回调函数。当收到一个调试事件的时候,回调函数执行我们定义的操作。比如读取特定地址的数据,设置更更多的断点,操作内存。操作完成后,再将权限交还给调试器,恢复被调试的进程。PyDbg设置函数的断点原型如下:bp_set(a
3、ddress,description="",restore=True,handler=None)address是要设置的断点的地址,description参数可选,用来给每个断点设置唯一的名字。restore决定了是否要在断点被触发以后重新设置,handler指向断点触发时候调用的回调函数。断点回调函数只接收一个参数,就是pydbg()类的实例化对象。所有的上下文数据,线程,进程信息都在回调函数被调用的时候,装填在这个类中。以printf_loop.py为测试目标,让我们实现一个自定义的回调函数。这次我们在printf()函数上下断点,以便读取print
4、f()输出时用到的参数counter变量,之后用一个1到100的随机数替换这个变量的值,最后再打印出来。记住,我们是在目标进程内处理,拷贝,操作这些实时的断点信息。这非常的强大!新建一个printf_random.py文件,键入下面的代码。#printf_random.pyfrompydbgimport*frompydbg.definesimport*importstructimportrandom#Thisisouruserdefinedcallbackfunctiondefprintf_randomizer(dbg):#Readinthevalueo
5、fthecounteratESP+0x8asaDWORDparameter_addr=dbg.context.Esp+0x8counter=dbg.read_process_memory(parameter_addr,4)#Whenweuseread_process_memory,itreturnsapackedbinary#string.Wemustfirstunpackitbeforewecanuseitfurther.counter=struct.unpack("L",counter)[0]print"Counter:%d"%int(counter
6、)#Generatearandomnumberandpackitintobinaryformat#sothatitiswrittencorrectlybackintotheprocessrandom_counter=random.randint(1,100)random_counter=struct.pack("L",random_counter)[0]#Nowswapinourrandomnumberandresumetheprocessdbg.write_process_memory(parameter_addr,random_counter)ret
7、urnDBG_CONTINUE#Instantiatethepydbgclassdbg=pydbg()#NowenterthePIDoftheprintf_loop.pyprocesspid=raw_input("Entertheprintf_loop.pyPID:")#Attachthedebuggertothatprocessdbg.attach(int(pid))#Setthebreakpointwiththeprintf_randomizerfunction#definedasacallbackprintf_address=dbg.func_re
8、solve("msvcrt","printf")dbg.bp_set(print
此文档下载收益归作者所有