From b11e2cd6b4725de263c12203ac07a19a83e32e2e Mon Sep 17 00:00:00 2001
From: SoberBluee <49061190+SoberBluee@users.noreply.github.com>
Date: Fri, 25 Feb 2022 14:08:13 +0000
Subject: [PATCH] rainbowtable and multiple hash

rainbow table using rainbowcrack implemented
Multiple hash crack implemented
---
 1693a7fa5b5993d87647a2d92c709c5c.png          | Bin 0 -> 33024 bytes
 AppData/result10.txt                          |   2 +
 AppData/result11.txt                          |   2 +
 AppData/result12.txt                          |   2 +
 AppData/result4.txt                           |   2 +
 AppData/result5.txt                           |   2 +
 AppData/result6.txt                           |   2 +
 AppData/result7.txt                           |   2 +
 AppData/result8.txt                           |   2 +
 AppData/result9.txt                           |   2 +
 AttackAlgorithms/BruteForceAttackAlgorithm.py |   6 +-
 .../BruteForceAttackAlgorithm.cpython-38.pyc  | Bin 3278 -> 3154 bytes
 .../DictionaryAttackAlgorithm.cpython-38.pyc  | Bin 2537 -> 2539 bytes
 .../HybridAttackAlgorithm.cpython-38.pyc      | Bin 3251 -> 3241 bytes
 .../RulebasedAttackAlgorithm.cpython-38.pyc   | Bin 3308 -> 3230 bytes
 GUIDesign.py                                  | 197 ++++++++++++++----
 Rainbowcrack/start.bat                        |   2 +
 test_data.txt                                 |   2 +
 18 files changed, 176 insertions(+), 49 deletions(-)
 create mode 100644 1693a7fa5b5993d87647a2d92c709c5c.png
 create mode 100644 AppData/result10.txt
 create mode 100644 AppData/result11.txt
 create mode 100644 AppData/result12.txt
 create mode 100644 AppData/result4.txt
 create mode 100644 AppData/result5.txt
 create mode 100644 AppData/result6.txt
 create mode 100644 AppData/result7.txt
 create mode 100644 AppData/result8.txt
 create mode 100644 AppData/result9.txt
 create mode 100644 Rainbowcrack/start.bat
 create mode 100644 test_data.txt

diff --git a/1693a7fa5b5993d87647a2d92c709c5c.png b/1693a7fa5b5993d87647a2d92c709c5c.png
new file mode 100644
index 0000000000000000000000000000000000000000..946ccd5779dda40c4b786bb277c8faadf4eb409d
GIT binary patch
literal 33024
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
Uk9Hpq19dVzUHx3vIVCg!017<?h5!Hn

literal 0
HcmV?d00001

diff --git a/AppData/result10.txt b/AppData/result10.txt
new file mode 100644
index 0000000..fb99623
--- /dev/null
+++ b/AppData/result10.txt
@@ -0,0 +1,2 @@
+1111
+0.0100
\ No newline at end of file
diff --git a/AppData/result11.txt b/AppData/result11.txt
new file mode 100644
index 0000000..3b2f75a
--- /dev/null
+++ b/AppData/result11.txt
@@ -0,0 +1,2 @@
+123
+0.0020
\ No newline at end of file
diff --git a/AppData/result12.txt b/AppData/result12.txt
new file mode 100644
index 0000000..fb99623
--- /dev/null
+++ b/AppData/result12.txt
@@ -0,0 +1,2 @@
+1111
+0.0100
\ No newline at end of file
diff --git a/AppData/result4.txt b/AppData/result4.txt
new file mode 100644
index 0000000..e08b91e
--- /dev/null
+++ b/AppData/result4.txt
@@ -0,0 +1,2 @@
+123
+0.5355
\ No newline at end of file
diff --git a/AppData/result5.txt b/AppData/result5.txt
new file mode 100644
index 0000000..58fec93
--- /dev/null
+++ b/AppData/result5.txt
@@ -0,0 +1,2 @@
+123
+0.5455
\ No newline at end of file
diff --git a/AppData/result6.txt b/AppData/result6.txt
new file mode 100644
index 0000000..6911ace
--- /dev/null
+++ b/AppData/result6.txt
@@ -0,0 +1,2 @@
+123
+0.5365
\ No newline at end of file
diff --git a/AppData/result7.txt b/AppData/result7.txt
new file mode 100644
index 0000000..3b2f75a
--- /dev/null
+++ b/AppData/result7.txt
@@ -0,0 +1,2 @@
+123
+0.0020
\ No newline at end of file
diff --git a/AppData/result8.txt b/AppData/result8.txt
new file mode 100644
index 0000000..fb99623
--- /dev/null
+++ b/AppData/result8.txt
@@ -0,0 +1,2 @@
+1111
+0.0100
\ No newline at end of file
diff --git a/AppData/result9.txt b/AppData/result9.txt
new file mode 100644
index 0000000..3b2f75a
--- /dev/null
+++ b/AppData/result9.txt
@@ -0,0 +1,2 @@
+123
+0.0020
\ No newline at end of file
diff --git a/AttackAlgorithms/BruteForceAttackAlgorithm.py b/AttackAlgorithms/BruteForceAttackAlgorithm.py
index 944e95e..1eb738b 100644
--- a/AttackAlgorithms/BruteForceAttackAlgorithm.py
+++ b/AttackAlgorithms/BruteForceAttackAlgorithm.py
@@ -97,13 +97,10 @@ class BruteForceAttackAlgorithm():
         
             #Compare passwords to check if it has cracked
             if(hash == self.hash_to_crack):
