blackhole.py中函数修改报告

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)

注意:在实际应用中,你可能需要处理各种异常情况,例如命令不存在、执行失败等。此外,如果子进程需要很长时间才能完成,你可能需要考虑使用异步或线程来处理,以避免阻塞主程序。

  • 36
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值