当前位置: 首页 > news >正文

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的文档就有用了。

END

相关文章:

  • QTreeWidget指定子节点弹出菜单
  • 【kubernetes】service
  • 第七课:Python反爬攻防战:Headers/IP代理与验证码
  • 【Gaussian Model】高斯分布模型
  • Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
  • 软件工程---构件
  • 最简单圆形进度条实现CSS+javascript,两端带圆弧
  • 《原型链的故事:JavaScript 对象模型的秘密》
  • Docker 部署 MongoDB 并持久化数据
  • Linux上位机开发(开篇)
  • golang从入门到做牛马:第二篇-go语言安装及开发环境配置
  • Nginx快速安装-Linux-CentOS7
  • 【A2DP】SBC 编解码器互操作性要求详解
  • 2025最新群智能优化算法:山羊优化算法(Goat Optimization Algorithm, GOA)求解23个经典函数测试集,MATLAB
  • BGP 基本配置实验
  • 在Windows 11的WSL中安装Kali Linux
  • Linux笔记---自定义shell
  • lvgl在ubuntu中模拟运行
  • 【商城实战(13)】购物车价格与数量的奥秘
  • 小程序 wxml 语法 —— 42 条件渲染
  • 怎么做便民信息网站/离我最近的广告公司
  • 做网站上的在线支付怎么做/免费外链网站
  • 龙华新区网站制作/拍照搜索百度识图
  • 网站建设和编程的区别/郑州网站优化外包
  • h5开发的app/企业站seo外包
  • wordpress mail函数/百度推广优化技巧