和软件分析课一起学,都是每天俩小时,突发奇想记录一下做实验的日常

实验

pstree

10.5

思考了如何保证输出的格式像标准的pstree一样。如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
systemd─┬─ModemManager───2*[{ModemManager}]
├─NetworkManager───2*[{NetworkManager}]
├─VGAuthService
├─accounts-daemon───2*[{accounts-daemon}]
├─acpid
├─avahi-daemon───avahi-daemon
├─bluetoothd
├─colord───2*[{colord}]
├─cpptools-srv───23*[{cpptools-srv}]
├─cron
├─cups-browsed───2*[{cups-browsed}]
├─cupsd
├─dbus-daemon
├─gdm3─┬─gdm-session-wor─┬─gdm-wayland-ses─┬─gnome-session-b───2*[{gnome-session-b}]
│ │ │ └─2*[{gdm-wayland-ses}]
│ │ └─2*[{gdm-session-wor}]
│ └─2*[{gdm3}]
├─gnome-keyring-d───3*[{gnome-keyring-d}]

放弃直接开个超级大的二维字符串数组的想法,因为这样很浪费空间也可能会导致部分机器直接运行失败。

决定使用递归的方法,用栈记录每个有多个子进程的进程的位置,回溯的时候返回子树的最大高度,此返回值决定了要输出几个竖线|。分类讨论子进程的第一个和最后一个,用不同的符号作连接┬└。然后用strcat,sprintf等函数填到一个字符串数组里面,最后一起输出。子线程合为一行的之后再考虑,方法就是查找Tpid。先看看实现个雏形再说。

10.8

6号出去玩,7号打一天ctf,堂堂归来

想到了个更好的方法,还录制了个视频给朋友讲解了一下,说不定可行,开写

image-20231008193716893

应该是可行的,微改一下就行了

10.10

9号回学校摆了。今日实现了一波感觉理论肯定是没问题的。

image-20231010151206039

主要是第二层的进程的子进程的位置的规则还没编写好,明天把栈的规则再修改一下应该就行了

image-20231010151258015

思路还是递归,也是记录有大于1个子进程的位置。不过这里是直接进行输出而不是像上面所说的用大字符数组存储。因为pstree输出的特征是能在一行表示的要么是一个父进程,其他全是他的子进程,要么是分隔线,┬└|这种。而它要是一行有多个分隔线,只有最右边的那个可能是┬└|三者中的一个,左边的全是|。所以递归到当前一行的时候取出栈中的值然后在对应的位置输出|,然后特判一下最后一个是┬└|中的哪个即可。其他全部填充空格,即可实现pstree的格式效果

目前思路是没问题的。

10.11

增增改改,还得优化一下递归的逻辑。递归已经能做到不同层输出到不同的位置,但是还是有一部分逻辑错误。

10.24

成都旅游加n1ctf加rust,一堆事后重回战场

完成了大部分工作,已经很接近正常的输出了

image-20231024193447056

接下来需要解决的问题比较少了。

最后一位需要回溯,比如这里的├─update-notifier,应该是└─update-notifier,应该就是这里的问题,明天继续

11.15

非常的悲伤,中间由于突然的需求和手机邀请赛的准备,完全没时间接着写,整到今天才完事儿。不过学到很多东西,算了(

项目一拖太久了,有点小bug准备之后修,pstree就先到此为止

image-20231115103811386