调试器

70.1 tracer

我用tracer代替调试器。

我最终不再使用调试器是因为我所需要的只是在代码执行的时候找到函数的参数,或者寄存器在某点的状态。每次加载调试器的时间太长,因此我编写了一个小工具tracer。它有控制台接口,运行在命令行下,允许我们给函数下断,查看寄存器状态,修改值等等。

但出于学习的目的更建议在调试器中手动跟踪代码,观察寄存器状态是怎么变化的(比如经典的SoftICE,Ollydbg,Windbg寄存器值发生变化会高亮),手动修改标志位,数据然后观察效果。

70.2 OllyDbg

非常流行的win32用户态调试器 http://go.yurichev.com/17032 短热键列表(第977页)

70.3 GDB

GDB在逆向工程师中并不非常流行,但用起来非常舒适。部分命令(第978页) #第71章 ##系统调用跟踪

71.0.1 stace/dtruss

显示当前进程的系统调用(第697页)。比如:

  1. # strace df -h
  2. ...
  3. access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
  4. open("/lib/i386-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
  5. read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\220\232\1\0004\0\0\0"..., 512) = 512
  6. fstat64(3, {st_mode=S_IFREG|0755, st_size=1770984, ...}) = 0
  7. mmap2(NULL, 1780508, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb75b3000

Mac OS X 的dtruss也有这个功能。

Cygwin也有strace,但如果我理解正确的话,它只为cygwin环境编译exe文件工作。