记录实习过程
已经实习了一个月左右的时间. 在实习的每天早上都会对前一天的工作进行总结, 借此来记录自己在实习中学习到的知识.
TASK1 通过USB bridge controller读取硬盘相关信息(序列号, 型号, 固件版本, 协议支持等)
通过USB bridge controller读取硬盘相关信息, 最终给fboxd(实习所在公司的一款跨平台数字取证软件)添加这个功能.
0504
配置好了工作中需要用到的环境, 下载了CrystalDiskInfo的源码并编译通过.
0505
调试CrystalDiskInfo. 了解MFC程序的执行过程,找到了程序入口.
了解了JMicron, RealTek, Asmedia的USB芯片的检测命令.
0506
阅读了CrystalDiskInfo真正实现功能的代码, 知道了程序运行的流程.
找到了真正实现功能的系统调用并了解了相关系统调用的信息.
0508
查找了Jmicron, RealTek, Asmedia主流USB芯片都支持SCSI协议, 但是支持不同的修订版.
阅读了SCSI命令参考手册.
了解了Cdb的结构和一些控制信息的作用.
写了一个demo直接通过physicalDriveId, scsiPort, scsiTargetId读取设备信息.
0509
拷贝了Fboxd源码未编译成功.
0510
成功编译了Fboxd源码并进行了调试, 调试中找到了实现读取硬盘相关信息的相关函数, 要实现通过USB芯片读取硬盘的SN,MDL, FW只需要在操作系统识别出其为USB存储设备时, 给USB Device 发送相关的SCSI命令就可以实现所需要的功能.
0511
在Fboxd原有程序上添加了针对JMS583读取相关信息的功能, 但是只添加了JMS583. 成功读取出硬盘的相关信息.
0512
在Fboxd原有程序添加了Jmicron, RealTek, Asmedia USB birdge controller 读取硬盘信息的程序, 在windows上可以实现所需要的功能.
0515
安装虚拟机, 安装镜像文件, 选择的系统为Ubuntu 20.04, 开发环境的Linux内核版本为3.14, 尝试在Ubuntu 20.04上编译内核3.14, 但是很多3.14版本的内核编译工具都被弃用了, 没能编译成功.
0516
直接下载了ubuntu 14.04, 编译内核3.14, 并设置默认内核版本3.14, 在linux上移植程序, 但是还有一些小问题.
0517
在校考试, 无进展.
0518
在校考试, 无进展.
0519
在Linux实现了通过USB bridge controller读取硬盘相关信息, 并将代码进行优化, 提高其可阅读性.
TASK 学习The Sleuth Kit的文件读取方式, 并将原fboxd文件读取方式进行更改
fboxd原来读取文件的方式是通过挂载文件系统, 实现文件列表的扫描, 文件数据提取和复制. 但是存在一些问题, 现在需要以不挂载文件系统的方式实现以上功能.
0522
在linux上编译了The sleuth kit(一款开源的分析镜像文件的数字取证软件)的源码.
Tsk的主要功能是通过是同afflib, ewflib实现的, 最终要实现Tsk下各种tools的功能.
0523
考试, 无进展.
0524
考试, 无进展.
0525
调试了Tsk下的tools, 主要调试了fls.
fls工作流程open img -> disk img以文件系统方式进行处理 -> fls.
fls以文件系统的组织结构通过root_inode递归的寻找dir下的dir_entry, 以此实现文件列表的扫描.
0526
继续调试了Tsk中fls, 观察fls的函数调用关系, 函数调用关系非常复杂.
fls显示打开磁盘映像文件, 然后以文件系统的方式打开磁盘映像文件, 通过文件系统查找文件, dir.
于是去了解了一些文件系统(FAT, NTFS, EXT).
0529
尝试在fboxd中添加读取img信息的代码, 未完.
0530
fboxd已经有读取磁盘信息和检测文件系统的功能, 进行了调试.
再次调试Tsk中fls功能, 主要了解在读取了文件系统的信息后如何通过文件系统的信息查找dir和dentry中的文件信息.
0601
整理了Tsk中文件列表扫描的流程并将其整理成文档.
阅读fboxd/TaskImagingF2F.cpp(文件到文件的复制的功能), 准备更改其实现方式.
0602
考试.
0605
尝试将tsk以静态库的方式加入fboxd中, 未成功.
0606
将libtsk加入fboxd中, 并编译通过.
Tsk中fls默认是将dir中信息打印出来, 定义了dentry数据结构将fls的信息保存起来.
在fboxd/CTaskImagingF2F中加入FileList, 工作方式与Tsk/fls保持一致,
open_img -> fs_open -> tsk_fls .
0607
0606将文件列表的信息保存在dentry数据结构中可能会占用大量内存, 并且需要扫面的源文件的文件目录项数量是未知的可能会导致OOM, 导致程序奔溃. 需要另寻他法.
0608
将libtsk的代码更改了一下, 重新编译加入fboxd.
tsk_fs_fls参数列表加入了一个回调函数, 通过回调函数对每一条dentry进行操作.
这样就不会占用大量内存了, 而是都读一条dentry处理一条dentry.
但是又遇到了其他问题, fboxd/TaskImagingF2F::SearchFile传入的源文件路径是卷名称, 而Tsk接受的参数为设备驱动器号.
0609
通过winapi将volume path转换成设备驱动号, 成功进行文件列表扫描.
又发现新问题, 如何如何将读取原文件路径, 并创建新的文件路径和复制文件.
0612
通过dentry的inum读取到文件内容, tsk是通过文件的inum将文件在命令行打印出.
对tsk的源码进行更改, 使其将每次从文件中读取的内容保存为文件.
实现了将磁盘上的文件到指定设备路径上的拷贝, 但是编码方式有些问题, 不能够完好的显示.
构思了如何实现, 将文件保存至指定磁盘.
原始的保存文件至指定磁盘是通过挂载文件系统实现的, 原来已经保存了, 指定磁盘的volume,
可以将volume转换为设备路径名. 再结合原磁盘上的文件层次, 指定要保存的文件路径.
0613
基本实现文件的copy, 并且文件层次和源文件保持一致.
几点问题, 读写速度太慢. 出现字符编码问题.
0614
给fboxd添加对磁盘映像文件的分析, 实现了在windows上分析在转载了linux文件系统的磁盘映像的分析.
0615
exe ppt 文档等文件copy出错, 视频pdf没有出出错.
0616
文件拷贝出错是因为有UNALLOC的文件与ALLOC重名, 对同一个文件进行了重复写, 导致文件不可访问.
现在加上了对同名未ALLOC的文件的操作, 在文件名前加上创建它的日期, 使其不重名.
现在测试了NTFS FAT EXT2/4(磁盘映像文件) 没有问题.
但是现在缺少了与前端的数据交互, 如速率容量时间等.
0619
基本完成了, 使用tsk实现TaskImagingF2F.cpp中的文件列表扫描, 文件数据提取与拷贝.
与前端的交互也有了, 但是怎么怎么判断task是否正确完成, 仍然有问题.
下一步文件的筛选, 保留所需要的文件.
0620
查找内存泄露相关资料, 学习排查方法并应用.
查找内存泄露, 修复了内存泄露, 现在fboxd运行时峰值内存占用也就几十MiB.
对软连接进行处理, 保留原有文件名称, 但是文件内容为指向的文件的路径.
0621
计算每一个文件的hash值来降低文件冗余, 稳定运行时内存使用在10MiB.
TODO: 计算文件hash值
sqlite with cpp
0625
使用SQLite保存文件hash value, 每次验证文件hash是否已经在表中存在, 不存在即插入, 并保存当前文件; 当前文件hash已经在表中存在, 不保存当前文件.
0627
考试.
0628
阅读并调试了FastCopy的源码, 观察其是如何实现fast copy的, 通过多个线程实现并行copy.
0629
撰写fboxd的说明文档, 准备交接.
0630
交接工作