欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PDF文档下载  

    Python灰帽子.pdf

    • 资源ID:5530035       资源大小:1.39MB        全文页数:156页
    • 资源格式: PDF        下载积分:10
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要10
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    Python灰帽子.pdf

    序 曾经我花了很长的时间,寻找一门适合 hacking 和逆向工程的语言。几年前,终于让我 发现了 Python,而如今它已经成为了黑客编程的首选。不过对于 Python 的在 hacking 应用 方面一直缺少一本详实的手册。 当我们用到问题的时候, 不得不花很多时间和精力去阅读论 坛或者用户手册,然后让我们的代码运行起来。这本书的目标就是提供给各位一本强大的 Python Hack 手册,让大家在 hacking 和逆向工程中更加得心应手。 在阅读此书之前,假设大家已经对各种黑客工具,技术(调试器,后门,fuzzer,仿真器, 代码注入)都有一个理论上的认识。 我们的目的是不仅仅会使用各种基于Python编写的工具, 还要能够自定和编写自己的工具。 一本书是不可能介绍完所有的的工具和技术的, 但我们是 对一些常用的技术,进行详细的解说,而这些技术都是一通百通的,在以后的安全开发中, 大家只要灵活应用就行了。 这是本手册类的书籍,所以阅读的时候不一定从头到尾。如果你是一个 Python 新手, 建议把全书都阅览一遍,因为你会学到很多必要的 hack 原理和编程技巧,便于以后的完成 各种复杂的任务。如果你已经对 Python 很熟悉,并且对 ctypes 库也很了解了,那就可以跳 过第二章。当然,你也可以只是当当看其中感兴趣的一章,每章的代码都做了详实的解释。 我花了很多事件讲解调试器,因为调试器就似乎 hacker 的手术刀:从第二章调试原理, 第五章 Immunity 的应用和扩展,到第六章和第七章的 hooking 以及注入技术的介绍(用于内 存的控制和处理)。 本书的第二部分就是对 fuzzers 的介绍。第八章会讲解基础的 fuzzer 原理,并且构建一 个简单的 file fuzzer。第九章,介绍强大的 Sulley fuzzing 框架,并且使用它 fuzz 一个真正 的 FTP 服务器。第十章,学习构建一个 Windows 驱动 fuzzer。 第十一章,介绍 IDA(最常用的静态反汇编工具)的 Python 扩展。十二章,详细讲解 PyEmu,一个基于 Python 的仿真器。 本书的所有代码都尽量保持简短, 在关键的地方都做了详细的解说。 学习一门新的语言 或一个新的库,都需要花费事件和精力。所以建议各位自己手写代码。所有的源码可以在 http:/www.nostarch.com/ghpython.htm 找到。 Now lets get coding! 陆陆续续花了两个月时间,终于初步完成了 gray python 的翻译。对自己的英文和技术 的提高是最让我欣慰的。还有还有很多需要改进的地方,不过苦于时间不许,遂无法进一步 完成。 将此书献给我的家人,尤其是我的母亲,是她的坚韧和聪慧,让我的人生变得不同。 我 的伙伴们-自由之光的所有队员(眉宇间,codeblue,小龙, 。 。 。),以及曾经教育和指引过我 的老师,还有那些默默奉献分享自己技术的 hacker 们。 岁月如梭,那些在学生时代的激情岁月,那些永远不知疲倦的夜晚,无数的汗水和青春 已经消逝在岁月的长河里。只有对技术和极限的自由追求,不曾变过。 为自由和理想而战-天国之翼自由之光 个人简介: 网名:天国之翼自由之光 , winger 年龄:20-30 编程语言:asm,c,python 就读过的学校:集美大学 专业:网络系统管理 工作:自由安全工作者,secoder(security coder) 网址:hi.baidu.com/freewinge 联系方式:free.winger at gmail.com 爱好:搏击,修禅,音乐,电影 最爱吃的东西:老爹的手擀面 自由之光-一个追求技术自由和个人极限的安全团队。起源于集美大学。 1 搭建开发环境搭建开发环境 在即将开始令人兴奋的在即将开始令人兴奋的 PythonPythonPythonPython HackHackHackHack 之前之前, 让我们先花一让我们先花一 点点事件准备好自己的工具点点事件准备好自己的工具。 相信我这样做是值得的相信我这样做是值得的, 它会让你它会让你 玩的更快乐。玩的更快乐。 这章我们会简单的讲解, Python2.5 的安装, Eclipse 配置, 以及如何编写 C 兼容的 Python 代码。 1.11.11.11.1操作系统准备操作系统准备 就逆向的趣味性而言,Windows 是最好的目标。无数的工具和广泛的使用人群,使得代 码开发和 Crack 都变得更容易,所以本书的大部分代码都基于 Windows(任何你能搞的到的 Windows 版本)。 少部分例子也能运行在 32 位的 Linux 上。无论是安装在 VMware(VMware 提供免费版 本,不同为版权担心)上还是实机上,都行。Linux 版本众多,本书推荐基于 Red Hat 的发布平 台:Fedora Core 7 or Centos 5。 免费的免费的 VMWAREVMWAREVMWAREVMWARE 镜像镜像 VMware 在网站上提供了免费的版本。这些虚拟机用于逆工程,漏洞分析,或者任何 程序的调试,同时和主机完全独立开来。 主程序下载链接:http:/www.vmware.com/appliances/, Pyayer 程序下载链接:http:/www.vmware.com/products/player/。 1.21.21.21.2获取和安装获取和安装 Python2.5Python2.5Python2.5Python2.5 Linuxer 可以跳过这个步骤,大部分 Linux 都内置了 Python。Windows 下可以通过独立 的安装包进行安装。 1.2.11.2.11.2.11.2.1在在 WindowsWindowsWindowsWindows 上安装上安装 PythonPythonPythonPython Windows 的安装版本可以从 Python 主页上下载 http:/ python.org/ftp/python/2.5.1/python-2.5.1.msi。双击,一步一步的按指示安装就行。在默认的 主目录 C:/Python25/下,安装了 python.exe 和默认的库。 提示建议大家安装 Immunity 调试器,其包含了很多必须的附加程序,其中就有 Python 2.5 。 在 后 面 的 章 节 中 , 我 们 也 会 使 用 到Immunity 。 下 载 页 面 http:/debugger.immunityinc.com/(要用代理还要填写些资料)。 1.2.21.2.21.2.21.2.2在在 LinuxLinuxLinuxLinux 上安装上安装 PythonPythonPythonPython 如果需要在 Linux 上手工安装 Python 的话,可以按如下的步骤进行。这里使用 Red Hat 的衍生版,并且这个过程使用 root 权限。 第一步,下载 Python 2.5 源码并解压: _ # cd /usr/local/ # wget http:/python.org/ftp/python/2.5.1/Python-2.5.1.tgz # tar zxvf Python-2.5.1.tgz # mv Python-2.5.1 Python25 # cd Python25 _ 代码解压到/usr/local/Python25 之后,就要编译安装了: _ # ./configure -prefix=/usr/local/Python25 # make InInInIn x86x86x86x86AssemblyAssemblyAssemblyAssembly push reason_three push reason_two push reason_one call python_rocks add esp, 12 从上面的汇编代码中,可以清晰的看出参数的传递顺序,最后一行,栈指针增加了 12 个字节(三个参数传递个函数,每个被压入栈的指针都占 4 个字节,共 12 个), 使得函数调用之后的栈指针恢复到调用前的位置。 下面是个 stdcall 调用约定的了例子,用于 Win32 API。 InInInIn C C C C int my_socks(color_one color_two, color_three); InInInIn x86x86x86x86AssemblyAssemblyAssemblyAssembly push color_three push color_two push color_one call my_socks 这个例子里,参数传递的顺序也是从右到左,不过栈的平衡处理由函数 my_socks 自己完成,而不是调用者。 最后一点,这两种调用方式的返回值都存储在 EAX 中。 下面做一个简单的试验,直接从 C 库中调用 printf()函数打印一条消息,Windows 中的 C 库 位于 C:WINDOWSsystem32msvcrt.dll,Linux 中的 C 库位于/lib/libc.so.6。 c c c chapter1-printf.pyhapter1-printf.pyhapter1-printf.pyhapter1-printf.py CodeCodeCodeCode ononononWindowsWindowsWindowsWindows 欢迎加入非盈利Py t h o n 学习交流编程QQ群783462347,群里免费提供500+本Py t h o n 书籍! _ from ctypes import * msvcrt = cdll.msvcrt message_string = “Hello world!n“ msvcrt.printf(“Testing: %s“, message_string) _ 输出结果见如下: _ C:Python25 python chapter1-printf.py Testing: Hello world! C:Python25 _ Linux 下会有略微不同: c c c chapter1-printf.pyhapter1-printf.pyhapter1-printf.pyhapter1-printf.py CodeCodeCodeCode onononon LinuxLinuxLinuxLinux _ from ctypes import * libc = CDLL(“libc.so.6“) message_string = “Hello world!n“ libc.printf(“Testing: %s“, message_string) _ 输出结果如下: _ # python /root/chapter1-printf.py Testing: Hello world! # _ 可以看到 ctypes 调用动态链接库中的函数有多简单。 1.3.31.3.31.3.31.3.3构造构造 C C C C 数据类型数据类型 使用 Python 创建一个 C 数据类型很简单, 你可以很容易的使用由 C 或者 C+些的组件。 Listing 1-1 显示三者之间的对于关系。 _ C C C CTypeTypeTypeTypePythonPythonPythonPython TypeTypeTypeTypectypesctypesctypesctypes TypeTypeTypeType _ char1-character stringc_char wchar_t1-character Unicode stringc_wchar 欢迎加入非盈利Py t h o n 学习交流编程QQ群783462347,群里免费提供500+本Py t h o n 书籍! charint/longc_byte charint/longc_ubyte shortint/longc_short unsigned shortint/longc_ushort intint/longC_int unsigned intint/longc_uint longint/longc_long unsigned longint/longc_ulong long longint/longc_longlong unsigned long longint/longc_ulonglong floatfloatc_float doublefloatc_double char * (NULL terminated)string or nonec_char_p wchar_t * (NULL terminated)unicode or nonec_wchar_p void *int/long or nonec_void_p ListingListingListingListing 1-11-11-11-1:Python:Python:Python:Python 与与 C C C C 数据类型映射数据类型映射 请把这章表放到随时很拿到的地方。ctypes 类型初始化的值,大小和类型必须符合定义 的要求。看下面的例子。 _ C:Python25 python.exe Python 2.5 (r25:51908, Sep 19 2006, 09:52:17) MSC v.1310 32 bit (Intel) on win32 Type “help“, “copyright“, “credits“ or “license“ for more information. from ctypes import * c_int() c_long(0) c_char_p(“Hello world!“) c_char_p('Hello world!') c_ushort(-5) c_ushort(65531) c_short(-5) c_short(-5) seitz = c_char_p(“loves the python“) print seitz c_char_p('loves the python') print seitz.value loves the python exit() _ 最后一个例子将包含了“loves the python“的字符串指针赋值给变量 seitz,并通过 seitz.value 方法间接引用了指针的内容, 欢迎加入非盈利Py t h o n 学习交流编程QQ群783462347,群里免费提供500+本Py t h o n 书籍! 1.3.51.3.51.3.51.3.5定义结构和联合定义结构和联合 结构和联合是非常重要的数据类型, 被大量的适用于 WIN32 的 API 和 Linux 的 libc 中。 一个结构变量就是一组简单变量的集合(所有变量都占用空间)些结构内的变量在类型上没 有限制,可以通过点加变量名来访问。比如 beer_recipe.amt_barley,就是访问 beer_recipe 结 构中的 amt_barley 变量。 InInInIn C C C C _ struct beer_recipe int amt_barley; int amt_water; ; _ InInInIn PythonPythonPythonPython _ class beer_recipe(Structure): _fields_ = (“amt_barley“, c_int), (“amt_water“, c_int), _ 如你所见,ctypes 很简单的就创建了一个 C 兼容的结构。 联合和结构很像。 但是联合中所有变量同处一个内存地址, 只占用一个变量的内存空间, 这个空间的大小就是最大的那个变量的大小。 这样就能够将联合作为不同类型的变量操作访 问了。 InInInIn C C C C _ union longbarley_long; intbarley_int; charbarley_char8; barley_amount; _ InInInIn PythonPythonPythonPython _ class barley_amount(Union): 欢迎加入非盈利Py t h o n 学习交流编程QQ群783462347,群里免费提供500+本Py t h o n 书籍! _fields_ = (“barley_long“, c_long), (“barley_int“, c_int), (“barley_char“, c_char * 8), _ 如果我们将一个整数赋值给联合中的 barley_int,接着我们就能够调用 barley_char,用 字符的形式显示刚才输入的 66。 c c c chapter1-unions.pyhapter1-unions.pyhapter1-unions.pyhapter1-unions.py _ from ctypes import * class barley_amount(Union): _fields_ = (“barley_long“,c_long), (“barley_int“,c_int), (“barley_char“,c_char * 8), value = raw_input(“Enter the amount of barley to put into the beer vat: my_barley = barley_amount(int(value) print “Barley amount as a long: %ld“ % my_barley.barley_long print “Barley amount as an int: %d“ % my_barley.barley_long print “Barley amount as a char: %s“ % my_barley.barley_char _ 输出如下: _ C:Python25 python chapter1-unions.py Enter the amount of barley to put into the beer vat: 66 Barley amount as a long: 66 Barley amount as an int: 66 Barley amount as a char: B C:Python25 _ 给联合赋一个值就能得到三种不同的表现方式。 最后一个 barley_char 输出的结果是 B, 因为 66 刚好是 B 的 ASCII 码。 barley_char 成员同时也是个数组, 一个八个字符大小的数组。 在 ctypes 中申请一个数组, 只要简单的将变量类型乘以想要申请的数量就可以了。 一切就绪,开始我们的旅程吧! 欢迎加入非盈利Py t h o n 学习交流编程QQ群783462347,群里免费提供500+本Py t h o n 书籍! 2 2 2 2 调试器设计 调试器就是黑客的眼睛。你能够使用它对程序进行动态跟 踪和分析。特别是当涉及到 调试器设计 调试器就是黑客的眼睛。你能够使用它对程序进行动态跟 踪和分析。特别是当涉及到 exploitexploitexploitexploit ,fuzzer,fuzzer,fuzzer,fuzzer 和病毒分析的时候, 动态分析的能力决定你的技术水平。 和病毒分析的时候, 动态分析的能力决定你的技术水平。对于调试器的使用大家都再熟悉不过 了, 但是对调试器的实现原理, 估计就不是那么熟悉了。 当我们对软件缺陷进行评估的时候, 调试器提供了非常多的便利和优点。比如运行,暂停,步进,一个进程;设置断点;操作寄 存器和内存;捕捉内部异常,这些底层操作的细节,正是我这章要详细探讨的。 在深入学习之前, 先让我们先了解下白盒调试和黑盒调试的不同。 许多的开发平台都会 包含一个自带的调试器, 允许开发工具结合源代码对程序进行精确的跟踪测试。 这就是白盒 调试。当我们很难得到源代码的时候,开发者,逆向工程师,Hacker 就会应用黑盒调试跟 踪目标程序。黑盒调试中,被测试的软件对黑客来说是不透明的,唯一能看到的就是反汇编 代码。这时候要分析出程序的运作流程,找出程序的错误将变得更复杂,花费的时间也会更 多。但是高超的逆向技术集合优秀的逆向工具将使这个过程变得简单,轻松,有时候善于此 道的黑客,甚至比开发者更了解软件:)。 黑盒测试分成两种不同的模式:用户模式 和 内核模式。用户模式(通常指的是 ring3 级的程序)是你平时运行用户程序的一般模式(普通的程序) 。用户模式的权限是最低的。 当你运行“运算器(cacl.exe) ”的时候,就会产生一个用户级别的进程;对这个进程的调试 就是用户模式调试。核心模式的权限是最高的。这里运行着操作系统内核,驱动程序,底层 组件。当运行 Wireshark 嗅探数据包的时候,就是和一个工作在内核的网络驱动交互。如果 你想暂停驱动或者检测驱动状态,就需要使用支持内核模式的调试器了。 下面的这些用户模式的调试器大家应该再熟悉不过了:WinDbg(微软生产) ,OllyDbg (一个免费的调试器 作者是 Oleh Yuschuk) 。当你在 Linux 下调试程序的时候,就需要使用 标准的 GNU 调试器(gdb) 。以上的三个调试器相当的强大,都有各自的特色和优点。 最近几年,调试器的智能调试技术也取得了长足的发展,特别是在 Windows 平台。 智能调试体现在强大可扩展性上, 常常通过脚本或者别的方式对调试器进行进一步的开发利 用,比如安装钩子函数,以及其他的专门为 Hacker 和逆向工程师专门定制的各种功能。在 这方面出现了两个新的具有代表性的作品分别是 PyDbg (byPedram Amini)和 Immunity Debugger (from Immunity, Inc.)。 PyDbg 是一个纯Python实现的调试器, 让黑客能够用Python语言全面的控制一个进程, 欢迎加入非盈利Py t h o n 学习交流编程QQ群783462347,群里免费提供500+本Py t h o n 书籍! 实现自动化调试。Immunity 调试器则是一个会让你眼前一亮的调试器,界面相当的友好, 类似 OllyDbg,但是拥有更强大的功能以及更多的 Python 调试库。这两个调试器在本书的 后面章节将会详细的介绍。现在先让我们深入了解调试器的一般原理。 在这章, 我们将把注意力集中在 x86 平台下的用户模式, 通过对 CPU 体系结构, (堆) 栈以及调试器的底层操作细节的深入探究, 理解调试器的工作原理, 为实现我们自己的调试 器打下基础。 2.12.12.12.1 通用通用 CPUCPUCPUCPU 寄存器寄存器 CPU 的寄存器能够对少量的数据进行快速的存取访问。在 x86 指令集里,一个 CPU 有 八个通用寄存器:EAX, EDX, ECX, ESI, EDI, EBP, ESP 和 EBX。还有很多别的寄存器,遇 到的时候具体讲解。 这八个通用寄存器各有不同的用途, 了解它们的作用对于我们设计调试 器是至关重要的。 让我们先简略的看一看每个寄存器和功能。 最后我们将通过一个简单的实 验来说明他它们的使用方法。 EAX 寄存器也叫做累加寄存器,除了用于存储函数的返回值外也用于执行计算的 操作。许多优化的 x86 指令集都专门设计了针对 EAX 寄存器的读写和计算指令。列如从最 基本的加减,比较到特殊的乘除操作都有专门的 EAX 优化指令。 前面我们说了,函数的返回值也是存储在 EAX 寄存器里。这一点很重要,因为通过返 回的 EAX 里的值我们可以判断函数是执行成功与否,或者得到确切返回值。 EDX 寄存器也叫做数据寄存器。这个寄存器从本质上来说是 EAX 寄存器的延伸, 它辅助 EAX 完成更多复杂的计算操作像乘法和除法。它虽然也能当作通用寄存器使用,不 过更多的是结合 EAX 寄存器进行计算操作。 ECX 寄存器,也叫做计数寄存器,用于循环操作,比如重复的字符存储操作,或 者数字统计。有一点很重要,ECX 寄存器的计算是向下而不是向上的(简单理解就是用于 循环操作时是由大减到小的) 。 看一下下面的 Python 片段: _ counter = 0 while counter 运行-所有程序-附件-计算器 2. 右击桌面低端的任务栏,从退出的菜单中选择任务管理器。 3.选择进程面板. 4.如果你没看到 PID 栏,选择 查看-选择列 5.确保进程标识符(PID)前面的确认框是选中的,然后单击 OK。 6.找到 calc.exe 相关联的 PID 7.执行 my_test.py 同时前面找到的 PID 传递给它。 8.当 Press a key to continue.打印在屏幕上的时候, 试着操作计算器的界面。你应该什么键都 按不了。这是因为进程被调试器挂起来了,等待进一步的指示。 9.在你的 Python 控制台里按任何的键,脚本将输出别的信息,热爱后结束。 10.现在你能够操作计算器了。 如果一切都如描绘的一样正常工作,把下面两行从 my_debugger.py 中注释掉: # raw_input(“Press any key to continue.“) # self.debugger_active = False 现在我们已经讲解了获取进程句柄的基础知识, 以及如何创建一个进程, 附加一个运行 的进程,接下来让我们给调试器加入更多高级的功能。 3.23.23.23.2获得获得 CPUCPUCPUCPU 寄存器状态寄存器状态 一个调试器必须能够在任何时候都搜集到 CPU 的各个寄存器的状态。当异常发生的时 候这能让我们确定栈的状态,目前正在执行的指令是什么,以及其他一些非常有用的信息。 要实现这个目的,首先要获取被调试目标内部的线程句柄,这个功能由 OpenThread()实现. 函数原型如下: HANDLE WINAPI OpenThread( DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwThreadId ); 这看起来非常像 OpenProcess()的姐妹函数,除了这次是用线程标识符(thread identifier TID) 提到了进程标识符(PID) 。 我们必须先获得一个执行着的程序内部所有线程的一个列表,然后选择我们想要的, 再 用 OpenThread()获取它的句柄。让我研究下如何在一个系统里枚举线程(enumerate threads) 。 3.2.13.2.13.2.13.2.1枚举线程枚举线程 为了得到一个进程里寄存器的状态, 我们必须枚举进程内部所有正在运行的线程。 线程 是进程中真正的执行体(大部分活都是线程干的) ,即使一个程序不是多线程的,它也至少 有一个线程,主线程。实现这一功能的是一个强大的函数 CreateToolhelp32Snapshot(),它由 kernel32.dll 导出。这个函数能枚举出一个进程内部所有线程的列表,以加载的模块(DLLs) 的列表,以及进程所拥有的堆的列表。函数原型如下: HANDLE WINAPI CreateToolhelp32Snapshot( DWORD dwFlags, DWORD th32ProcessID ); dwFlags 参数标志了我们需要收集的数据类型(线程,进程,模块,或者堆) 。这里我 们把它设置成 TH32CS_SNAPTHREAD,也就是 0x00000004,表示我们要搜集快照 snapshot 中所有已经注册了的线程。 th32ProcessID 传入我们要快照的进程,不过它只 对 TH32CS_SNAPMODULE, TH32CS_SNAPMODULE32, TH32CS_SNAPHEAPLIST, and TH32CS_SNAPALL 这几个模块有用,对 TH32CS_SNAPTHREAD 可是没什么用的哦(后面 有说明) 。当 CreateToolhelp32Snapshot()调用成功,就会返回一个快照对象的句柄,被接下 来的函数调以便搜集更多的数据。 一旦我们从快照中获得了线程的列表,我们就能用 Thread32First()枚举它们了。函数原型如下: BOOL WINAPI Thread32First( HANDLE hSnapshot, LPTHREADENTRY32 lpte ); hSnapshot 就是上面通过 CreateToolhelp32Snapshot()获得镜像句柄,lpte 指向一个 THREADENTRY32 结构(必须初始化过) 。这个结构在 Thread32First()在调用成功后自动填 充,其中包含了被发现的第一个线程的相关信息。结构定义如下: typedef struct THREADENTRY32 DWORD dwSize; DWORD cntUsage; DWORD th32ThreadID; DWORD th32OwnerProcessID; LONG tpBasePri; LONG tpDeltaPri; DWORD dwFlags; ; 在这个结构中我们感兴趣的是dwSize, th32ThreadID, 和 th32OwnerProcessID 3个参数。 dwSize 必须在 Thread32First()调用之前初始化,只要把值设置成 THREADENTRY32 结构的 大小就可以了。th32ThreadID 是我们当前发现的这个线程的 TID,这个参数可以被前面说过 的 OpenThread() 函数调用以打开此线程,进行别的操作。th32OwnerProcessID 填充了当前 线 程 所 属 进 程 的 PID 。 为 了 确 定 线 程 是 否 属 于 我 们 调 试 的 目 标 进 程 , 需 要 将 th32OwnerProcessID 的值和目标进程对比,相等则说明这个线程是我们正在调试的。一旦我 们获得了第一个线程的信息,我们就能通过调用 Thread32Next()获取快照中的下一个线程条 目。它的参数和 Thread32First()一样。循环调用 Thread32Next()直到列表的末端。 3.2.23.2.23.2.23.2.2把所有的组合起来把所有的组合起来 现在我们已经获得了一个线程的有效句柄, 最后一步就是获取所有寄存器的值。 这就需 要通过

    注意事项

    本文(Python灰帽子.pdf)为本站会员(紫竹语嫣)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开