fishbrid

fishbrid

0个粉丝

13

问答

0

专栏

1

资料

fishbrid  发布于  2018-06-15 14:31:42
采纳率 0%
13个问答
2145

求购WFS0.2、WFS0.3、WFS0.4源码

 
哪位大神手上有WFS0.2、WFS0.3、WFS0.4版本源码,求购!谢谢。
我来回答
回答6个
时间排序
认可量排序

fishbrid

0个粉丝

13

问答

0

专栏

1

资料

fishbrid 2018-08-18 09:58:38
认可0
手头上有WFS.lib和libWFS.a的库,是WFS0.2版本的,看来只能逆向了

fishbrid

0个粉丝

13

问答

0

专栏

1

资料

fishbrid 2018-09-08 09:06:24
认可0
手头有libWFS.a的静态库和wfs.h降低了逆向的难度,第一步解压静态库arm-hisiv300-linux-ar -x libWFS.a解压后看到有adapt.o  buffer.o  clus.o  dir.o disk.o  file.o  index.o system.o几个文件

fishbrid

0个粉丝

13

问答

0

专栏

1

资料

fishbrid 2018-09-08 09:07:14
认可0
DVR文件系统及硬盘发展趋势
嵌入式DVR与PC机一样,都存在硬盘文件系统。嵌入式DVR硬盘文件系统可分为两类,一是与PC机相同的FAT文件系统,第二种是嵌入式DVR生产厂家自行开发的,适合存储大容量媒体数据流的专业文件系统。
目前市场上,PC-based DVR一般基于Windows系统,文件系统一般采用NTFS或FAT32;而嵌入式 DVR所采用的文件系统则与厂商选择的嵌入式操作系统有密切的关系。目前嵌入式 DVR中所采用的嵌入式操作系统有RTOS、pSOS、嵌入式 Linux、vxWorks等,而采用的文件系统则有较多种类,如MS-DOS兼容文件系统、UNIX兼容文件系统、Windows兼容文件系统等。
PC系统使用的FAT文件系统,对于长时间录像产生的大数据包(几G到数十G的数据)无法管理,只能进行分包,将一段完整的录像,分为若干个小的文件包,如5、10、30分钟自动形成一个文件,或者150M、200M作为一个文件。因此容易产生包与包之间丢帧现象,同时硬盘磁头需要频繁地读写数据与文件索引,磁头频繁跳动, 对于每天十几到二十四小时连续读写硬盘的DVR系统,极容易造成硬盘故障。同时硬盘录满后,需要删除整段文件,但新录制的文件与老的文件大小不同,由此会在硬盘上产生大量碎片空间,影响硬盘的使用和系统效率。另外,FAT文件系统用做录像机录像资料管理还存在两个风险,一是文件分配表如果损坏,则录像资料大多会丢失,二是系统突然断电或遭到人为破坏,当前的录像数据不能够保存。
针对FAT文件系统在媒体数据流存储领域中的不足之处,专业公司开发了适合媒体数据流存储方式的硬盘管理文件系统,该系统可以高效率地管理整个硬盘,不受录像数据包大小影响,录像机从开始到结束为一个录像机段,录像机段长度可从几秒钟到几十小时,数据可从几K到几十T。采用这种硬盘管理方式,克服了FAT系统对长时间录像管理存在的缺陷。由于不存在分包录像,因此也不存在包与包之间丢帧现象;磁头不需要频繁读写数据与文件索引,延长硬盘使用寿命;硬盘录满后,采用逐帧覆盖技术,不存在硬盘碎片。可以将硬盘形象地比做一盘录像机带,硬盘任何地方的错误,不会影响前面或后面的录像。在突然断电的情况下,也能保存断电前瞬间的图像;同时,原 始录像资料盘数据与PC不兼容,无法在PC上直接修改,保证原始资料的保密性和可靠性。
但由于开发难度和资金投入的限制,多数嵌入式DVR生产企业仍然会采用FAT文件存储方式对硬盘录像机进行数据管理。从嵌入式DVR硬盘文件系统的发展方向看,长时间稳定录像采用这种方式可以大幅度提高硬盘录像机的可靠性,但需要专业公司具备开发硬盘操作系统的能力与经验,目前国内只有少数几个厂家拥有该项技术。
储存结构
为了提高灵活性,系统将硬盘进行分区。一个硬盘最多划分为两个区(又称为驱动器)。系统预留了一分区扇区,保存在该扇区的分区信息结构包括着硬盘的操作状态、校验标记等一些重要信息,同时还包含两个分区的硬盘参数表(即DPT)。DPT又包含每个分区的储存特征、总的簇数等信息。硬盘分区(如图1 硬盘分区示意图)所示:
分区扇区        分区信息结构(含两个硬盘参数表):扇区号,硬盘信息



