制作一个有简单密码的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速度慢稍后再做性能分析,看看具体问题。
发表评论