-                print(f"Found Password: {password}")
-                
                 #stops and prints timer
                 self.end = time.time()
                 self.time = self.end - self.start
-                print('{:.4f} seconds'.format(self.time))
-
+                #saves result to file
                 self.save_output(password)
                 self.found.set()
  
@@ -147,7 +144,6 @@ class BruteForceAttackAlgorithm():
     returns: none
     """
     def main(self):
-        print(" -= Starting brute force =- ")
         self.brute_force()
         
             
diff --git a/AttackAlgorithms/__pycache__/BruteForceAttackAlgorithm.cpython-38.pyc b/AttackAlgorithms/__pycache__/BruteForceAttackAlgorithm.cpython-38.pyc
index e9813cf3c3f96bc86fb442f95588584f6285ca23..dcdd3951d7376c0a28ad7156ebb0d5f21cedfd55 100644
GIT binary patch
delta 353
zcmX>nc}apVl$V!_fq{WRa-w+BFX4@R0?eH8&P9pI*{MbGo7I^=v+!(VU|^_WOkvDs
zDoUHI#-UrERKmJ|bs<9yLp)mzLly|LOMrN+H4F<lYM2%>GBVUKWN|LwTFAi2kirnm
zP{Liqki}EOki`q4#TlBJTo_`_YFTSoL1NjgMUx;b35HtM8m1bCEWR36Nd|F-TDBU7
z1^hLPDa;ZKHEau+7#RwyQWzwH88lh^iWnIf7^+x9L)>&NiWC_b7&HYYYjLXb7x6PN
zFck5D2wnyThRL~{xpJlq3=EMB3=G8zAfGaEFmiz~BL_1V6Bi@j<UgFZ8BHhO;L>BP
zoy^W1Daix!Fv9`{nDdK7LB=x{Sx;WTEz3IzWDpa`AjT@W$&JiXlb><>af7TVvIf~|
PGufWUgi&R32~QLNSw=}9

delta 501
zcmca4aZZvil$V!_fq{YHS08UutH?$^0cK7G=c2^q?9?KK&FajbS$M86Ffi0GrZ8qR
z6}3!O<It^dC}B-uu3?(ZFqf&Bk&&T<Z2{Xth8l)=_8NvP5ay5o@z_dOQ&<*o)-YtT
zEo20#t6^BcRl~H9k&&T>A&Ywf&q4-9h7^Wih7#TyhAh4shAe&%EzZ!)<iZeZR?Aw$
z3KGj^E!qHKNifv1)-csDL}Urnuu3wBGt{!xFf0(PVN79_V5nhR$i&D{I0Iy$CYxUo
zBLf3N6>DgSo32HbfLnfPUW!6MVsUYKeo=~*LKR=Nm7YmjtwM2Xa(-S)agibe1B0f}
z<X0T3a<^CuiZb&`iuf5A7>f8n1TO;v!!5S7{G!~%lF4$Mxk}~?3=EMB3=G98pnzlI
zVB`W}Mh<2!Mm`W`6qvk{^ERXT<W?>{#)ipTxFT~z7#J8z7*b&2zzFlZCX-*4l!C58
za7kiONoHQULQ+v_Nvc9xeo=C&g06xlQ;{*q3AP|Y5=02W31N`4SaK6H^QMB_!UA#&
jBL`!Z+~h`PsmWQ~e%v5;7J;?eO+L(R!l*v^2X_<zNTqWX

diff --git a/AttackAlgorithms/__pycache__/DictionaryAttackAlgorithm.cpython-38.pyc b/AttackAlgorithms/__pycache__/DictionaryAttackAlgorithm.cpython-38.pyc
index 536f3abf7bd80fe79e64fabbcb2253894f9dab36..017b382c559c03ef386c268f988aaea0db6a1980 100644
GIT binary patch
delta 68
zcmaDU{92eVl$V!_fq{YH?lY0365fe?M;Vt-ywb;{p}9GU(TI^V-nl3-IXkr|e)C+W
Zy{wGPlcPBnGiFTw&#{70Zt@CFM*!=37FhrQ

delta 65
zcmaDY{8E@Nl$V!_fq{V`Gng;w56?utql`-@Ug_JM!f3?Eso-3cn4Fzjq_BBD(_U6a
Wrpd7!iy6}=GjgtAl%2ea(-8oVzZ3`n

diff --git a/AttackAlgorithms/__pycache__/HybridAttackAlgorithm.cpython-38.pyc b/AttackAlgorithms/__pycache__/HybridAttackAlgorithm.cpython-38.pyc
index 4d7b257640ad0ef285e8c36ef0b3c1c0e958acbe..d840adcb44ed8f9669528620fd80b7d397485cb1 100644
GIT binary patch
delta 183
zcmdlixl)oZl$V!_fq{Wxf`@1lztBd$A55I_&P9pI*{MbGoB5gJS$Q@vFfi0GWHGof
z#4ed!#i3+T!?J*BAww-o4a)-N6vl;&wX8J^3s@F1)UwsEEnux-UC7ADP{X!>Z6QM~
zYYl4+Ll%2BQxRJU$K*R4s*D_ynK%<BXL4$>-(oE&%FHX7JejjcKndgoMlL2UCKg66
kCJv^_hFq^1nI_9}*D{(;p3SYq*fMz^_hv@E$wfSl0N6n;SpWb4

delta 201
zcmZ1}xml7gl$V!_fq{WRHHj~&R&XQV4<=3p=c2^q?9?KK&HT*qtUNmy7#M08vKU+#
zV%JQr;!tuZVX9$iW@KcjVOhYukfD~PhGhXu3gbe?TGkqd1*{7hYT0Vo7O>T@E(EDz
zTfn}Mp_a9VwT2;!Bb%v+t%Pav6%JKKrpdoJ64-CC78GUXl}wJ})SBGQ*(0O^atb3C
zBNr13BNr0~69?mDb*|T}j6950%9Hb1#U|@=Co>vNp2)4l*gSa)_hv@k$r(J30NiOY
A^Z)<=

diff --git a/AttackAlgorithms/__pycache__/RulebasedAttackAlgorithm.cpython-38.pyc b/AttackAlgorithms/__pycache__/RulebasedAttackAlgorithm.cpython-38.pyc
index 4dec736bcba875dcd3b2539c77d4c7ffdfcffa7c..f706e5178d0bb5aa5c8f4369b6f792bb727c52a4 100644
GIT binary patch
delta 194
zcmaDOIZu)=l$V!_fq{YHT(ww|pwLFXZ;YJr&P9pI*{MbGn|YZESos_n85n99vKU+#
zCNRbtP3~sjVN}DsfIWqCA!99T4Z{MCg$%W9HEatwYgiXDGBVV#E#O+nP|I4wTEmdV
zoy}ClR>G6QHF+Y3GBZyK_vGyy>Wn;-?{mmb*5C}D+{CHEev7rBC^N5Q@-og2MyJX8
wT!xd=xNh^-GcYg|^MG8&$i+C>kGq%AX7U|wCB}})|G8H(n{aSWUd`hO0JI%6Y5)KL

delta 293
zcmbOy`9_j2l$V!_fq{WxbqsIPX5o!|-xxU+oQo2Zvr~%{HuEwSu=2$)GBDIIWHGof
zOkj-lo7~O5!>@$BhB<{(oS~VKk)eh;g)5t>=w1nX3O9tmfFp%xA!99T4Z{M?g$%W9
zHEavGYFHP7)Uqw$UdT|(TEkkykj0bDRK!-op29o1ltY=BJ%w-bYz}oVe!n6{1_p*(
zj5)U$OK&lz++s}r#i&vw%D}+zi!rW9o`HcOO3K{S%pfr-IWZ|YB{45EH3vc(8(5e|
zaTe$2rj}%6=A}=5z!A*GT2PdkS2Ed%Q+0A2X9uIl<ma4*%sfmSlSR4i@wPB9FckBE
he9y?mG>N;H(Q<Mhw-V#D$s4&>GFx&8O^)Sp1OS4@PPza9

diff --git a/GUIDesign.py b/GUIDesign.py
index 928a03f..6928c0b 100644
--- a/GUIDesign.py
+++ b/GUIDesign.py
@@ -12,7 +12,6 @@ import os
 import multiprocessing
 from multiprocessing import Process, Event
 import random
-import psutil
 import subprocess
 
 #PyQt6 imports
@@ -102,9 +101,9 @@ class BruteForceWorker(QRunnable):
         with open(filename, "r") as result:
             for idx, data in enumerate(result): 
                 if(idx == 1):
-                    self.output.append(f" {data} sec")
+                    self.output.append(f"\t -= {data} sec =-")
                 else:
-                    self.output.append(f" Password: {data}")
+                    self.output.append(f"\t -= Password found: {data} =-")
     
     """
     Name: brute_force_cpu