第一分区        .驱动器参数结构
.目录区
.索引区
.数据区

第二分区        .驱动器参数结构
.目录区
.索引区
.数据区

驱动器参数结构是文件系统访问驱动器的依据,它包含驱动器的操作状态、储存特征、链表指针、校验标记等信息。硬盘排列时,根据驱动器的操作状态(特别是录像起止时间),驱动器形成双向链表,链表指针被填充。硬盘格式化时,根据硬盘容量和分区个数生成DPT,再用DPT来初始化每个分区的驱动器参数结构,并保存到对应扇区。硬盘初始化时,根据DPT中的驱动器参数结构扇区偏移直接得到驱动器参数结构。
对于大数据量的流媒体应用,系统采用单位比较大的簇来管理数据,这样可以提高效率,而数据碎片的影响可以忽略不计。每簇与目录区和索引区中的目录结构、索引结构物理上一一对应。写数据时,目录结构、索引结构、簇在物理上都是顺序申请的,按照申请的时间先后次序,各个通道混合存放。
( 如图2 硬盘目录结构图)所示,组成如下表。其中簇标志用于标识文件的起始和结束,数据标志和数据属性用于文件的查找和定位,关联属性将特定通道的簇链接起来,主要用于文件的连续读取。
簇标志        该簇为空闲簇或所在文件的首簇、扩展首簇、非首簇的标志。
数据标志        该簇录像数据的通道号、音视频标志、报警标志。
数据属性        该簇录像数据的起止时间、长度、图像质量。
关联属性        该簇为文件的第几簇,以及该簇在所在文件的首簇号、下项簇号、上项簇号。
保留       

