IDA, tar - win10自带的tar.exe可以使用的隐藏命令行参数
文章目录
- IDA, tar - win10自带的tar.exe可以使用的隐藏命令行参数
- 概述
- 笔记
- 做一个备份当前目录的工具 - backup_cur_dir.bat
- 查不到命令行参数的疑惑
- 先跟一下win10版的tar的 -a参数是否真的有效
- archive_xx函数哪里来的?
- 用命令行测试,也证明加 -a之后,压缩算法不一样了
- 备注
- END
IDA, tar - win10自带的tar.exe可以使用的隐藏命令行参数
概述
再看一个开源工程的编辑脚本(bat)
发现他居然用tar命令。
难道我的win10里面还有tar.exe?
C:\Users\chenx>where tar
C:\Windows\System32\tar.exe
C:\Users\chenx>tar --help
tar(bsdtar): manipulate archive files
First option must be a mode specifier:
-c Create -r Add/Replace -t List -u Update -x Extract
Common Options:
-b # Use # 512-byte records per I/O block
-f <filename> Location of archive (default \\.\tape0)
-v Verbose
-w Interactive
Create: tar -c [options] [<file> | <dir> | @<archive> | -C <dir> ]
<file>, <dir> add these items to archive
-z, -j, -J, --lzma Compress archive with gzip/bzip2/xz/lzma
--format {ustar|pax|cpio|shar} Select archive format
--exclude <pattern> Skip files that match pattern
-C <dir> Change to <dir> before processing remaining files
@<archive> Add entries from <archive> to output
List: tar -t [options] [<patterns>]
<patterns> If specified, list only entries that match
Extract: tar -x [options] [<patterns>]
<patterns> If specified, extract only entries that match
-k Keep (don't overwrite) existing files
-m Don't restore modification times
-O Write entries to stdout, don't restore to disk
-p Restore permissions (including ACLs, owner, file flags)
bsdtar 3.5.2 - libarchive 3.5.2 zlib/1.2.5.f-ipp
有点好奇,去看了一眼。
是win10自带的。
但是不清楚是装什么软件装上的这个tar.
先学一下这个脚本,看看怎么用tar来做一个文件压缩包
笔记
做一个备份当前目录的工具 - backup_cur_dir.bat
@rem @file backup_cur_dir.bat
@rem @brief 假设当前目录为 d:\\dir_a\\dir_b, 备份当前目录的内容到上级目录 d:\\dir_a\\dir_b.tar.gz
@rem @note tar.exe 是 win10自带的, 有微软签名
@echo off
pushd %~dp0
@rem echo %~dp0
@rem D:\3rd\game_prj\CNC_TS_and_RA2_Mission_Editor\scripts\test\
@rem %~dp0 尾巴上有路径符号\\
@rem tar命令的参数含义
@rem -c 建立
@rem -a 自动根据输出文件名来决定压缩算法
@rem -v 将操作详细显示出来
@rem -f 指定文件名
@rem 提取当前目录名(不含路径)
for %%i in ("%cd%") do set "folder_name=%%~nxi"
echo 备份当前目录内容..., 请稍候
@rem 压缩当前目录a所有内容到上级目录的a.tar.gz
tar -c -v -a -f "%~dp0..\\%folder_name%.tar.gz" *
@rem 判断是否备份成功过
set rc=%ERRORLEVEL%
if %rc% == 0 (
echo 备份当前目录内容 - 执行成功
) else (
echo 执行失败,错误码:%rc%
)
popd
查不到命令行参数的疑惑
我用到了的tar命令行参数如下:
tar -c -v -a -f
除了 -a , 其他参数都可以用tar --help查到。
那么这个-a参数是怎么来的,别人怎么知道这么用? 莫非linux的tar有这个参数?
那么这个-a参数在win10版的tar中真的有效么?
先跟一下win10版的tar的 -a参数是否真的有效
判断有效的标准,win10版的tar.exe确实处理了这个参数才算数。
如果是忽略了这个参数,那么就说明这个参数是无效的。
用IDA64(IDA8.3)载入C:\Windows\System32\tar.exe, 将tar.exe.idx存在自己有权限的普通目录
将断点设置在main的入口,直接用伪码调试。
设置调试器为windbg(本地已经安装了和win10配套的windbg,且已经配好了windbg本身的参数和IDA的windbg的调试参数)
因为是右击选择的tar.exe用IDA64载入,所以应用程序和输入文件已经是C:\Windows\System32\tar.exe
将工作路径设置为.bat脚本所在的路径
将命令行参数设置为可以手工运行正常的bat的固定参数。
点击OK,然后按F9跑起来,等待被断住。
断住之后,直接F5, 然后在伪码中F8。
else if ( p_cur_env_TAPE == 'a' )
{
// 确实用上了外部命令行参数中的 -a
prog_zip_opt |= 1u; // 这里位或上了新的内部选项
}
// ...
if ( v79 )
{
v92[0] = asc_7FF6E8D0A6B8[0];
v92[1] = v79;
v92[2] = asc_7FF6E8D0A6B8[2];
if ( !strchr("cru", (char)v21) )
lafe_errc(1);
}
// 这里用到的函数用到了外部给定的参数prog_zip_opt
archive_match_set_inclusion_recursion(matched, ((prog_zip_opt >> 7) & 1) == 0, v22, ui_p_cur_env_TAPE);
v50 = *(_BYTE *)p_env_TAPE[0] < 0x2Du;
if ( *(_BYTE *)p_env_TAPE[0] != 45 || (v50 = 0, *(_BYTE *)(p_env_TAPE[0] + 1)) )
archive_xx函数哪里来的?
看到tar.exe中用到了 archive_xx(), 如下
archive_match_set_inclusion_recursion
archive_match_include_date
archive_error_string
这些函数双击过去,好像是动态载入的。
查看引入表,确实有同名的函数
那么说明是调用的archiveint.dll来的。
看archiveint.dll, 也是MS家的。
去msdn上查 archive_match_set_inclusion_recursion,没有线索。
说明这是MS内部实现用的dll接口。
去github上查 archive_match_set_inclusion_recursion,找到一个开源库libarchive,下载了发布版 libarchive-3.7.7
在本地编译后,查文档和代码实现,基本上能确定,MS就是从这个开源工程上自己编译的,至于是不是改了,暂时不清楚。
但是这2个软件同源,如果改动不大,命令行参数基本是一样的。
查libarchive的文档,file:///D:/3rd/RE_prj/libarchive-3.7.7/doc/html/bsdtar.1.html
-a, --auto-compress
(c mode only) Use the archive suffix to decide a set of the format and the compressions. As a simple example,
tar -a -cf archive.tgz source.c source.h
creates a new archive with restricted pax format and gzip compression,
tar -a -cf archive.tar.bz2.uu source.c source.h
creates a new archive with restricted pax format and bzip2 compression and uuencode compression,
tar -a -cf archive.zip source.c source.h
creates a new archive with zip format,
tar -a -jcf archive.tgz source.c source.h
ignores the “-j” option, and creates a new archive with restricted pax format and gzip compression,
tar -a -jcf archive.xxx source.c source.h
if it is unknown suffix or no suffix, creates a new archive with restricted pax format and bzip2 compression.
可以在libarchive的文档中查到, -a选项确实是按照文件名的后缀,自动选择压缩算法。
用命令行测试,也证明加 -a之后,压缩算法不一样了
tar -c -v -a -f "%~dp0..\\%folder_name%.tar.gz" *
加了 -a, 用7z打开, 确实是.tar.gz, 压缩后的体积更小
tar -c -v -f "%~dp0..\\%folder_name%.tar.gz" *
不加 -a, 用7z打开,其实是一个.zip
备注
我现在就用到了 -c -v -a -f, 知道了 -a的参数用法说明,已经不想知道其他参数了。
但是以后如果想用更多的win10 tar.exe的参数,而win10版的tar对更多参数又没有说明,此时看libarchive的文档就有用了。