@@ -115,6 +114,7 @@ class BruteForceWorker(QRunnable):
     def brute_force_cpu(self):
         #data with starting points
         data = self.split_data()
+        
         #found event triggered when password found
         self.found = Event()
         #creates processes passing in needed data
@@ -124,7 +124,7 @@ class BruteForceWorker(QRunnable):
 
             #Creating process using the dictionary main function
             p = multiprocessing.Process(target=dictionary.main)
-            self.output.append(f" -= Starting process {i} =-")
+            self.output.append(f"\t-= Starting process {i} =-")
             self.process_list.append(p)
 
         #Starts processes
@@ -136,7 +136,7 @@ class BruteForceWorker(QRunnable):
 
         #Terminates processes
         for process in self.process_list:
-            print("Terminating")
+            print("\t-= Terminating =-")
             process.terminate()
 
         #Waits for processes to finish terminating
@@ -145,7 +145,8 @@ class BruteForceWorker(QRunnable):
             
         #Finishing up
         self.process_result()
-        self.output.append(" Attack Finished ")
+        self.output.append("\t-= Attack Finished =- ")
+        self.process_list.clear()
         print("Done")
     
     """
@@ -163,15 +164,30 @@ class BruteForceWorker(QRunnable):
     
     """
     Name: run
-    Description: Starts brute force attack using process amount with process terminatation(syncronisation)
+    Description: Starts brute force attack selecting the CPU and check for a hash_file
     Parameters: self 
     returns: none
     """
     def run(self):
-        self.output.append("-= Starting Brute Force Attack =-")
-        if(self.attack_options.cpu):
-            self.output.append(" Using CPU")
-            self.brute_force_cpu()
+        hash_file = list()
+        #if there is no has file then run single hash crack
+        if(self.attack_options.hash_file_location == ""):
+            self.output.append("-= Starting Brute Force Attack =-")
+            if(self.attack_options.cpu):
+                self.output.append(" Using CPU")
+                self.brute_force_cpu()
+        else:
+            with open(self.attack_options.hash_file_location) as file:
+                hash_file = [line.strip() for line in file]
+
+            for hash in hash_file:
+                self.attack_options.hash_value = hash
+                self.output.append("-= Starting Brute Force Attack =-")
+                if(self.attack_options.cpu):
+                    self.output.append("\tUsing CPU")
+                    self.brute_force_cpu()
+
+
 
 """
 Class Name: DictionaryWorker