索引结构包含簇内数据的通道号、音视频标志、报警标志。由于索引结构占用空间小,实际上使用索引结构代替目录结构中的数据标志来实现文件的查找,可以提高效率。
缓冲管理
由于对索引区及目录区的读写操作比较频繁,存在空间、时间局部性,如果每次读写直接对底层接口进行调用,比较浪费资源,而从系统中开一缓冲数组进行管理,从而减少真正的读写次数。而对数据区的读写不存在上述特性,所以对数据区的读写可以直接调用底层接口函数。
为了提高缓冲的命中率,缓冲开设大小应该大于64个扇区单元,如果系统内存资源不存在问题,则加大开设的缓冲数。在大的缓冲数开设情况下,系统存在缓冲查找的时间开销,为减小这部分开销,在定位缓冲时采用hash查找。Hash表的长度定为缓冲数的2倍以上。由于访问上顺序特性,hash函数可以直接从LBA的低位生成。
在突然断电的情况下,为了能够恢复数据,对目录区必须进行随时保存,所以缓冲在任意情况下都能进行同步,同步方式有单缓冲、单驱动器、所有缓冲。
电源管理
硬盘正常运行的功耗都比较大,一般都带电源管理功能,它基本上分为三种工作状态,分别为寻道、空闲、待命。空闲状态硬盘的电机还是运转的,待命状态时硬盘的电机是停转的,但它接受命令的输入。
系统设置了硬盘的参数,使其如果在固定时间无任何操作情况下自动进入待命状态,但由于硬盘从待命状态恢复到寻道状态需要比较长的时间(一般在8秒以上),会引起数据的丢失,所以程序中在对待命的硬盘进行操作前会预先进行唤醒。
对于同一端口的主从盘,由于采用的是同一组线,现对它们在电源管理上采用一致的方式,即要么两盘一起工作,要么一起进行待命状态。
文件系统初始化与冲突处理
文件系统初始化的流程为:缓冲初始化-版本检测-驱动器初始化-句柄初始化、文件系统恢复-冲突扫描-硬盘排列。初始化成功后,文件系统才能开始正常工作。
版本检测时,判断分区扇区中的校验标记,如果不是系统要求的文件系统标记,对其格式化。
硬盘排列指文件系统初始化时,需要根据硬盘录像时间的先后顺序将所有驱动器参数结构连成双向链表,并确定当前工作盘。对硬盘的工作顺序正确排列,理功能,它基本上分为三种工作状态,分别为寻道、空闲、待命。空闲状态硬盘的电机还是运转的,待命状态时硬盘的电机是停转的,但它接受命令的输入。
系统设置了硬盘的参数,使其如果在固定时间无任何操作情况下自动进入待命状态,但由于硬盘从待命状态恢复到寻道状态需要比较长的时间(一般在8秒以上),会引起数据的丢失,所以程序中在对待命的硬盘进行操作前会预先进行唤醒。
对于同一端口的主从盘,由于采用的是同一组线,现对它们在电源管理上采用一致的方式,即要么两盘一起工作,要么一起进行待命状态。
文件系统初始化与冲突处理
文件系统初始化的流程为:缓冲初始化-版本检测-驱动器初始化-句柄初始化、文件系统恢复-冲突扫描-硬盘排列。初始化成功后,文件系统才能开始正常工作。
版本检测时,判断分区扇区中的校验标记,如果不是系统要求的文件系统标记,对其格式化。
硬盘排列指文件系统初始化时,需要根据硬盘录像时间的先后顺序将所有驱动器参数结构连成双向链表,并确定当前工作盘。对硬盘的工作顺序正确排列,是保证数据连续性和空间最大利用率的基础。
但是,由于机器上的硬盘变动(如人为的硬盘更换),硬盘之间录像时间会有重叠,或者与机器的当前时间冲突,这些统称为硬盘冲突。对冲突进行适当的处理,才能使系统正常工作,并且在最佳状态,反之,会对数据连续性,空间利用率和查找都带来坏的影响。
以往的系统没有冲突处理功能,检测到冲突后跳出了硬盘排列,余下的硬盘没有排列到链表中,浪费了大量空间,而用户只能清除所有数据,才能恢复正常。后来,系统增加与用户交互的冲突处理功能,把检查出来的冲突提交给用户,再由用户根据实际情况进行处理(格式化或设为只读盘),在一定程度上降低了冲突带来的影响,但有时用户不能做出正确和果断的判断,冲突处理反而会造成使用不方便。新系统可以自动处理冲突,帮助用户做出决定,在有冲突发生时将系统性能损失降到最低。
定时打包与文件系统恢复
关闭一个正在写的文件,称为打包。打包后的录像文件信息是完整无误的。对文件定时打包,将连续的数据分割成小的块,有利于文件的检索,方便用户操作。一般设置打包时间为一小时,文件系统会在整点自动打包,即先关闭正在写的文件,再打开一个新的文件。
非正常关机后启动,可能会有未打包的文件,此时驱动器参数表也可能没有更新,会造成以后读写操作错误,因此需要对其进行恢复。关机时系统时间被保存在CMOS中,恢复时会使用到。
文件操作、查找、定位
保存录像的文件系统调用顺序为:打开写文件句柄-写文件-关闭文件句柄。其间,文件系统内部还会对文件自动打包。回放录像的文件系统调用顺序为:查找文件-打开读文件句柄-文件内定位-读文件-关闭文件句柄。在文件句柄生存周期中,读写定位操作都可以多次调用。
查找的参数是时间,找到的文件起止时间应包含查找时间,或者是查找时间之后最早的文件。查找有普通、列表、报警列表等模式。不同查找只查找一个文件,列表查找按时间顺序找到指定数目的文件。
定位的参数可以是数据长度、绝对时间,或相对时间。
如图3、4所示,可以看到,目前硬盘消费超脱了传统PC的主导地位,慢慢向消费类电子进军。在这类消费类电子中,DVR占了其中的一大部分。但是在现在的监控系统中DVR应用的硬盘问题特别突出,据不完全统计DVR的故障率60%是由硬盘引起的。硬盘在DVR中有这么高的故障率,引起了社会硬盘厂商的高度关注。另外,硬盘问题突出,也直接增加服务成本,影响了品牌的形象。针对硬盘的需求,监控系统的应用和个人电脑有一定的区别,如图5所示。
        监控系统        个人电脑
开机电流        设计电源时需考虑硬盘的开机电流,尤其是多硬盘的系统        电脑电源能提供足够电流
读写速度        不需很快        越快越好
数据完整性        对话音和影像不很重要        很重要
散热        硬盘多,设计及安装时必须考虑散热问题        硬盘不多,基本上没有散热问题
振动        设计及安装时需考虑硬盘的振动问题        个人电脑的机箱设计一般能解决硬盘的振动问题

根据上述表格,针对DVR 应用可以从四个方面进行特性优化设计:
•启动电流;
•功耗;
•不同方式同时容纳系统数据和图像数据;
•自动休眠。

fishbrid

0个粉丝

13

问答

0

专栏

1

资料

fishbrid 2018-09-08 09:55:09
认可0
就按照上面说的来,总体逆向流程以自己的理解为主要方法结合IDA 反编译结果来实现。难点在于数据结构的确定,只要数据结构一确定,也就没什么秘密了,有VFS的基础写文件系统还是有把握的,目前看来目录结构和索引结构应该比较难确定,其它的数据结构可以由wfs.h反推。

fishbrid

0个粉丝

13

问答

0

专栏

1

资料

