blackhole.py中函数修改报告
GitHub blackhole项目地址
https://github.com/dudeintheshell/blackhole/tree/master
函数修改
def telnetparse(input):
if "echo" in input and "-e" in input:
for ino in input.split(" "):
if '"' in ino:
if "\\x" in ino:
ino = ino.replace('"','').replace("\\x", "").replace("\r", "").replace("\n","")
return ino.decode("hex")
elif "'" in ino:
if "\\x" in ino:
ino = ino.replace("'",'').replace("\\x", "").replace("\r", "").replace("\n","")
return ino.decode("hex")
elif "\\\\x" in ino:
ino = ino.replace("\\\\x", "").replace("\r", "").replace("\n","")
return ino.decode("hex")
elif "echo " == input[:5]:
toout = input[5:]
if '"' in toout:
ino = ino.replace('"','').replace("\r", "").replace("\n","")
elif "'" in toout:
ino = ino.replace("'",'').replace("\r", "").replace("\n","")
else:
ino = toout
return ino
return None
该函数除不兼容外逻辑有纰漏,没有缩进,是一个bug
def telnetparse(input):#解析包含特定模式的输入字符串
if "echo" in input and "-e" in input:
for ino in input.split(" "):
if '"' in ino:
if "\\x" in ino:
ino = ino.replace('"','').replace("\\x", "").replace("\r", "").replace("\n","")
return bytes.fromhex(ino)
elif "'" in ino:
if "\\x" in ino:
ino = ino.replace("'",'').replace("\\x", "").replace("\r", "").replace("\n","")
return bytes.fromhex(ino)
elif "\\\\x" in ino:
ino = ino.replace("\\\\x", "").replace("\r", "").replace("\n","")
return bytes.fromhex(ino)
elif "echo " == input[:5]:
toout = input[5:]
if '"' in toout:
ino = ino.replace('"','').replace("\r", "").replace("\n","")
elif "'" in toout:
ino = ino.replace("'",'').replace("\r", "").replace("\n","")
else:
ino = toout
return ino
return None
#解析包含特定模式的输入字符串
旧式os.popen函数
os.popen()
Python 旧式函数
用于打开一个进程并与其进行交互。
被 subprocess 模块中的更强大和灵活的功能所取代。
操作:
os.popen() 打开一个到命令的管道,并返回一个与该命令交互的文件对象。你可以向这个对象写入数据(如果命令接受输入),也可以从它读取数据(如果命令产生输出)。
- 管道(Pipe):
在操作系统中,特别是Unix和Linux系统中,是一种用于进程间通信的机制。它允许一个进程(称为写进程)的输出直接作为另一个进程(称为读进程)的输入,而无需临时文件或其他形式的中间存储。
返回值:
os.popen() 返回一个文件对象,你可以像操作其他文件一样操作它。例如,你可以使用 read() 方法读取命令的输出,或者使用 write() 方法向命令发送输入。
示例:
import os
# 执行 "ls" 命令并读取输出
output = os.popen('ls').read()
print(output)
新式subprocess模块
subprocess
用于在新的进程中执行子进程(如 shell 命令、外部程序和脚本),并可以连接到子进程的输入/输出/错误管道,获取其执行结果。
- 进程,简单来说,就是操作系统为了执行某个程序而启动的一个“活动”。每当你打开一个新的程序或软件时,你的计算机就会为这个程序创建一个新的进程。这个进程会占用计算机的一部分资源,比如内存和处理器时间,来运行这个程序。
基本操作
创建子进程:使用 subprocess.Popen() 来创建一个子进程。这个方法非常灵活,可以接受很多参数来控制子进程的启动和执行。
import subprocess # 导入subprocess模块,用于创建新的进程,连接到它们的输入/输出/错误管道,并获取它们的执行结果
# 使用Popen函数创建一个子进程来执行'ls -l'命令,并将标准输出通过PIPE连接到父进程
process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)
#subprocess.PIPE是一个特殊的值,表示创建一个管道
与子进程交互:可以通过 Popen 对象的 stdin,stdout 和 stderr 属性与子进程进行交互。
# 通过调用communicate()方法,等待子进程完成并获取其标准输出和标准错误输出
# communicate()方法会阻塞,直到子进程执行完毕
# 返回值是一个包含两个元素的元组,第一个元素是子进程的标准输出,第二个元素是标准错误输出
output, error = process.communicate()
等待子进程完成:使用 wait() 方法可以等待子进程完成,并返回一个包含返回码的元组。
python
return_code = process.wait()
返回值
返回码:子进程执行完毕后,可以通过 returncode 属性或者 wait() 方法获取其返回码。通常,返回码为 0 表示程序正常退出,非 0 值表示出现了某种错误。
return_code = process.returncode # 在调用 wait() 之后可用
# 或者
return_code = process.wait() # 这个方法会阻塞,直到子进程完成
输出:如果子进程有标准输出或标准错误输出,可以通过 communicate() 方法获取。这个方法会返回一个包含两个元素的元组,第一个元素是标准输出,第二个元素是标准错误输出。
output, error = process.communicate()
Popen 对象:subprocess.Popen() 会返回一个 Popen 对象,这个对象包含了很多方法和属性,可以用来控制和管理子进程。
完整示例:
下面是一个简单的示例,展示如何使用 subprocess 模块执行一个命令,并获取其输出和返回码。
import subprocess
# 创建一个子进程来执行 'ls -l' 命令
process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# 与子进程交互,获取其标准输出和错误输出
output, error = process.communicate()
# 输出子进程的输出结果和错误(如果有的话)
print("Output:")
print(output.decode('utf-8')) # 将字节串解码为字符串
print("Error:")
print(error.decode('utf-8')) # 将字节串解码为字符串
# 等待子进程完成,并获取其返回码
return_code = process.returncode
print("Return code:", return_code)
注意:在实际应用中,你可能需要处理各种异常情况,例如命令不存在、执行失败等。此外,如果子进程需要很长时间才能完成,你可能需要考虑使用异步或线程来处理,以避免阻塞主程序。