@@ -307,11 +323,11 @@ class DictionaryWorker(QRunnable):
     Parameters: self 
     returns: none
     """
-    def pause_process(self):
-        print("Pauseing Application")
-        for id in self.pid:
-            p = psutil.Process(id)
-            p.suspend()
+    # def pause_process(self):
+    #     print("Pauseing Application")
+    #     for id in self.pid:
+    #         p = psutil.Process(id)
+    #         p.suspend()
         
     """
     Name: resume_process
@@ -319,23 +335,36 @@ class DictionaryWorker(QRunnable):
     Parameters: self 
     returns: none
     """
-    def resume_process(self):
-        print("Resuming Application")
-        for id in self.pid:
-            p = psutil.Process(id)
-            p.resume()
+    # def resume_process(self):
+    #     print("Resuming Application")
+    #     for id in self.pid:
+    #         p = psutil.Process(id)
+    #         p.resume()
        
     """
     Name: run
-    Description: Starts dictionary attack selecting the CPU
+    Description: Starts dictionary attack selecting the CPU and check for a hash_file
     Parameters: self 
     returns: none
     """
     def run(self):
-        self.output.append("-= Starting Dictionary Attack =-")
-        if(self.attack_options.cpu):
-            self.output.append(" Using CPU")
-            self.dictionary_cpu()
+        hash_file = list()
+        #if there is no has file then run single hash crack
+        if(self.attack_options.hash_file_location == ""):
+            self.output.append("-= Starting Dictionary Attack =-")
+            if(self.attack_options.cpu):
+                self.output.append(" Using CPU")
+                self.dictionary_cpu()
+        else:
+            with open(self.attack_options.hash_file_location) as file:
+                hash_file = [line.strip() for line in file]
+
+            for hash in hash_file:
+                self.attack_options.hash_value = hash
+                self.output.append("-= Starting Dictionary Attack =-")
+                if(self.attack_options.cpu):
+                    self.output.append("\tUsing CPU")
+                    self.dictionary_cpu() 
 
 """
 Class Name: HybridWorker
