searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

C/C++ 常用研发工具拾遗(五)

2023-06-19 10:00:49
18
0

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

总结

工具五花八门、琳琅满目,每一种工具的出现都是解决特定问题,本篇选取笔者常用部分工具,简单描述工具的使用场景和具体用法,后续也会继续更新,希望对读者有所裨益。

0条评论
作者已关闭评论
Mr. 油
89文章数
0粉丝数
Mr. 油
89 文章 | 0 粉丝
原创

C/C++ 常用研发工具拾遗(五)

2023-06-19 10:00:49
18
0

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

总结

工具五花八门、琳琅满目,每一种工具的出现都是解决特定问题,本篇选取笔者常用部分工具,简单描述工具的使用场景和具体用法,后续也会继续更新,希望对读者有所裨益。

文章来自个人专栏
文章 | 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0