Shell 环境基础
有两种不同的shell环境,一个是QEMU,另一个是pyrebox的shell。
启动虚拟机后,先启动的就是QEMU,然后键入sh进入shell环境。
shell环境中列出所有命令的命令是:
- %list_commands
- 列出所有pyrebox的命令,包括用户自定义在动态加载的脚本里的命令
- %list_vol_commands
- 列出所有volatility的命令
- 所有命令都可以选择用%开头,也可以不用
脚本可以定义新的自定义命令,要运行自定义的命令需要键入%custom后面接着命令名字和该命令需要的参数
运行volatility的命令,需要键入%vol后面接着volatility的命令和参数;
pyrebox支持volatility插件扩展,只需要放到pyrebox目录中对应的volatility文件夹中
退出shell,可以键入quit、q、c、continue或直接ctrl-d
一些IPython特性
- 按tab自动补全命令
- ``CPU``对象:用sh启动一个新的shell时,CPU状态将作为一个名叫cpu的对象公开,这样可以检索cpu中每个寄存器的状态
- pyrebox命令支持嵌入python代码:可以使用IPython的变量扩展功能(比如$和{ })来实现运行pyrebox命令时嵌入python代码,比如:bpr {hex(cpu.ESP - 0x10)}:0x20,将放置一个内存读取断点在当前的堆栈指针(ESP)周围内存中。{}符号之间的表达式将被解释为python代码
- 列出可用对象。键入%who查看;除了cpu对象外,任何在IPython解释器中创建的变量将会被保留用于以后的会话
- 获得关于命令或者API相关的帮助:键入help(command * | * api_function)或者command? | api_function?(问号后缀),就可以获取对象的文档;比如help(api)
QEMU环境下的命令
- sh
- import_module:导入一个pyrebox脚本或者模块
- list_module
- unload_module:卸载
- reload_module:重新加载
shell环境下的命令
约定:
- 为了使用虚拟地址,直接使用十六进制地址,比如说0x7c871235;指定物理地址的方式:p0x00100000
- 涉及引用虚拟地址的命令需要处理进程上下文。使用proc命令可以将进程上下文设置成一个指定的正在运行的进程,可以通过进程全名(或部分名字)或PGD或者PID来指定进程
shell操作命令:
- list_commands
- list_vol_commands
- vol comm:键入一个volatility命令
- custom comm:键入一个自定义的命令
- proc:给指定进程指定工作上下文,可以通过PID、CR3或者(部分)名字来指定。后续虚拟地址将引用该进程
- mon:监控一个进程,许多事件只会被受监控的进程触发
- unmon:停止监控进程
- set_cpu:设置要操作的CPU编号(如果给QEMU配置了多个CPU的话)
- quit、q、c、continue或直接ctrl-d:退出shell并且继续执行虚拟机
- help(api | comm)或者api? | comm?:获得帮助文档
断点,当遇到断点的时候启动shell:
- bd:禁用断点,breakpoint disable
- bl:列出断点,breakpoint list
- be:启用现有断点,enable existing breakpoint
- bp:在一个地址处设置断点。该命令接受虚拟地址、物理地址和API名字,还接受一段内存范围(例如每当执行某些内存范围内的指令时中断)
- bpr:在内存读取时设置断点,和bp类似,但是只在读取指定地址或者内存范围时触发
- bpw:在内存写入时设置断点,和bp类似,但是只在写入指定地址或内存范围时触发
检查类指令:
- ps:列出所有运行进程
- lm:列出指定进程的模块,通过pid、名字或cr3指定进程。或者直接指定0、System或kernel来列出所有的内核模块
机器状态检查和操作:
- print_cpu:展示CPU
- dis:在PC中反汇编现在正在运行的进程
- u:反汇编一个给定的地址
- db,dw,dd,dq:在内存中展示byte、word、dword、qword数据
- dump:显示内存中任意大小的数据
- eb,ew,ed,eq:覆盖内存中byte、word、dword、qword数据,可以用HEX、ANSI字符串和Unicode字符串
- write:覆盖内存中任意大小的数据,可以用HEX、ANSI字符串和Unicode字符串
- r:展示或操控一个寄存器,看help里
- ior[b | w | d]:读取io端口地址(byte、word、dword)
- iow[b | w | d]:写入io端口地址(byte、word、dword)
标志:
- ln:列出距离给定地址最近的symbols(API)
- x:列出一个symbol(API)的地址。可以使用子串和通配符,格式为modulename!api,可以指定其中的一个或者都指定
其他:
- strings:显示给定内存区域中的字符串
- s:在给定的内存区域中搜索串(hex、ASCII或Unicode字符串)
- savevm:保存虚拟机快照,需要指定快照的名字,名字要求是不带单引号的数字或字符串,比如:savevm 1或者savevm my_snapshot
- loadvm:加载一个虚拟机快照,要求同上