@@ -487,15 +516,29 @@ class HybridWorker(QRunnable):
 
     """
     Name: run
-    Description: Starts hybrid attack selecting the CPU
+    Description: Starts hybrid attack selecting the CPU and check for a hash_file
     Parameters: self 
     returns: none
     """
     def run(self):
-        self.output.append("-= Starting Hybrid Attack =-")
-        if(self.attack_options.cpu):
-            self.output.append(" Using CPU")
-            self.hybrid_cpu()
+        hash_file = list()
+        #if there is no has file then run single hash crack
+        if(self.attack_options.hash_file_location == ""):
+            self.output.append("-= Starting Hybrid Attack =-")
+            if(self.attack_options.cpu):
+                self.output.append(" Using CPU")
+                self.hybrid_cpu()
+        else:
+            with open(self.attack_options.hash_file_location) as file:
+                hash_file = [line.strip() for line in file]
+
+            for hash in hash_file:
+                
+                self.attack_options.hash_value = hash
+                self.output.append("-= Starting Hybrid Attack =-")
+                if(self.attack_options.cpu):
+                    self.output.append("\tUsing CPU")
+                    self.hybrid_cpu() 
 
 """
 Class Name: RuleBasedWorker
@@ -651,14 +694,28 @@ class RuleBasedWorker(QRunnable):
 
     """
     Name: run
-    Description: Starts rule based attack selecting the CPU
+    Description: Starts rule based attack selecting the CPU and check for a hash_file
     Parameters: self 
     returns: none
     """
     def run(self):
-        if(self.attack_options.cpu):
-            self.output.append(" Using CPU")
-            self.rulebase_cpu()
+        hash_file = list()
+        if(self.attack_options.hash_file_location == ""):
+            self.output.append("-= Starting Rule-Based Attack =-")
+            if(self.attack_options.cpu):
+                self.output.append(" Using CPU")
+                self.rulebase_cpu()
+        else:
+            with open(self.attack_options.hash_file_location) as file:
+                hash_file = [line.strip() for line in file]
+
+            for hash in hash_file:
+                
+                self.attack_options.hash_value = hash
+                self.output.append("-= Starting Hybrid Attack =-")
+                if(self.attack_options.cpu):
+                    self.output.append("\tUsing CPU")
+                    self.rulebase_cpu() 
 
 """
 Class Name: RainbowTableWorker
@@ -669,13 +726,61 @@ class RainbowTableAttack(QRunnable):
     def __init__(self, attack_options, output):
         self.attack_options = attack_options
         self.output = output;
