国产人妻人伦精品_欧美一区二区三区图_亚洲欧洲久久_日韩美女av在线免费观看

合肥生活安徽新聞合肥交通合肥房產(chǎn)生活服務(wù)合肥教育合肥招聘合肥旅游文化藝術(shù)合肥美食合肥地圖合肥社保合肥醫(yī)院企業(yè)服務(wù)合肥法律

程序File Recovery代寫(xiě)、代做C/C++編程設(shè)計(jì)
程序File Recovery代寫(xiě)、代做C/C++編程設(shè)計(jì)

時(shí)間:2024-11-19  來(lái)源:合肥網(wǎng)hfw.cc  作者:hfw.cc 我要糾錯(cuò)



Lab 4: File Recovery
Introduction
FAT has been around for nearly 50 years. Because of its simplicity, it is the
most widely compatible fi le system. Although recent computers have
adopted newer fi le systems, FAT** (and its variant, exFAT) is still dominant
in SD cards and USB fl ash drives due to its compatibility.
Have you ever accidentally deleted a fi le? Do you know that it could be
recovered?In this lab, you will build a FAT** fi le recovery tool called Need
You to Undelete my FILE, or nyufile for short.
Objectives
Through this lab, you will:
Learn the internals of the FAT** fi le system.
Learn how to access and recover fi les from a raw disk.
Get a better understanding of key fi le system concepts.
Be a better C programmer. Learn how to write code that manipulates
data at the byte level and understand the alignment issue.
Overview
In this lab, you will work on the data stored in the FAT** fi le system
directly, without the OS fi le system support. You will implement a tool that
recovers a deleted file specifi ed by the user.
For simplicity, you can assume thatthe deleted fi le is in the root directory.
Therefore, you don  t need to search subdirectories.
 Lab 4: File Recovery
 1/18
Working with a FAT** disk image
Before going through the details of this lab, let  s first create a FAT** disk
image. Follow these steps:
Step 1: create an empty file of a certain size
On Linux, /dev/zero is a special fi le that provides as many \0 as are read
from it. The dd command performs low-level copying of raw data.
Therefore, you can use it to generate an arbitrary-size fi le full of zeros.
For example, to create a 256KB empty fi le named fat**.disk :
[root@... cs202]# dd if=/dev/zero of=fat**.disk bs=256k count=1
Read man dd for its usage. You will use this fi le as the disk image.
Step 2: format the disk with FAT**
You can use the mkfs.fat command to create a FAT** fi le system. The most
basic usage is:
[root@... cs202]# mkfs.fat -F ** fat**.disk
(You can ignore the warning of not enough clusters.)
You can specify a variety of options. For example:
[root@... cs202]# mkfs.fat -F ** -f 2 -S 512 -s 1 -R ** fat**.disk
Here are the meanings of each option:
-F : type of FAT (FAT12, FAT16, or FAT**).
 Lab 4: File Recovery
 2/18
-f : number of FATs.
-S : number of bytes per sector.
-s : number of sectors per cluster.
-R : number of reserved sectors.
Step 3: verify the file system information
The fsck.fat command can check and repair FAT fi le systems. You can
invoke it with -v to see the FAT details. For example:
[root@... cs202]# fsck.fat -v fat**.disk
fsck.fat 4.1 (2017-0**24)
Checking we can access the last sector of the filesystem
Warning: Filesystem is FAT** according to fat_length and fat**_length fields,
 but has only **2 clusters, less than the required minimum of 65525.
 This may lead to problems on some systems.
Boot sector contents:
System ID "mkfs.fat"
Media byte 0xf8 (hard disk)
 512 bytes per logical sector
 512 bytes per cluster
 ** reserved sectors
First FAT starts at byte 16384 (sector **)
 2 FATs, ** bit entries
 2048 bytes per FAT (= 4 sectors)
Root directory start at cluster 2 (arbitrary size)
Data area starts at byte 20480 (sector 40)
 **2 data clusters (241664 bytes)
** sectors/track, 64 heads
 0 hidden sectors
 512 sectors total