fishbrid 2018-09-08 10:02:15
认可0
确定IDA需要的一些设置参数arm-hisiv300-linux-readelf -a disk.o
Attribute Section: aeabi
File Attributes
  Tag_CPU_name: "ARM940T"
  Tag_CPU_arch: v4T
  Tag_ARM_ISA_use: Yes
  Tag_THUMB_ISA_use: Thumb-1
  Tag_ABI_PCS_wchar_t: 4
  Tag_ABI_FP_denormal: Needed
  Tag_ABI_FP_exceptions: Needed
  Tag_ABI_FP_number_model: IEEE 754
  Tag_ABI_align_needed: 8-byte
  Tag_ABI_align_preserved: 8-byte, except leaf SP
  Tag_ABI_enum_size: int
  Tag_ABI_optimization_goals: Aggressive Size
  Tag_DIV_use: Not allowed

就按照以上信息来设置IDA,这个可以参考着来逆向其它库文件。

fishbrid

0个粉丝

13

问答

0

专栏

1

资料

fishbrid 2018-09-08 14:55:23
认可0
咱们就瞅简单的来,system.c初步看是和时间相关的容易逆向

/* This file has been generated by the Hex-Rays decompiler.
   Copyright (c) 2007-2017 Hex-Rays <[email]info@hex-rays.com[/email]>

   Detected compiler: GNU C++
*/

#include


//-------------------------------------------------------------------------
// Function declarations

signed int __fastcall wfs_mktime(_DWORD *a1);
clock_t wfs_getmscount();
struct timeval *__fastcall wfs_sleep(int a1);
struct tm *__fastcall wfs_gettime(unsigned int *a1);
// int __fastcall iszero_time(_DWORD); weak
// time_t mktime(struct tm *tp);
// void _assert(const char *assertion, const char *file, int line);
// clock_t times(struct tms *buffer);
// int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
// time_t time(time_t *timer);
// struct tm *localtime_r(const time_t *timer, struct tm *tp);


//----- (00000000) --------------------------------------------------------
signed int __fastcall wfs_mktime(_DWORD *a1)
{
  _BYTE *v1; // r4
  signed int result; // r0
  struct tm tp; // [sp+4h] [bp-34h]

  v1 = a1;
  if ( iszero_time(*a1) )
    return 0;
  tp.tm_sec = *v1 & 0x3F;
  tp.tm_min = ((unsigned int)*(unsigned __int16 *)v1 >> 6) & 0x3F;
  tp.tm_hour = (*(_DWORD *)v1 >> 12) & 0x1F;
  tp.tm_mday = (v1[2] >> 1) & 0x1F;
  tp.tm_mon = (((unsigned int)*((unsigned __int16 *)v1 + 1) >> 6) & 0xF) - 1;
  tp.tm_year = ((unsigned int)(unsigned __int8)v1[3] >> 2) + 100;
  tp.tm_isdst = -1;
  result = mktime(&tp);
  if ( result <= 0 )
    _assert("tt > 0", "Src/system.c", 130);
  return result;
}
// 1F8: using guessed type int __fastcall iszero_time(_DWORD);

//----- (000000C0) --------------------------------------------------------
clock_t wfs_getmscount()
{
  return 10 * times(0);
}

//----- (000000DC) --------------------------------------------------------
struct timeval *__fastcall wfs_sleep(int a1)
{
  struct timeval *timeout; // [sp+0h] [bp-18h]
  struct timeval v3; // [sp+8h] [bp-10h]

  v3.tv_sec = a1 / 1000;
  v3.tv_usec = 1000 * (a1 % 1000);
  while ( select(0, 0, 0, 0, &v3) )
    ;
  return timeout;
}

//----- (00000134) --------------------------------------------------------
struct tm *__fastcall wfs_gettime(unsigned int *a1)
{
  unsigned int *v1; // r4
  struct tm *result; // r0
  int v3; // [sp+0h] [bp-38h]
  int v4; // [sp+4h] [bp-34h]
  int v5; // [sp+8h] [bp-30h]
  int v6; // [sp+Ch] [bp-2Ch]
  int v7; // [sp+10h] [bp-28h]
  int v8; // [sp+14h] [bp-24h]
  time_t v9; // [sp+2Ch] [bp-Ch]

  v1 = a1;
  v9 = time(0);
  result = localtime_r(&v9, (struct tm *)&v3);
  *v1 = v3 & 0x3F | (((((*v1 & 0x3FFFFFF | ((v8 - 100) << 26)) & 0xFC3FFFFF | ((((_BYTE)v7 + 1) & 0xF) << 22)) & 0xFFC1FFFF | ((v6 & 0x1F) << 17)) & 0xFFFE0FFF | ((v5 & 0x1F) << 12)) & 0xFFFFF03F | ((v4 & 0x3F) << 6)) & 0xFFFFFFC0;
  return result;
}

// ALL OK, 4 function(s) have been successfully decompiled
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区