如何将Windows C ++程序的输出重定向到另一个可执行文件?

时间:2013-08-20 14:38:56

标签: c++ brute-force

我正在使用brute force attack针对受密码保护的C++文件试用rar。我已经能够生成所有可能的“密码”。我只是不确定如何使用我的程序中生成的每个组合自动尝试提取存档。我正在Windows,我正在尝试使用WinRar

2 个答案:

答案 0 :(得分:3)

可以轻而易举地做一些事情:

 int main (int argc, char** argv)
 {
      for (;;) {
         /* do something */
         cout << clever_password << "\0";
      }
 }

...然后在shell中,只需:

 your-clever-password-guesser | \
     sed -e 's,'\'','\''"'\''"'\'',g' | \
     xargs -0 -n1 -r -t -I {} -- unrar e 'p{}' some-file.rar

打破这一点:

  • 使用终止'\0'字符打印​​每个密码猜测。这允许密码(可能)包含空格和制表符之类的东西,否则可能会在shell中“搞乱”。
  • 请求流编辑器sed保护您免受撇号'的攻击。每个'必须编码为'\''(反斜杠's)或'"'"'(引用 - 引用 - 引用)的序列,以安全地通过外壳。 s///g模式将每个'替换为'"'"',但它本身传递给sed的撇号将写为'\''。 (我混合了转义'的样式,以便我更容易区分sed的撇号转义和sed添加到密码流中的撇号转义。)相反,可以在C ++程序中打印时更改字符串。
  • 使用每个密码调用xargs运行unrar,其中包含以下选项:
    • 每个密码都由\0-0
    • 分隔
    • 一次只能使用一个(-n1
    • 如果没有任何事情可以运行(-r) - 例如如果您的程序根本没有打印出任何可能的密码。
    • 显示将要运行的命令行(-t) - 这可让您监控屏幕上飞过的猜测
    • 用密码代替传统的符号{}-I {}
    • 然后,运行--
    • 后面的命令
    • 从RAR文件(unrar e ...)
    • 中提取
    • 使用密码替换{}中的'p{}';这里'可以防止密码中的空格和内容
    • 然后,文件名为un-RAR

如果您想尝试并行运行多个unrar个实例,您还可以将-P4插入xargs调用(例如... -I {} -P4 -- ...)以运行4一次一个实例;调整此值,直到您的机器过载以获得任何好处。 (由于这可能是光盘I / O绑定,您可能需要确保在启动它之前将RAR文件复制到/tmp/run之类的RAM文件系统中,如果它是合理的大小,那么你不是在等待光盘I / O那么多,但操作系统可能会在几十轮之后缓存文件,因此在长期运行中可能实际上没有多大帮助。)

这是一种蛮力的方式,但不需要像使用fork/exec/wait启动unrar进程或使用{{1启用库(这可能会使启动可执行文件的速度显着提高数百或数千次)

<强> PS

之后我意识到,您可能正在寻找与实际rar计划的互动。以上内容对此没有任何帮助;但它可以让您重复运行命令行WinRAR™

此外,如果您使用的是Windows系统,则需要安装一些标准的shell实用程序 - 兼容POSIX的Bourne shell,如BASH,unrarsed - 可能意味着需要像Cygwin这样的东西。但是,我对Windows系统没有任何实际经验,无法就如何做到这一点给出好的建议。

答案 1 :(得分:1)

Winrar有api,虽然它只支持解压缩。这就像从api的一个函数调用一样简单,试图解压缩文件。点击链接: http://www.rarlab.com/rar_add.htm

祝你好运!