Checking for unused clusters.
Checking free cluster summary.
fat**.disk: 0 files, 1/**2 clusters
You can see that there are 2 FATs, 512 bytes per sector, 512 bytes per
cluster, and ** reserved sectors. These numbers match our specifi ed
options in Step 2. You can try different options yourself.
 Lab 4: File Recovery
 3/18
Step 4: mount the file system
You can use the mount command to mount a fi le system to a mount point.
The mount point can be any empty directory. For example, you can create
one at /mnt/disk :
[root@... cs202]# mkdir /mnt/disk
Then, you can mount fat**.disk at that mount point:
[root@... cs202]# mount fat**.disk /mnt/disk
Step 5: play with the file system
After the fi le system is mounted, you can do whatever you like on it, such as
creating fi les, editing fi les, or deleting fi les. In order to avoid the hassle of
having long fi lenames in your directory entries, it is recommended that you
use only 8.3 fi lenames, which means:
The fi lename contains at most eight characters, followed optionally by a
. and at most three more characters.
The fi lename contains only uppercase letters, numbers, and the
following special characters: ! # $ % & ' ( ) - @ ^ _ ` { } ~ .
For example, you can create a fi le named HELLO.TXT :
[root@... cs202]# echo "Hello, world." > /mnt/disk/HELLO.TXT
[root@... cs202]# mkdir /mnt/disk/DIR
[root@... cs202]# touch /mnt/disk/EMPTY
For the purpose of this lab, after you write anything to the disk, make sure
to fl ush the fi le system cache using the sync command:
 Lab 4: File Recovery
 4/18
[root@... cs202]# sync
(Otherwise, if you create a fi le and immediately delete it, the fi le may not be
written to the disk at all and is unrecoverable.)
Step 6: unmount the file system
When you fi nish playing with the fi le system, you can unmount it:
[root@... cs202]# umount /mnt/disk
Step 7: examine the file system
You can examine the fi le system using the xxd command. You can specify a
range using the -s (starting offset) and -l (length) options.
For example, to examine the root directory:
[root@... cs202]# xxd -s 20480 -l 96 fat**.disk
00005000: 4845 4c4c 4f20 2020 5458 5420 0000 0000 HELLO TXT ....
00005010: 6e53 6e53 0000 000**e53 0300 0e00 0000 nSnS....nS......
00005020: 4449 5220 2020 2020 2020 2010 0000 0000 DIR .....
00005030: 6e53 6e53 0000 000**e53 0400 0000 0000 nSnS....nS......
00005040: 454d 5054 5920 2020 2020 2020 0000 0000 EMPTY ....
00005050: 6e53 6e53 0000 000**e53 0000 0000 0000 nSnS....nS......
(It  s normal that the bytes containing timestamps are different from the
example above.)
To examine the contents of HELLO.TXT :
[root@... cs202]# xxd -s 20992 -l 14 fat**.disk
0005200: 4865 6c6c 6f2c 2077 6f72 6c64 2e0a Hello, world..
 Lab 4: File Recovery
 5/18
Note that the offsets may vary depending on how the fi le system is
formatted.
Your tasks
Important: before running your nyufile program, please make sure that
your FAT** disk is unmounted.
Milestone 1: validate usage
There are several ways to invoke your nyufile program. Here is its usage:
[root@... cs202]# ./nyufile
Usage: ./nyufile disk <options>
 -i Print the file system information.
 -l List the root directory.
 -r filename [-s sha1] Recover a contiguous file.
 -R filename -s sha1 Recover a possibly non-contiguous file.
The fi rst argument is the fi lename of the disk image. After that, the options
can be one of the following:
-i
-l
-r filename
-r filename -s sha1
-R filename -s sha1
You need to check if the command-line arguments are valid. If not, your
program should print the above usage information verbatim and exit.
Milestone 2: print the file system information
If your nyufile program is invoked with option -i , it should print the
following information about the FAT** fi le system:
 Lab 4: File Recovery
 6/18
Number of FATs;
Number of bytes per sector;
Number of sectors per cluster;
Number of reserved sectors.
Your output should be in the following format:
[root@... cs202]# ./nyufile fat**.disk -i
Number of FATs = 2
Number of bytes per sector = 512
Number of sectors per cluster = 1
Number of reserved sectors = **
For all milestones, you can assume that nyufile is invoked while the disk is
unmounted.
Milestone 3: list the root directory
If your nyufile program is invoked with option -l , it should list all valid
entries in the root directory with the following information:
Filename. Similar to /bin/ls -p , if the entry is a directory, you should
append a / indicator.
File size if the entry is a fi le (not a directory).
Starting cluster if the entry is not an empty fi le.
You should also print the total number of entries at the end. Your output
should be in the following format:
[root@... cs202]# ./nyufile fat**.disk -l
HELLO.TXT (size = 14, starting cluster = 3)
DIR/ (starting cluster = 4)
EMPTY (size = 0)
Total number of entries = 3
Here are a few assumptions:
 Lab 4: File Recovery
 7/18
You should not list entries marked as deleted.
You don  t need to print the details inside subdirectories.
For all milestones, there will be no long fi lename (LFN) entries. (If you
have accidentally created LFN entries when you test your program,
don  t worry. You can just skip the LFN entries and print only the 8.3
fi
lename entries.)
Any fi le or directory, including the root directory, may span more than
one cluster.
There may be empty fi les.
Milestone 4: recover a small file
If your nyufile program is invoked with option -r filename , it should
recover the deleted file with the specifi ed name. The workfl ow is better
illustrated through an example:
 Lab 4: File Recovery
 8/18
[root@... cs202]# mount fat**.disk /mnt/disk
[root@... cs202]# ls -p /mnt/disk
DIR/ EMPTY HELLO.TXT
[root@... cs202]# cat /mnt/disk/HELLO.TXT
Hello, world.
[root@... cs202]# rm /mnt/disk/HELLO.TXT
rm: remove regular file '/mnt/disk/HELLO.TXT'? y
[root@... cs202]# ls -p /mnt/disk
DIR/ EMPTY
[root@... cs202]# umount /mnt/disk
[root@... cs202]# ./nyufile fat**.disk -l
DIR/ (starting cluster = 4)
EMPTY (size = 0)
Total number of entries = 2
[root@... cs202]# ./nyufile fat**.disk -r HELLO
HELLO: file not found
[root@... cs202]# ./nyufile fat**.disk -r HELLO.TXT
HELLO.TXT: successfully recovered
[root@... cs202]# ./nyufile fat**.disk -l
HELLO.TXT (size = 14, starting cluster = 3)
DIR/ (starting cluster = 4)
EMPTY (size = 0)
Total number of entries = 3
[root@... cs202]# mount fat**.disk /mnt/disk
[root@... cs202]# ls -p /mnt/disk
DIR/ EMPTY HELLO.TXT
[root@... cs202]# cat /mnt/disk/HELLO.TXT
Hello, world.
For all milestones, you only need to recover regular fi les (including empty
fi
les, but not directory fi les) in the root directory. When the fi le is
successfully recovered, your program should print
filename: successfully recovered (replace filename with the actual fi le
name).
For all milestones, you can assume that no other fi les or directories are
created or modifi ed since the deletion of the target fi le. However, multiple
fi
les may be deleted.
Besides, for all milestones, you don  t need to update the FSINFO structure
because most operating systems don  t care about it.
 Lab 4: File Recovery
 9/18
Here are a few assumptions specifi cally for Milestone 4:
The size of the deleted file is no more than the size of a cluster.
At most one deleted directory entry matches the given fi lename. If no
such entry exists, your program should print filename: file not found
(replace filename with the actual fi le name).
Milestone 5: recover a large contiguously-allocated file
Now, you will recover a fi le that is larger than one cluster. Nevertheless, for
Milestone 5, you can assume that such a fi le is allocated contiguously. You
can continue to assume that at most one deleted directory entry matches
the given fi lename. If no such entry exists, your program should print
filename: file not found (replace filename with the actual fi le name).
Milestone 6: detect ambiguous file recovery requests
In Milestones 4 and 5, you assumed that at most one deleted directory
entry matches the given fi lename. However, multiple fi les whose names
differ only in the fi rst character would end up having the same name when
deleted. Therefore, you may encounter more than one deleted directory
entry matching the given fi lename. When that happens, your program
should print filename: multiple candidates found (replace filename with the
actual fi le name) and abort.
This scenario is illustrated in the following example:
[root@... cs202]# mount fat**.disk /mnt/disk
[root@... cs202]# echo "My last name is Tang." > /mnt/disk/TANG.TXT
[root@... cs202]# echo "My first name is Yang." > /mnt/disk/YANG.TXT
[root@... cs202]# sync
[root@... cs202]# rm /mnt/disk/TANG.TXT /mnt/disk/YANG.TXT
rm: remove regular file '/mnt/disk/TANG.TXT'? y
rm: remove regular file '/mnt/disk/YANG.TXT'? y
[root@... cs202]# umount /mnt/disk
[root@... cs202]# ./nyufile fat**.disk -r TANG.TXT
TANG.TXT: multiple candidates found
 Lab 4: File Recovery
 10/18
Milestone 7: recover a contiguously-allocated file with
SHA-1 hash
To solve the aforementioned ambiguity, the user can provide a SHA-1 hash
via command-line option -s sha1 to help identify which deleted directory
entry should be the target fi le.
In short, a SHA-1 hash is a 160-bit fi ngerprint of a fi le, often represented as
40 hexadecimal digits. For the purpose of this lab, you can assume that
identical fi les always have the same SHA-1 hash, and different fi les always
have vastly different SHA-1 hashes. Therefore, even if multiple candidates
are found during recovery, at most one will match the given SHA-1 hash.
This scenario is illustrated in the following example:
[root@... cs202]# ./nyufile fat**.disk -r TANG.TXT -s c91761a2cc1562d36585614c
TANG.TXT: successfully recovered with SHA-1
[root@... cs202]# ./nyufile fat**.disk -l
HELLO.TXT (size = 14, starting cluster = 3)
DIR/ (starting cluster = 4)
EMPTY (size = 0)
TANG.TXT (size = 22, starting cluster = 5)
Total number of entries = 4
When the fi le is successfully recovered with SHA-1, your program should
print filename: successfully recovered with SHA-1 (replace filename with the
actual fi le name).
Note that you can use the sha1sum command to compute the SHA-1 hash of
a fi le:
[root@... cs202]# sha1sum /mnt/disk/TANG.TXT
c91761a2cc1562d36585614c8c680ecf5712e875 /mnt/disk/TANG.TXT
 Lab 4: File Recovery
 11/18
Also note that it is possible that the fi le is empty or occupies only one
cluster. The SHA-1 hash for an empty fi le is
da39a3ee5e6b4b0d**55bfef956018**afd80709 .
If no such fi le matches the given SHA-1 hash, your program should print
filename: file not found (replace filename with the actual fi le name). For
example:
[root@... cs202]# ./nyufile fat**.disk -r TANG.TXT -s 0123456789abcdef01234567
TANG.TXT: file not found
The OpenSSL library provides a function SHA1() , which computes the SHA-
1 hash of d[0...n-1] and stores the result in md[0...SHA_DIGEST_LENGTH-1] :
#include <openssl/sha.h>
#define SHA_DIGEST_LENGTH 20
unsigned char *SHA1(const unsigned char *d, size_t n, unsigned char *md);
You need to add the linker option -lcrypto to link with the OpenSSL library.
Milestone 8: recover a non-contiguously allocated file
Finally, the clusters of a fi le are no longer assumed to be contiguous. You
have to try every permutation of unallocated clusters on the fi le system in
order to fi nd the one that matches the SHA-1 hash.
The command-line option is -R filename -s sha1 . The SHA-1 hash must be
given.
Note that it is possible that the fi le is empty or occupies only one cluster. If
so, -R behaves the same as -r , as described in Milestone 7.
 Lab 4: File Recovery
 12/18
For Milestone 8, you can assume that the entire fi le is within the fi rst 20
clusters, and the fi le content occupies no more than 5 clusters, so a brute?force search is feasible.
If you cannot fi nd a fi le that matches the given SHA-1 hash, your program
should print filename: file not found (replace filename with the actual fi le
name).
FAT** data structures
For your convenience, here are some data structures that you can copy and
paste. Please refer to the lecture slides and FAT: General Overview of On?Disk Format for details on the FAT** fi le system layout.
 Lab 4: File Recovery
 13/18
Boot sector
#pragma pack(push,1)
typedef struct BootEntry {
 unsigned char BS_jmpBoot[3]; // Assembly instruction to jump to boot co
 unsigned char BS_OEMName[8]; // OEM Name in ASCII
 unsigned short BPB_BytsPerSec; // Bytes per sector. Allowed values includ
 unsigned char BPB_SecPerClus; // Sectors per cluster (data unit). Allowe
 unsigned short BPB_RsvdSecCnt; // Size in sectors of the reserved area
 unsigned char BPB_NumFATs; // Number of FATs
 unsigned short BPB_RootEntCnt; // Maximum number of files in the root dir
 unsigned short BPB_TotSec16; // 16-bit value of number of sectors in fi
 unsigned char BPB_Media; // Media type
 unsigned short BPB_FATSz16; // 16-bit size in sectors of each FAT for 
 unsigned short BPB_SecPerTrk; // Sectors per track of storage device
 unsigned short BPB_NumHeads; // Number of heads in storage device
 unsigned int BPB_HiddSec; // Number of sectors before the start of p
 unsigned int BPB_TotSec**; // **-bit value of number of sectors in fi
 unsigned int BPB_FATSz**; // **-bit size in sectors of one FAT
 unsigned short BPB_ExtFlags; // A flag for FAT
 unsigned short BPB_FSVer; // The major and minor version number
 unsigned int BPB_RootClus; // Cluster where the root directory can be
 unsigned short BPB_FSInfo; // Sector where FSINFO structure can be fo
 unsigned short BPB_BkBootSec; // Sector where backup copy of boot sector
 unsigned char BPB_Reserved[12]; // Reserved
 unsigned char BS_DrvNum; // BIOS INT13h drive number
 unsigned char BS_Reserved1; // Not used
 unsigned char BS_BootSig; // Extended boot signature to identify if 
 unsigned int BS_VolID; // Volume serial number
 unsigned char BS_VolLab[11]; // Volume label in ASCII. User defines whe
 unsigned char BS_FilSysType[8]; // File system type label in ASCII
} BootEntry;
#pragma pack(pop)
 Lab 4: File Recovery
 14/18
Directory entry
#pragma pack(push,1)
typedef struct DirEntry {
 unsigned char DIR_Name[11]; // File name
 unsigned char DIR_Attr; // File attributes
 unsigned char DIR_NTRes; // Reserved
 unsigned char DIR_CrtTimeTenth; // Created time (tenths of second)
 unsigned short DIR_CrtTime; // Created time (hours, minutes, seconds)
 unsigned short DIR_CrtDate; // Created day
 unsigned short DIR_LstAccDate; // Accessed day
 unsigned short DIR_FstClusHI; // High 2 bytes of the first cluster addre
 unsigned short DIR_WrtTime; // Written time (hours, minutes, seconds
 unsigned short DIR_WrtDate; // Written day
 unsigned short DIR_FstClusLO; // Low 2 bytes of the first cluster addres
 unsigned int DIR_FileSize; // File size in bytes. (0 for directories)
} DirEntry;
#pragma pack(pop)
Compilation
We will grade your submission in an x86_64 Rocky Linux 8 container on
Gradescope. We will compile your program using gcc 12.1.1 with the C17
standard and GNU extensions.
You must provide a Makefile , and by running make , it should generate an
executable fi le named nyufile in the current working directory. Note that
you need to add LDFLAGS=-lcrypto to your Makefile . (Refer to Lab 1 for an
example of the Makefile .)
Testing
To get started with testing, you can download a sample FAT** disk and
expand it with the following command:
[root@... cs202]# unxz fat**.disk.xz
 Lab 4: File Recovery
 15/18
There are a few fi les on this disk:
HELLO.TXT  C a small text fi le.
DIR  C an empty directory.
EMPTY.TXT  C an empty fi le.
CONT.TXT  C a large contiguously-allocated file.
NON_CONT.TXT  C a large non-contiguously allocated file.
You should make your own test cases and test your program thoroughly.
Make sure to test your program with disks formatted with different
parameters.
The autograder
We are providing a sample autograder with a few test cases. Please extract
them in your Docker container and follow the instructions in the README
fi
le. (Refer to Lab 1 for how to extract a .tar.xz fi le.)
Note that the test cases are not exhaustive. The numbered test cases on
Gradescope are the same as those in the sample autograder, while the
lettered test cases are   hidden   test cases that will not be disclosed. If your
program passed the former but failed the latter, please double-check if it
can handle all corner cases correctly. Do not try to hack or exploit the
autograder.
Submission
You must submit a .zip archive containing all fi les needed to compile
nyufile in the root of the archive. You can create the archive fi le with the
following command in the Docker container:
$ zip nyufile.zip Makefile *.h *.c
Note that other fi le formats (e.g., rar ) will not be accepted.
 Lab 4: File Recovery
 16/18
You need to upload the .zip archive to Gradescope. If you need to
acknowledge any infl uences per our academic integrity policy, write them
as comments in your source code.
Rubric
The total of this lab is 100 points, mapped to 15% of your fi nal grade of this
course.
Milestone 1: validate usage. (40 points)
Milestone 2: print the fi le system information. (5 points)
Milestone 3: list the root directory. (10 points)
Milestone 4: recover a small fi le. (15 points)
Milestone 5: recover a large contiguously-allocated file. (10 points)
Milestone 6: detect ambiguous fi le recovery requests. (5 points)
Milestone 7a: recover a small fi le with SHA-1 hash. (5 points)
Milestone 7b: recover a large contiguously-allocated file with SHA-1
hash. (5 points)
Milestone 8: recover a non-contiguously allocated file. (5 points)
Tips
Don  t procrastinate
This lab requires signifi cant programming effort. Therefore, start as early
as possible! Don  t wait until the last week.
Some general hints
Before you start, use xxd to examine the disk image to get an idea of
the FAT** layout. Keep a backup of the hexdump.
After you create a fi le or delete a fi le, use xxd to compare the hexdump
of the disk image against your backup to see what has changed.
You can also use xxd -r to convert a hexdump back to a binary fi le. You
can use it to   hack   a disk image. In this way, you can try recovering a fi le
 Lab 4: File Recovery
 17/18
manually before writing a program to do it. You can also create a non?contiguously allocated file artifi cially for testing in this way.
Always umount before using xxd or running your nyufile program.
When updating FAT, remember to update all FATs.
Using mmap() to access the disk image is more convenient than read()
or fread() . You may need to open the disk image with O_RDWR and map
it with PROT_READ | PROT_WRITE and MAP_SHARED in order to update the
underlying fi le. Once you have mapped your disk image, you can cast any
address to the FAT** data structure type, such as
(DirEntry *)(mapped_address + 0x5000) . You can also cast the FAT to
int[] for easy access.
The milestones have diminishing returns. Easier milestones are worth
more points. Make sure you get them right before trying to tackle the
harder ones.
Thislab has borrowed some ideasfrom Dr. T. Y. Wong.
 Lab 4: File Recovery
 18/18

請(qǐng)加QQ:99515681  郵箱:99515681@qq.com   WX:codinghelp


 

掃一掃在手機(jī)打開(kāi)當(dāng)前頁(yè)
  • 上一篇:COMP229代做、Java語(yǔ)言程序代寫(xiě)
  • 下一篇:代做CMPT 477、Java/Python程序代寫(xiě)
  • 無(wú)相關(guān)信息
    合肥生活資訊

    合肥圖文信息
    流體仿真外包多少錢(qián)_專(zhuān)業(yè)CFD分析代做_友商科技CAE仿真
    流體仿真外包多少錢(qián)_專(zhuān)業(yè)CFD分析代做_友商科
    CAE仿真分析代做公司 CFD流體仿真服務(wù) 管路流場(chǎng)仿真外包
    CAE仿真分析代做公司 CFD流體仿真服務(wù) 管路
    流體CFD仿真分析_代做咨詢(xún)服務(wù)_Fluent 仿真技術(shù)服務(wù)
    流體CFD仿真分析_代做咨詢(xún)服務(wù)_Fluent 仿真
    結(jié)構(gòu)仿真分析服務(wù)_CAE代做咨詢(xún)外包_剛強(qiáng)度疲勞振動(dòng)
    結(jié)構(gòu)仿真分析服務(wù)_CAE代做咨詢(xún)外包_剛強(qiáng)度疲
    流體cfd仿真分析服務(wù) 7類(lèi)仿真分析代做服務(wù)40個(gè)行業(yè)
    流體cfd仿真分析服務(wù) 7類(lèi)仿真分析代做服務(wù)4
    超全面的拼多多電商運(yùn)營(yíng)技巧,多多開(kāi)團(tuán)助手,多多出評(píng)軟件徽y1698861
    超全面的拼多多電商運(yùn)營(yíng)技巧,多多開(kāi)團(tuán)助手
    CAE有限元仿真分析團(tuán)隊(duì),2026仿真代做咨詢(xún)服務(wù)平臺(tái)
    CAE有限元仿真分析團(tuán)隊(duì),2026仿真代做咨詢(xún)服
    釘釘簽到打卡位置修改神器,2026怎么修改定位在范圍內(nèi)
    釘釘簽到打卡位置修改神器,2026怎么修改定
  • 短信驗(yàn)證碼 豆包網(wǎng)頁(yè)版入口 破天一劍 目錄網(wǎng) 排行網(wǎng)

    關(guān)于我們 | 打賞支持 | 廣告服務(wù) | 聯(lián)系我們 | 網(wǎng)站地圖 | 免責(zé)聲明 | 幫助中心 | 友情鏈接 |

    Copyright © 2025 hfw.cc Inc. All Rights Reserved. 合肥網(wǎng) 版權(quán)所有
    ICP備06013414號(hào)-3 公安備 42010502001045

    国产人妻人伦精品_欧美一区二区三区图_亚洲欧洲久久_日韩美女av在线免费观看
    国产精品9999久久久久仙踪林| 97色在线观看免费视频| 国产男女激情视频| 精品国产美女在线| 日韩中文字幕组| 7777精品久久久大香线蕉小说| 久久久久久18| 国产日韩av在线| 国产精品久久久91| 黄色a级片免费| 国产精品入口尤物| 加勒比海盗1在线观看免费国语版| 日韩在线视频播放| 欧洲黄色一级视频| 国产成人精品久久| 日本午夜一区二区三区| 国产不卡av在线| 日韩av高清不卡| 国产av天堂无码一区二区三区| 欧美一级在线看| 久久久久久久久久av| 日韩欧美三级一区二区| 九一国产精品视频| 欧美综合一区第一页| 国产精品视频在线免费观看| 国内一区二区三区在线视频| 久久五月情影视| 成人精品久久久| 亚洲精品免费av| 国产精品91视频| 午夜精品一区二区在线观看的| 久久综合毛片| 人偷久久久久久久偷女厕| 色妞欧美日韩在线| 免费一级特黄毛片| 国产99久久精品一区二区 夜夜躁日日躁 | 久久精彩免费视频| 蜜桃久久精品乱码一区二区| 久久99精品久久久久久琪琪| 成人毛片网站| 日本一区二区三区视频免费看 | 国产精品精品视频一区二区三区 | 国产又大又长又粗又黄| 在线视频不卡国产| 国产高清免费在线| 狠狠色综合一区二区| 国产精品国语对白| 97精品国产97久久久久久| 欧美一区二区高清在线观看| 久久精品久久久久久国产 免费| 欧美日韩黄色一级片| 精品国产一区二区三区日日嗨| 99精品视频网站| 欧美一区二区综合| 中文字幕99| 色噜噜狠狠色综合网图区| 国产综合香蕉五月婷在线| 亚洲一区二区免费| 日韩中文字幕在线免费观看| 国产日韩欧美一二三区| 天天操天天干天天玩| 国产suv精品一区二区三区88区| 狠狠色噜噜狠狠狠狠色吗综合| 中文精品无码中文字幕无码专区| 久久久久久久久久久人体| 国产日韩精品在线观看| 欧美一级免费在线观看| 国产精品成人一区二区三区| 久久影院理伦片| 精品午夜一区二区三区| 日韩中文在线字幕| 麻豆成人在线看| 久久精品网站视频| 国产噜噜噜噜噜久久久久久久久| 欧美中文字幕在线播放| 曰韩不卡视频| 波霸ol色综合久久| 国产精品999视频| 国产美女精品免费电影| 欧美在线视频一区二区三区| 中文视频一区视频二区视频三区| www.欧美三级电影.com| 97久久精品国产| 韩国一区二区av| 日产精品久久久一区二区福利| 欧美日韩国产999| 久久精品国产一区二区三区 | 欧美极品第一页| 国产精品视频一区二区三区四区五区 | 日韩在线观看免费网站| 91老司机精品视频| 国产日韩视频在线观看| 欧美专区中文字幕| 日本国产中文字幕| 亚洲国产日韩欧美| 亚洲综合最新在线| 国产精品无码专区av在线播放| 99久热re在线精品视频| 国产一级不卡毛片| 国自在线精品视频| 欧美在线视频一区二区三区| 午夜精品久久久久久久无码| 亚洲综合中文字幕在线观看| 九九热这里只有精品免费看| 欧美成年人网站| 国产精品入口日韩视频大尺度| 色婷婷综合久久久久| 久久99精品久久久久久三级| 久久偷看各类wc女厕嘘嘘偷窃| 草莓视频一区| 国产精品永久免费视频| 国产日韩专区在线| 精品视频导航| 精品视频在线观看一区| 欧美日韩一区在线观看视频| 欧美日韩国产精品一区二区| 日韩精品视频在线观看视频| 日韩不卡一二区| 日韩区国产区| 日韩免费在线观看av| 色中色综合成人| 日韩久久不卡| 欧美视频第三页| 欧美在线视频网| 欧美精品国产精品久久久| 熟女视频一区二区三区| 午夜精品美女久久久久av福利| 亚洲精品欧美精品| 亚洲最大福利网| 天天夜碰日日摸日日澡性色av| 无码中文字幕色专区| 视频一区二区在线观看| 亚洲成色www久久网站| 亚洲一区制服诱惑| 天堂资源在线亚洲视频| 日本三级中国三级99人妇网站| 日韩一级免费在线观看| 欧美老熟妇喷水| 国产一区在线观| 国产精品一区而去| 91精品国产网站| 91九色精品视频| 91精品国产91久久久久| 国产高清在线不卡| 国产成人生活片| 欧美成人精品一区| 一卡二卡三卡视频| 日韩在线第三页| 欧美日韩不卡在线视频| 国产系列第一页| 97国产在线播放| 久久久久久久久久久免费视频| 久热精品视频在线| 欧美日韩高清在线观看| 天天夜碰日日摸日日澡性色av| 日韩av综合在线观看| 日韩欧美亚洲区| 韩国v欧美v日本v亚洲| 高清欧美精品xxxxx| 91国在线精品国内播放| 日韩在线视频二区| 久久成人人人人精品欧| 懂色一区二区三区av片| 欧美综合在线播放| 成人久久18免费网站图片| 久久久久久久久久码影片| 国产av国片精品| 日本不卡视频在线播放| 国产男女猛烈无遮挡91| 色噜噜久久综合伊人一本| 伊人天天久久大香线蕉av色| 少妇熟女一区二区| 国产在线xxxx| 久久久久久久久网站| 欧美激情xxxxx| 欧美亚州在线观看| …久久精品99久久香蕉国产| 国产精品成人免费视频| 日韩免费中文字幕| 97成人在线观看视频| 国产精品成人久久电影| 日本中文字幕不卡免费| 国产精品专区h在线观看| 国产成人精品亚洲精品| 天天好比中文综合网| 国产深夜男女无套内射| www.久久色.com| 亚洲欧洲一区二区| 国产午夜精品视频一区二区三区| 日韩日本欧美亚洲| 婷婷五月色综合| 超碰97人人人人人蜜桃| 久久夜色撩人精品| 欧美日韩一区二区视频在线| 久久久av水蜜桃| 亚洲一二三区在线| 国产人妻777人伦精品hd| 国产成人生活片| 青青久久av北条麻妃黑人| 久久久在线视频|