본문 바로가기

개발/개발한프로그램

암호가 걸려 있는 압축 파일 크랙커

압축 파일에 암호가 걸려 있는 경우 암호를 빠르게 풀어주는 프로그램을 필요로 한다.

하지만 시중(구글 검색으로 나오는 코드) 에 있는 파이썬 코드는 느리다!!


따라서 수정이 필요했고 다음과 같은 프로그램을 만들었다.


사용 방법은 

ZipCrackerUsingDigit.exe -f 파일경로 -l 암호의길이

ex) ZipCrackerUsingDigit.exe -f a.zip -l 5

-> 이럴 경우 5자리의 암호가 걸려 있고 brute 공격으로 암호를 찾는다.



경고) 

1. 이 프로그램은 압축 파일안에 파일이 2개이상 있을 때 정확한 암호가 반환 됩니다.

2. 암호의 길이가 6자리 이상부터는..쫌 오래걸립니닫.

3. 암호가 숫자여야만 합니다.



ZipCracker.zip






느린코드

import itertools

import argparse

import zipfile

import string

import sys


def confirmPassword(zFile, password):

    try:        

        zFile.extractall(pwd=str(password))

        return True

    except:

        print password

        return False


def main_loop(filename, length):

    cracked = False

    zFile = zipfile.ZipFile(filename)

    for password in itertools.imap(''.join, itertools.product(string.digits, repeat=length)):

        cracked = confirmPassword(zFile, password)

        if cracked:

            print ('password is:', password)

        break


    if not cracked:

        print 'can not find password'



def main():

    main_loop("파일경로", 4) #4 : 암호길이

    return



if __name__ == '__main__':

    main()





수정한 코드


import itertools

import argparse

import zipfile

import string

import sys


def confirmPassword(filename, password):

    try:

        zFile = zipfile.ZipFile(filename)

        for name in zFile.namelist():

            zFile.open(name, pwd=password)


        return True

    except:

        print password

        return False



def main_loop(filename, length):

    print '[*] JH zip cracker (only digit) '

    print '[*] Zipfile: %s; password length: %s' % (filename, length)

    cracked = False

    for combo in itertools.imap(''.join, itertools.product(string.digits, repeat=length)):

        cracked = confirmPassword(filename, combo)

        if cracked:

            print (

             'password is:', combo)

            break


    if not cracked:

        print 'can not find password'



def main():

    parser = argparse.ArgumentParser(usage='ZipCrackerUsingDigit.exe -f <zipfile> -l <password length>')

    parser.add_argument('-f', '--zipfile', help='specify zip file', type=str)

    parser.add_argument('-l', '--length', type=int, help='password length', default=5)

    args = parser.parse_args()

    if args.zipfile == None:

        print parser.usage

        sys.exit(0)

    main_loop(args.zipfile, args.length)

    return



if __name__ == '__main__':

    main()