strip
产品化商业化的软件为了防止被第三方通过反编译、反汇编等手段逆向分析破解,可以在发表版本时,使用 strip 将可执行文件中的符号信息进行删除。
# strip demo7
# nm demo7
nm: demo7: no symbols
ptrace
产品化商业化的软件为了防止被第三方通过单步调试等手段逆向分析破解,在 main 函数添加如下代码,这样进程就会阻止 gdb attach。
int ret = ptrace(PTRACE_TRACEME, 0, 1, 0);
if (ret < 0) {
return -1;
}
lsof
使用 lsof 分析当前进程打开的所有文件句柄,包括普通文件、目录、字符设备、块设备、管道文件、socket 网络连接等。
# lsof -p 8805
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
demo 8805 root mem REG 8,8 67124909 /usr/lib64/libfreeblpriv3.so (path dev=0,96)
demo 8805 root 0u IPv4 2038712372 0t0 TCP fs-service-6:33538->192.168.100.48:emcrmirccd (ESTABLISHED)
demo 8805 root 4w REG 8,8 3701 70477635 /var/log/client-8805.log
strace
在存储系统特别是文件系统的研发过程中,经常需要使用 strace 这一神器追踪系统文件类命令执行,分析命令执行哪些系统调用,系统调用执行开销,系统调用执行返回情况。如下图所示使用 strace 分析 ls 执行过程。
[root@n demo]# strace -t -tt -ttt ls
1686015303.519092 execve("/usr/bin/ls", ["ls"], 0x7ffc5a4e7358 /* 34 vars */) = 0
1686015303.519495 brk(NULL) = 0x1d43000
1686015303.520239 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efd2a13f000
1686015303.520377 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
# 动态连接库查找及加载过程
1686015303.520593 open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
1686015303.520704 fstat(3, {st_mode=S_IFREG|0644, st_size=73284, ...}) = 0
1686015303.520822 mmap(NULL, 73284, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7efd2a12d000
1686015303.520920 close(3) = 0
1686015303.521029 open("/lib64/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
...
# 相关系统调用执行情况
1686015303.534477 openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
1686015303.534585 getdents(3, /* 23 entries */, 32768) = 728
1686015303.534707 getdents(3, /* 0 entries */, 32768) = 0
1686015303.534804 close(3) = 0
1686015303.534942 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
1686015303.535041 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efd2a13e000
# 执行结果输出
1686015303.535147 write(1, "demo1\t demo1.dot demo2 dem"..., 110demo1 demo1.dot demo2 demo3 demo4 demo5 demo6 demo6.cc demo7.cc example.h libexample.so
) = 110
1686015303.535260 write(1, "demo1.cc demo1.png demo2.cc d"..., 97demo1.cc demo1.png demo2.cc demo3.cc demo4.cc demo5.cc demo6.c demo7 example.cc gmon.out
) = 97
总结
工具五花八门、琳琅满目,每一种工具的出现都是解决特定问题,本篇选取笔者常用部分工具,简单描述工具的使用场景和具体用法,后续也会继续更新,希望对读者有所裨益。