+        self.filename = "C:\\Users\\ethan\\OneDrive\\Desktop\\Year3\\DSP\\Password_Cracker_App\\Rainbowcrack\\start.bat"
+        self.bat = None
+
+    """
+    Name: add_hash_to_bat
+    Description: Will add the input hash value to the bat file 
+    Parameters: self
+    returns: none
+    """
+    def add_hash_to_bat(self):
+        with open(self.filename, "r") as file:
+            self.bat = file.read()
+
+        self.bat= self.bat.replace("HASH", self.attack_options.hash_value)
+
+        with open(self.filename, "w") as file:
+            file.write(self.bat)            
+    
+    """
+    Name: remove_hash_from_bat
+    Description: Will add the HASH keyword back to the bat file for future attacks
+    Parameters: self
+    returns: none
+    """
+    def remove_hash_from_bat(self):
+        with open(self.filename, "r") as file:
+            self.bat = file.read()
+
+        self.bat = self.bat.replace(self.attack_options.hash_value, "HASH")
+
+        with open(self.filename, "w") as file:
+            file.write(self.bat)           
     
+    """
+    Name: rainbowtable_cpu
+    Description: Will start the rainbow table attack using RainbowCrack through a bat file
+    Parameters: self
+    returns: none
+    """
     def rainbowtable_cpu(self):
-        command = f"Rainbowcrack/rtgen -h {self.attack_options.hash}"
-        attack = subprocess.Popen()
+        #Add hash value to bat file
+        self.add_hash_to_bat()
+        #Start attack from a bat file
+        p = subprocess.Popen(self.filename, stdout=subprocess.PIPE, shell=True)
+        p.wait()
+        result = p.stdout.read()
+        #remove hash value from bat file
+        self.remove_hash_from_bat()
+        #process output of command prompt
+        self.output.append(result.decode())
+        self.output.append("-= Rainbow Crack output =-")
+
+
     
     def run(self):
-        #
         if(self.attack_options.cpu):
             self.output.append(" Using CPU")
             self.rainbowtable_cpu()
@@ -733,7 +838,9 @@ class Ui_App(object):
     """
     def setupUi(self, App):
         App.setObjectName("App")
-        App.resize(1012, 696)
+        App.setFixedSize(1012, 696)
+        
+        
         palette = QtGui.QPalette()
         brush = QtGui.QBrush(QtGui.QColor(0, 120, 215))
         brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern)
@@ -1148,6 +1255,7 @@ class Ui_App(object):
         elif(attack_selection == "Rainbow Table"):
             self.wordlistFrame.setEnabled(True) 
             self.charsetFrame.setEnabled(False)
+            self.attackOptionsBtn.setEnabled(False)
             self.wordlistLbl.setText("Rainbow table") 
             
         elif(attack_selection == "Markov Chain"):
@@ -1206,7 +1314,9 @@ class Ui_App(object):
         #Open file dialog box
         hash_file = QtWidgets.QFileDialog.getOpenFileName(None, 'Open password file', 'C:\\', '*.txt')
         #set text edit to wordlist location
-        self.hash_file_location = self.hashInputTxt.insertPlainText(hash_file[0])
+        self.hashInputTxt.insertPlainText(hash_file[0])
+        self.hash_file_location = hash_file[0]
+        print(self.hash_file_location)
         
     """
     Name: _browseWordlist
@@ -1336,11 +1446,10 @@ class Ui_App(object):
                 self.output.append(f"       - Rainbowtable: {self.attack_options.wordlist_location}")
                 self.output.append(f"       - Processes: {self.attack_options.core_count}")
 
-                pool = QThreadPool.globalInstance()
-                self.worker = RainbowTableAttack(self.attack_options, self.output)
+                rainbowtable=RainbowTableAttack(self.attack_options, self.output)
+                rainbowtable.run()
                 
-                pool.start(self.worker)
-
+        
             if(self.attack_options.attack_type == "Markov Chain"):
                 self.output.append(" Starting Attack ")
                 self.output.append(f"       - Hash: {self.attack_options.hash_value}")
diff --git a/Rainbowcrack/start.bat b/Rainbowcrack/start.bat
new file mode 100644
index 0000000..31af342
--- /dev/null
+++ b/Rainbowcrack/start.bat
@@ -0,0 +1,2 @@
+cd C:\\Users\\ethan\\OneDrive\\Desktop\\Year3\\DSP\\Password_Cracker_App\\Rainbowcrack
+rcrack.exe . -h HASH
\ No newline at end of file
diff --git a/test_data.txt b/test_data.txt
new file mode 100644
index 0000000..381793e
--- /dev/null
+++ b/test_data.txt
@@ -0,0 +1,2 @@
+40BD001563085FC35165329EA1FF5C5ECBDBBEEF
+011C945F30CE2CBAFC452F39840F025693339C42
\ No newline at end of file
-- 
GitLab