Linux 暴力破解rar密码

制作一个有简单密码的rar。简单密码表49行,正确密码在最后一行。暴力破解代码如下。
rar密码吗测试使用命令调用rarlinux方式测试,http://www.simonzhang.net/?p=2980

python部分

#!/bin/env python
# -*- coding:utf-8 -*-
# Date:        2016-07-29
# Author:      simonzhang
# web:         www.simonzhang.net
# Email:       simon-zzm@163.com
### END INIT INFO
import os
import sys
import commands


def main(rarName, passwd):
    try:
        passFile = open(passwd, 'rb').readlines()
    except:
        print "read password error"
    #
    num = 0
    for one in passFile:
        num += 1
        if num%1000 == 0:
            print "test %s" % num
        if one[-1] == '\n':
            one = one[:-1]
        getContext = commands.getoutput('rar t %s -p"%s"' % (rarName, one))
        if getContext.find("OK") > -1:
            print "%s pass is %s" % (rarName, one)
            exit()

if __name__ == "__main__":
    try:
        if sys.argv[1].split('.')[1] == "rar":
            rarName = sys.argv[1]
        else:
            print "rar name error"
            print "python devRAR.py xx.rar pass.txt"
            exit()
        if sys.argv[2].split('.')[1] == "txt":
            passwd = sys.argv[2]
        else:
            print "password error"
            print "python devRAR.py xx.rar pass.txt"
            exit()
    except:
        print "python devRAR.py xx.rar pass.txt"
        exit()
    main(rarName, passwd)

golang部分

/*
# Date:        2016-07-29
# Author:      simonzhang
# web:         www.simonzhang.net
# Email:       simon-zzm@163.com
*/
package main

import (
   "os"
   "io"
   "fmt"
   "strings"
   "bufio"
   "os/exec"
   "runtime"
)

func checkRAR(passwd string) {
    var tmpPass string = "-p"+passwd
    cmd := exec.Command("rar", "t", "tt.rar", tmpPass)
    status := cmd.Run()
    if (status == nil){ 
        fmt.Println("tt.rar pass is ", passwd)
        os.Exit(1)
    }
}

func start(c chan string){
    // 读密码文件
    passFile := "passwd.txt"
    pf,err := os.Open(passFile)
    if err != nil {
        fmt.Println(passFile,err)
        os.Exit(1)
    }
    defer pf.Close()
    //
    rd := bufio.NewReader(pf)
    for {
        //以'\n'为结束符读入一行
        line, err := rd.ReadString('\n')
        if err != nil || io.EOF == err {
            break
        }
        tmpPass := strings.Replace(line, "\n", "", -1)
        /* 如果是Linux上编辑的密码文件下步不需要。
           如果密码文本是在windows下编辑的可能会带^M
           不可见字符。应用vim -v 或者cat -A 可以看到。
        */
        tmpPass = strings.Replace(tmpPass, "\r", "", -1)
        checkRAR(tmpPass) 
    } 
}

func main() {
    //计算cpu核数
    var loopnum int = runtime.NumCPU()
    //设置协程cpu核数
    runtime.GOMAXPROCS(loopnum)
    c := make(chan string)
    for i:=0; i<=loopnum; i++ {
        go start(c)
    }
    <- c
    fmt.Println("not find password")
}

源码部分

# time python decRAR.py tt.rar passwd.txt
tt.rar pass is 123

real 0m2.861s
user 0m2.535s
sys 0m0.279s

# time ./decRAR
tt.rar pass is 123

real 0m5.736s
user 0m5.151s
sys 0m0.452s

参数输入部分还没有开发,如果全部实现,golang应该超出python代码一倍多。
python运行时使用cpu 2%,可以改为多线程,这样开30个线程效果应该不错。
golang速度慢稍后再做性能分析,看看具体问题。

发表评论

电子邮件地址不会被公开。 必填项已用*标注