python 调试 debugger
Posted myrj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 调试 debugger相关的知识,希望对你有一定的参考价值。
调试(Debugging) 利用好调试,能大大提高你捕捉代码Bug的。大部分新人忽略了Python debugger(pdb)的重要性。 在这个章节我只会告诉你一些重要的命令,你可以从官方文档中学习到更多。 译者注,参考:https://docs.python.org/2/library/pdb.html Or https://docs.python.org/3/library/pdb.html 从命令行运行 你可以在命令行使用Python debugger运行一个脚本, 举个例子: $ python -m pdb my_script.py 这会触发debugger在脚本第一行指令处停止执行。这在脚本很短时会很有帮助。你可以通过(Pdb)模式接着查看变量信息,并且逐行调试。exit退出 从脚本内部运行 同时,你也可以在脚本内部设置断点,这样就可以在某些特定点查看变量信息和各种执行时信息了。这里将使用pdb.set_trace()方法来实现。举个例子: import pdb def make_bread(): pdb.set_trace() return "I don\'t have time" print(make_bread()) 试下保存上面的脚本后运行之。你会在运行时马上进入debugger模式。现在是时候了解下debugger模式下的一些命令了。 命令列表: c: 继续执行 w: 显示当前正在执行的代码行的上下文信息 a: 打印当前函数的参数列表 s: 执行当前代码行,并停在第一个能停的地方(相当于单步进入) n: 继续执行到当前函数的下一行,或者当前行直接返回(单步跳过) 单步跳过(next)和单步进入(step)的区别在于, 单步进入会进入当前行调用的函数内部并停在里面, 而单步跳过会(几乎)全速执行完当前行调用的函数,并停在当前函数的下一行。 pdb真的是一个很方便的功能,上面仅列举少量用法,更多的命令强烈推荐你去看官方文档。
Immunity Debugger学习笔记
图1::Immunity主界面
注意事项:最下方的PyCommands窗格既可以执行调试命令也可以执行python脚步文件。
1、PyCommands学习
在 Immunity 中执行 Python 的方法即使用 PyCommands。PyCommands 就是一个个 python 脚本文件,存放在 Immunity 安装目录的 PyCommands 文件夹里。每个 python 脚本都执行一 个任务(hooking,静态分析等待),相当于一个 PyCommand。每个 PyCommand 都有一个 特定的结构。以下就是一个基础的模型:
from immlib import *
def main(args):
# Instantiate a immlib.Debugger instance
imm = Debugger()
return "[*] PyCommand Executed!"
PyCommand 有两个必备条件。一个 main()函数,只接收一个参数(由所有参数组成的 python 列表)。另一个必备条件是在函数执行完成的时候必须返回一个字符串,最后更新在 调试器主界面的状态栏。执行命令之前必须在命令前加一个感叹号。
!<scriptname>
2、PyHooks
Immunity 调试器包含了 13 总不同类型的 hook。每一种 hook 都能单独实现,或者嵌入 PyCommand。
BpHook/LogBpHook
当一个断点被触发的时候,这种 hook 就会被调用。两个 hook 很相似,除了 BpHook 被 触发的时候,会停止被调试的进程,而 LogBpHook 不会停止被调试的进程。
AllExceptHook
所有的异常的都会触发这个 hook。
PostAnalysisHook
在一个模块被分析完成的时候,这种 hook 就会被触发。这非常有用,当你在在模块分 析完成后需要进一步进行静态分析的时候。记住,在用 immlib 对一个模块进行函数和基础 块的解码之前必须先分析这个模块。
AccessViolationHook
这个 hook 由访问违例触发。常用于在 fuzz 的时候自动化捕捉信息。
LoadDLLHook/UnloadDLLHook
当一个 DLL 被加载或者卸载的时候触发。
CreateThreadHook/ExitThreadHook
当一个新线程创建或者销毁的时候触发。
CreateProcessHook/ExitProcessHook
当目标进程开始或者结束的时候触发。
FastLogHook/STDCALLFastLogHook
这两种 hook 利用一个汇编跳转,将执行权限转移到一段 hook 代码用以记录特定的寄存 器,和内存数据。当函数被频繁的调用的时候这种 hook 非常有用;第六章将详细讲解。
以下的 LogBpHook 例子代码块能够作为 PyHook 的模板。
from immlib import *
class MyHook( LogBpHook ):
def init ( self ):
LogBpHook. init ( self )
def run( regs ):
# Executed when hook gets triggered
我们重载了 LogBpHook 类,并且建立了 run()函数(必须)。当 hook 被触发的时候,所 有的 CPU 寄存器,以及指令都将被存入 regs,此时我们就可以修改它们了。regs 是一个字 典,如下访问相应寄存器的值:
regs["ESP"]
hook 可以定义在 PyCommand 里,随时调用。也可以写成脚本放入 PyHooks 目录。每 次启动 Immunity 都会制动加载这些目录。接下来看些实例。
以上是关于python 调试 debugger的主要内容,如果未能解决你的问题,请参考以下文章
Android修改ro.debuggable 真机adb调试所有进程
Python 自动化 - 浏览器chrome打开F12开发者工具自动Paused in debugger调试导致无法查看网站资源问题原因及解决方法,javascript反调试问题处理实例演示(代码片段